преобразовать адрес памяти в int - PullRequest
0 голосов
/ 27 февраля 2011

Я пытаюсь прочитать адреса памяти из исполняемого файла, работающего в памяти, а затем использовать эти адреса памяти для обхода структуры PE.

У меня возникли проблемы, потому что я не уверен, как преобразовать 4-байтовый массив символов в его int-эквивалент.

Вот мой код:

char buffer[4];
int e_lfanew = 60;

if(!ReadProcessMemory(pHandle, (me32.modBaseAddr + e_lfanew), buffer, 4, NULL))
{
    printf("ReadProcessMemory @ %x Failed (%d)\n", me32.modBaseAddr, GetLastError());
}

Адрес, по которому я читаю, в данном случае 0xE0000000, является смещением PE-заголовка. Я хочу взять адрес памяти, который я только что прочитал, и использовать его как смещение для повторного считывания из памяти процесса, но я не могу понять, как правильно преобразовать его в тип int.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011
 buffer[0]        | 
(buffer[1] <<  8) |
(buffer[2] << 16) |
(buffer[3] << 24)

или наоборот, в зависимости от того, является ли ваш старший байт буфером [0] или буфером [3]

0 голосов
/ 27 февраля 2011
int MemoryBufferToInt(char* buffer, int buffer_size) {
   int result;
   assert(buffer_size == sizeof(result));
   memcpy(&result, &buffer[0], sizeof(result));
   return result;
} 

В приведенном выше коде предполагается, что этот буфер был получен из процесса, поэтому порядок байтов в буфере памяти совпадает с порядком байтов обычного целого на вашей платформе.В противном случае вы можете легко создать целое число для определенного порядка байтов, если знаете, каков порядок байтов в буфере.

Обратите внимание, что вы можете просто использовать static_cast<char*>(&result) вместо буфера в качестве параметра дляфункция, которая извлекает содержимое буфера.

...