Найти адрес в исполняемом файле x64 из адреса памяти

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

Как определить базовый адрес, если я хочу применить формулу к исполняемому файлу x64?

Для x86 это 0x400000. Мое предположение заключалось в том, что это происходит из поля IMAGE_BASE необязательного заголовка PE. Однако это поле содержит значение 0x140000000 для x64. Используемые адреса в двоичном файле x64 на самом деле намного меньше, чем адреса в двоичном файле x86.


person Stefan    schedule 07.04.2018    source источник
comment
Для x86 это 0x400000 - это, конечно, неверно. может быть любой адрес. если вы спросите об этом для окон - вы можете использовать, например, [K32]EnumProcessModules. из более эффективного (но недокументированного) чтения базы изображений exe (если вам нужен только exe) из процесса PEB   -  person RbMm    schedule 08.04.2018
comment
stackoverflow.com/ вопросы/26572459/   -  person Hans Passant    schedule 08.04.2018
comment
@HansPassant Спасибо. Однако я пытаюсь определить базовый адрес, фактически не запуская exe.   -  person Stefan    schedule 08.04.2018
comment
en.wikipedia.org/wiki/Address_space_layout_randomization   -  person Hans Passant    schedule 08.04.2018
comment
Может быть, я должен быть более ясным в том, что я хочу сделать. Учитывая дизассемблированный исполняемый файл Windows, я пытаюсь найти ссылочные строки и импортированные функции (через таблицу адресов импорта). Для этого требуется вычислить местоположение файла из RVA. Он работает для машинного кода x86, используя расчет в связанном посте. Наверняка есть способ заставить его работать и на x64?   -  person Stefan    schedule 09.04.2018


Ответы (1)


Я пытаюсь определить базовый адрес без фактического запуска exe.

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

Это не относится к динамически подключаемым библиотекам. У них есть ImageBase, но если эта позиция уже занята, она будет динамически загружена где-то еще во время выполнения.

По этой причине, если вы говорите о процессе с включенным ASLR или о DLL, то, о чем вы спрашиваете, невозможно.

person GuidedHacking    schedule 20.04.2020