map-файл после компиляции

Тема в разделе "WASM.BEGINNERS", создана пользователем SnugForce, 8 окт 2005.

  1. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Простой вопрос.

    У меня есть map файл к скомпиленному проекту на Delphi. Там есть какие-то адреса функций и методов классов, да и вообще куча всякой инфы. К примеру прога VMProtect по этому map-файлу находит адреса функций по их именам. А как сделать это в своей проге? Никак не могу сопоставить адрес в памяти и адрес в map-файле. Есть конечно подозрения, то надо изучить PE-формат...
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    SnugForce

    Ну смотри, простой map:
    Код (Text):
    1.  
    2.  Start         Length     Name                   Class
    3.  0001:00000000 000000266H .text                  CODE
    4. ...
    5.   Address         Publics by Value
    6.  
    7.  0001:00000000       start




    0001 - номер секции файла.

    00000000 - относительное смещение (RVA кажется)



    Берём адрес загрузки PE + адрес проекции секции .text и складываем с адресом в map - и получаем адрес метки start в памяти.



    Мог и ошибиться.
     
  3. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Мне не адрес в памяти нужен, а позицию в файле. Адрес функции я могу прямо из проги определить.
     
  4. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    2 SnugForce:

    Читай про PE формат (что такое секции, ImageBase и т.д.) - у каждой секции есть инфа с какой позиции в файле (и с какого адреса) она начинается. Т.е. позиция в файле вычисляется так:

    1. Из адреса вычитается ImageBase

    2. Находится секция, которой принадлежит адрес из п.1.

    3. К физическому смещению секции из п.2. добавляешь разницу между п.1 и адресом начала секции.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine




    Ты определись сначала, а потом спрашивай.
     
  6. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Да в принципе уже опеределился :)

    Надо по мап файлу найти в файле exe нужный код функции...

    У просто думал, что там более прямо указывается на позицию в файле :) теперь понял, что PE рулит...
     
  7. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Хм проанализировал позицию в файле и то, что указанно в map файле. Получается следующее:

    Если к числу, указанному в map прибавить 400h то получим позицию в файле.

    Опять вопрос. Откуда число взялось? И откуда его брать из файла exe, в map такого нет.
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    SnugForce

    Товарищ!
     
  9. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Уже читаю... Привычка дурная - нахрапом делать... Спасибо :)
     
  10. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Кажись понял. Просьба проверить..

    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 т.е. файловое смещение секции кода.