Как распечатать шестнадцатеричные значения, хранящиеся в порядке байтов? - PullRequest
0 голосов
/ 03 января 2019

Кажется, я в беспорядке из-за 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:

enter image description here

1 Ответ

0 голосов
/ 04 января 2019

@ Аркуу был прав, это не проблема с порядком байтов.

Обновление

Мне не понравилось решение, приведенное ниже.Я чувствовал, что в этом было что-то большее, чего мне не хватало.Я должен был использовать IMAGE_DOS_HEADER вместо IMAGE_NT_HEADERS, поскольку я проверял заглушку DOS, а не PE-заголовок.

IMAGE_DOS_HEADER header;
...
printf("Signature: %#x\n", header.e_magic);

Я решил это с помощью [_byteswap_ulong] [1] примерно так: #include ... printf ("Подпись:% # lx \ n", _byteswap_ulong (header.Signature));Этот макрос обратит порядок байтов.Согласно [docs] (https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_image_nt_headers) подпись является: 4-байтовая подпись, идентифицирующая файл как образ PE. Байты "PE \ 0 \ 0". В системе с прямым порядком байтов это будет в обратном порядке,как и в моем случае. Использование макроса `_byteswap_ulong` инвертирует байты и возвращает ожидаемое мной значение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...