Простой вопрос. У меня есть map файл к скомпиленному проекту на Delphi. Там есть какие-то адреса функций и методов классов, да и вообще куча всякой инфы. К примеру прога VMProtect по этому map-файлу находит адреса функций по их именам. А как сделать это в своей проге? Никак не могу сопоставить адрес в памяти и адрес в map-файле. Есть конечно подозрения, то надо изучить PE-формат...
SnugForce Ну смотри, простой map: Код (Text): Start Length Name Class 0001:00000000 000000266H .text CODE ... Address Publics by Value 0001:00000000 start 0001 - номер секции файла. 00000000 - относительное смещение (RVA кажется) Берём адрес загрузки PE + адрес проекции секции .text и складываем с адресом в map - и получаем адрес метки start в памяти. Мог и ошибиться.
2 SnugForce: Читай про PE формат (что такое секции, ImageBase и т.д.) - у каждой секции есть инфа с какой позиции в файле (и с какого адреса) она начинается. Т.е. позиция в файле вычисляется так: 1. Из адреса вычитается ImageBase 2. Находится секция, которой принадлежит адрес из п.1. 3. К физическому смещению секции из п.2. добавляешь разницу между п.1 и адресом начала секции.
Да в принципе уже опеределился Надо по мап файлу найти в файле exe нужный код функции... У просто думал, что там более прямо указывается на позицию в файле теперь понял, что PE рулит...
Хм проанализировал позицию в файле и то, что указанно в map файле. Получается следующее: Если к числу, указанному в map прибавить 400h то получим позицию в файле. Опять вопрос. Откуда число взялось? И откуда его брать из файла exe, в map такого нет.
Кажись понял. Просьба проверить.. SECTION TABLE 01 CODE VirtSize: 00061C8Ch VirtAddr: 00001000h raw data offs:00000400h raw data size:00061E00h relocation offs:00000000h relocations: 00000000h line # offs:00000000h line #'s: 00000000h characteristics: 60000020h CODE EXECUTE READ ALIGN_DEFAULT(16) raw data offs это наверное DWORD PointerToRawData т.е. файловое смещение секции кода.