2014-11-11 2 views
0

У меня есть вопрос о смещениях в файлах. Например, расширение «.exe»/файл, когда вы открываете такой файл.Файлы адресов памяти

handle = open('file.exe', mode='rb') 

Теперь, когда вы пытаетесь получить доступ к 10-му байту, вы можете использовать функцию поиска.

handle.seek(10, 0) 

Множество значений в заголовке PE является РОВ, а это означает ImageBase + ООА этого смещения при загрузке в памяти. Проблема в том, что вы не можете искать это значение. Например:

. Раздел istata имеет виртуальный адрес (RVA) и необработанный адрес (на основе изображения). Теперь с помощью предыдущего метода вы можете использовать необработанный адрес для чтения с правильным смещением. Для множества значений предоставляется только RVA, для которого он не работает.

Открытие файла таким образом начинается с 0, когда загружается в память, в большинстве случаев база данных равна 0x00400000. Есть ли способ загрузить файл в память и, таким образом, использовать точные значения смещения, когда он загружается в память? Итак, вместо 0 файл начинается с базы данных, чтобы вы могли искать RVA?

с Направлениями С уважением,

+0

Обратите внимание, что вы не «загружаете [исполняемый] файл в память» - ОС работает. Я думаю, что нет окончательного ответа на этот вопрос - см. [Рандомизация адресной памяти] (https://en.wikipedia.org/wiki/Address_space_layout_randomization) – goncalopp

ответ

0

Если вы находитесь на Windows, вы могли бы загрузить изображение загрузчика (т.е. распаковки) РЕ изображения в память для вас. Затем вы сможете использовать RVA напрямую, относительно базы изображений, чтобы найти нужные вам данные.

Другой вариант - реализовать несколько функций для анализа таблицы заголовков и разделов PE. В таблице разделов содержится информация о каждом разделе в PE-файле, например, где он находится в файле (смещение исходного файла) и где он должен быть распакован в памяти относительно базового адреса изображения. Через таблицу разделов вы можете написать функцию, которая преобразует RVA в соответствующее исходное смещение файла.

Единственное, что вы должны знать, это то, что не каждый RVA может быть отображен обратно в смещение файла. Например, во многих разделах в конце есть область с нулевыми инициализированными данными, которая явно не представлена ​​в двоичном файле. Вместо этого загрузчик выгружает такие секции нулями в соответствии с виртуальным размером каждого раздела (также находящимся в записях таблицы разделов) во время загрузки.

Смежные вопросы