ReadProcessMemory читает память назад? - PullRequest
1 голос
/ 03 января 2012

При использовании ReadProcessMemory для чтения памяти исполняемого файла первые два байта, которые я получаю, меняются местами. Код:

SIZE_T dataRead;
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER) malloc(1);
ReadProcessMemory(process, (LPVOID)addr, dosHeader, 2, &dataRead);
printf("%x\n", dosHeader->e_magic);

Вышеуказанные выходы 5A4D вместо 4D5A. С чего бы это? Может ли это быть endianess?

Заранее спасибо.

1 Ответ

3 голосов
/ 03 января 2012

Да, это связано с порядком байтов. Первый байт в файле 0x4d, второй байт 0x5a. Когда вы печатаете их, используя %x, они интерпретируются как порядковый номер с небольшим порядковым номером, поэтому байты меняются местами при печати. Рассмотрим в качестве отдельного примера следующую программу:

#include <cassert>
#include <cstdio>

int main()
{
    assert(sizeof(unsigned) == 4);

    char bytes[4] = { 0x12, 0x34, 0x56, 0x78 };
    std::printf("%x\n", *reinterpret_cast<unsigned const*>(bytes));
}

В системе с порядком байтов с прямым порядком байтов вывод будет 78563412. (В этом примере программа игнорирует потенциальные проблемы с выравниванием; поскольку вы используете Visual C ++, проблем не будет.)

Обратите внимание, что вы превышаете свое однобайтовое распределение (вы malloc(1), но читаете два байта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...