Как я могу увидеть содержимое буфера и сравнить с файлом DLL?

Я пытаюсь написать DLL-инжектор с nativeApi. По этой причине я написал этот код. Функция NtReadFile читает что-то, но я не вижу ничего, кроме первого значения FileReadBuffer. Кроме того, я ничего не знаю о том, как DLL смотрит в буфер.

(1) Как я могу сравнить буфер и файл DLL?

(2) Как я могу быть уверен, что код работает правильно.

(3) И, пожалуйста, скажите мне мою ошибку в коде.

bool Injector::initiationDll(const std::string& dllPath)
{
if (!isDllExist(dllPath))
{
printf("Dll not found!\n");
return false;
}
else
{
printf("LibraryPath: %s\n", dllPath);

NTSTATUS status; HANDLE lFile;

OBJECT_ATTRIBUTES objAttribs = { 0 }; UNICODE_STRING unicodeString;
std::string dllPathWithprefix = "\\??\\" + dllPath;

std::wstring wString = std::wstring(dllPathWithprefix.begin(), dllPathWithprefix.end()); PCWSTR toPcwstr = wString.c_str();
RtlInitUnicodeString(&unicodeString, toPcwstr);
InitializeObjectAttributes(&objAttribs, &unicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL);
objAttribs.Attributes = 0;

const int allocSize = 2048;
LARGE_INTEGER largeInteger;
largeInteger.QuadPart = allocSize;

IO_STATUS_BLOCK ioStatusBlock;

status = NtCreateFile(
&lFile,
GENERIC_READ | FILE_READ_DATA | SYNCHRONIZE,
&objAttribs,
&ioStatusBlock,
&largeInteger,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);

if (!NT_SUCCESS(status)) {
printf("CreateFile failed..\n");
return false;
}
else {
printf("Library Handle : %p\n", lFile);

DWORD fileSize = getDllSize(dllPath);

if (fileSize == 0)
{
printf("File size is zero.\n");
return false;
}
else
{
printf("File size : %d byte.\n", fileSize);

PVOID FileReadBuffer = VirtualAlloc(NULL, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

if (!FileReadBuffer)
{
printf("\nError: Unable to allocate memory(%d)\n", GetLastError());

status = NtClose(lFile);
return false;
}
else {
printf("Allocate %d byte for buffer.\n", fileSize);

status = NtReadFile(
lFile,
NULL,
NULL,
NULL,
&ioStatusBlock,
FileReadBuffer,
sizeof(FileReadBuffer),
0, // ByteOffset
NULL);

if (!NT_SUCCESS(status))
{
printf("Unable to read the dll...  : %d\n", GetLastError());
return false;
}
else {
status = NtClose(lFile);
for (int i = 0; i < sizeof(fileSize); i++)
{
//wprintf(L"%p   :   %s\n", FileReadBuffer, FileReadBuffer);
}
}
}
}
}
}
}

введите описание изображения здесь
введите описание изображения здесь

-2

Решение

status = NtReadFile(
lFile,
NULL,
NULL,
NULL,
&ioStatusBlock,
FileReadBuffer,
sizeof(FileReadBuffer), // !!!!!
0, // ByteOffset
NULL);

поэтому вы читаете sizeof (FileReadBuffer) — только 4 или 8 байтов. Я полагаю, что вы используете мой совет от Вот

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]