Соответствие адресов в памяти и файле

Тема в разделе "WASM.RESEARCH", создана пользователем defrag, 10 авг 2004.

  1. defrag

    defrag New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2004
    Сообщения:
    15
    Допустим дебажу я досовскую прогу и вижу в ней какой-нибудь условный переход который мне нужно исправить на безусловный.

    Но загвоздка в том, что в памяти это переход находится по адресу допустим 2A30:31F5, а в файле скажем по смещению 156AE.

    Пока такие места нахожу в Hiew по сигнатуре т.е. смотрю как это выгляди в шестнадцатиричном коде и ищу в файле.

    Пока прокатывает.



    НО бывает возникает проблема другого толка.

    Допустим у нас не переход а межсегментный вызов процедуры.

    Под софтайсом он выглядит

    Push 0080

    Call 2E85:0287

    а в файле

    Push 0080

    CALL 0FA8:0287

    налицо различие



    Вопрос: наиболее просто находить такие сответствия?
     
  2. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Что-то мне подсказывает, что тута в дело вступают релоки.

    А что для вас есть "наиболее просто"?
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    defrag



    Посмотрите ОПКОД команды Call 2E85:0287 в отладчике
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Все соответствия прописаны в Relocation Table исполнямого файла.
     
  5. researcher

    researcher New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2005
    Сообщения:
    45
    Адрес:
    Russia
    Код команды call far - 9Ah, потом идет смещение и сегмент.
    Так как смещение под софтайсом и в файле одинаковое для данного случая можешь искать в Hiew подстроку:
    9A8702
    Если задействовать в поиске команду push 0080 (она тоже одинакова), то в зависимости от ее кодирования (учета размерности заносимого в стек операнда) строка для поска будет:
    6A809A8702 - если в стек заносится байт, или:
    6880009A8702 - если в стек заносится слово.