Загрузка библиотеки по фиксированному адресу

Тема в разделе "WASM.WIN32", создана пользователем profile003, 15 фев 2008.

  1. profile003

    profile003 New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2007
    Сообщения:
    16
    Можно ли загрузить системную библиотеку по фиксированному адресу?

    Хочу cделать вычисление контрольной суммы участка кода библиотеки в одном процессе и передать ее в другой, но так как библиотека может быть загружена по произвольному адресу будут изменены релоки и контрольная сумма измениться :[
     
  2. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Можно но сложно и не корректно, даже в висте (где есть ASR) все равно по разным адресам дллки грузяться только per session (т.е. они одинаковые во всех процессах до следующего ребута)
     
  3. profile003

    profile003 New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2007
    Сообщения:
    16
    а это относится к системным библиотекам или ко всем? (порядок загрузки библиотек не меняется)
     
  4. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Можно попробовать обрабатывать релоки самому - если релок, то исключить из суммы
     
  5. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Не правильно, если релок - отнимать imagebase от данных в памяти, т.к. можно пропатчить конкретный адрес.
    В целом, берешь релоки, они по страницам раскиданы. Если прога не кулхацкерская, релоки можешь прямо в памяти и читать.
    Идешь сразу по релокам и по исходному буфферу. Хешируешь кусок от релока до релока. Во временную переменню пишешь 4 (8 для 64 бит) байт исходных данных накрытых релоком и отнимаешь от переменной imagebase dll'ки. Хешируешь эти 4 (8) байт, идешь дальше.
    Собственно и все.

    Edit: исходный хеш (для проверки с подсчитанным) можешь прямо из DLL'ки куском считать, при таком подходе хеш из файла и хеш в памяти будет совпадать.
    Edit2: Если хочешься сделать убер алгоритм, можешь поддерживать все виды релоков, хотя на самом деле используется аж 2 типа (один для 32 бит, другой для 64).
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Joes
    Зачем лишний гемморой с разбором всех типов релоков, которых туча. Если будет патчинг "конкретного адреса" то этот адрес в подавляющем большинстве случаев будет в таблице импорта, а не в рефералах на неё. Конечно то, что ты говоришь правильно, но гемморойно для универсала.
     
  7. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    asmfan: Ну и чего там гимморойного? алгоритм как алгоритм. Да и релоков достаточно 1 тип для платформы поддерживать. Кроме того, патчат не только импорты. Скажем для игрушек, патчат еще и логику.
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Joes документация по формату читали?

    для х64
    Для х86
    Общее
    Этого мало для геммороя? Другое дело, что линкеры ленятся использовать возможности формата и ограничиваются тем, чем вы описали, но где гарантия, что не выйдет новый нормальный линкер?
     
  9. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    asmfan
    А вы прогоняли тулзу, которая проверяла какие _конкретно_ типы релоков юзаются на куче файлов? Я - да. :)

    Правка: А о чем собственно речь идет? Я человеку подсказал не сложный способ получение CRC области памяти принадлежащей DLL загружаемой по нефиксированному адресу. Алгоритм прямолинейный как доска и работает, проверено.
     
  10. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Joes
    Да я ж говорю, что правильно вы всё говорите! Я предложил простой метод, универсальный - просто пропускать. Вы предложили более надёжный, но линкерозависимый (если конечно автор не отчаится все типы релоков парсить, либо учитывать специфику конкретного линкера)...

    П.С. А что за тулза такая? Самописная и/или опенсорцная? И какова статистика по линкерам? Кто пользует формат по полной? Если честно, то я тоже наблюдал только по 1му типу на 86/64 платформу )
     
  11. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    asmfan
    Тулза самописная. Рекурсивно обходит дерево каталогов и для бинарников разбирает релоки. Скажем для папки винды (32 битной), используется два типа релоков:
    IMAGE_REL_BASED_ABSOLUTE
    IMAGE_REL_BASED_HIGHLOW

    Для 64 битной:
    IMAGE_REL_BASED_ABSOLUTE
    IMAGE_REL_BASED_DIR64

    IMAGE_REL_BASED_ABSOLUTE ничего не делает (скипаем). HIGHLOW (32 бит) и DIR64 (64 бит) - прибавляем imagebase по нужному адресу.

    Собственно и все.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я реализовывал процессинг всех типов релоков для x86, геморроя никакого не встретил.