Кажется, я в беспорядке из-за Endianess.Моя машина 64-битная с процессором Ryzen 3.Отчеты с прямым порядком байтов.
Я пишу небольшую программу на C, которая пересекает виртуальную память процессов и анализирует заголовки MSDOS и проверяет наличие MZ в сигнатуре заголовка.
Взято из моего кода:
int pid = 10964;
DWORD_PTR addr = 0x7FF7BD730000;
MEMORY_BASIC_INFORMATION64 mbi;
IMAGE_NT_HEADERS header;
HANDLE pHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (pHandle == NULL)
{
printf("Error getting handle for process %i. Failed with error: %i", pid, GetLastError());
return -1;
}
/*
* Retrieve information on virtual address space
*/
BOOL vqeResult = VirtualQueryEx(pHandle, addr, &mbi, sizeof(MEMORY_BASIC_INFORMATION64));
if (!vqeResult)
{
printf("Error querying virtual memory: %i", GetLastError());
return -1;
}
PrintMemoryBasicInformation64(&mbi);
/*
* Read the DOS header
*/
BOOL rpmResult = ReadProcessMemory(pHandle, (LPCVOID)mbi.BaseAddress, (LPVOID)&header, sizeof(header), 0);
if (!rpmResult) {
printf("Error reading memory address: %i. Failed with error: %i", mbi.BaseAddress, GetLastError());
return -1;
}
Все работает хорошо, за исключением случаев, когда я пытаюсь напечатать подпись:
printf("Signature: %x", header.Signature);
Это дает неправильное шестнадцатеричное значение, которое по существу MZ
в обратном порядке:
Signature: 0x785a4d
Поскольку моя система имеет прямой порядок байтов, это имеет смысл, но как бы я распечатал это правильно?
Я приложил изображение, чтобы показать значение, хранящееся в headers.Signature
: