Можно ли загрузить системную библиотеку по фиксированному адресу? Хочу cделать вычисление контрольной суммы участка кода библиотеки в одном процессе и передать ее в другой, но так как библиотека может быть загружена по произвольному адресу будут изменены релоки и контрольная сумма измениться :[
Можно но сложно и не корректно, даже в висте (где есть ASR) все равно по разным адресам дллки грузяться только per session (т.е. они одинаковые во всех процессах до следующего ребута)
Не правильно, если релок - отнимать imagebase от данных в памяти, т.к. можно пропатчить конкретный адрес. В целом, берешь релоки, они по страницам раскиданы. Если прога не кулхацкерская, релоки можешь прямо в памяти и читать. Идешь сразу по релокам и по исходному буфферу. Хешируешь кусок от релока до релока. Во временную переменню пишешь 4 (8 для 64 бит) байт исходных данных накрытых релоком и отнимаешь от переменной imagebase dll'ки. Хешируешь эти 4 (8) байт, идешь дальше. Собственно и все. Edit: исходный хеш (для проверки с подсчитанным) можешь прямо из DLL'ки куском считать, при таком подходе хеш из файла и хеш в памяти будет совпадать. Edit2: Если хочешься сделать убер алгоритм, можешь поддерживать все виды релоков, хотя на самом деле используется аж 2 типа (один для 32 бит, другой для 64).
Joes Зачем лишний гемморой с разбором всех типов релоков, которых туча. Если будет патчинг "конкретного адреса" то этот адрес в подавляющем большинстве случаев будет в таблице импорта, а не в рефералах на неё. Конечно то, что ты говоришь правильно, но гемморойно для универсала.
asmfan: Ну и чего там гимморойного? алгоритм как алгоритм. Да и релоков достаточно 1 тип для платформы поддерживать. Кроме того, патчат не только импорты. Скажем для игрушек, патчат еще и логику.
Joes документация по формату читали? для х64 Для х86 Общее Этого мало для геммороя? Другое дело, что линкеры ленятся использовать возможности формата и ограничиваются тем, чем вы описали, но где гарантия, что не выйдет новый нормальный линкер?
asmfan А вы прогоняли тулзу, которая проверяла какие _конкретно_ типы релоков юзаются на куче файлов? Я - да. Правка: А о чем собственно речь идет? Я человеку подсказал не сложный способ получение CRC области памяти принадлежащей DLL загружаемой по нефиксированному адресу. Алгоритм прямолинейный как доска и работает, проверено.
Joes Да я ж говорю, что правильно вы всё говорите! Я предложил простой метод, универсальный - просто пропускать. Вы предложили более надёжный, но линкерозависимый (если конечно автор не отчаится все типы релоков парсить, либо учитывать специфику конкретного линкера)... П.С. А что за тулза такая? Самописная и/или опенсорцная? И какова статистика по линкерам? Кто пользует формат по полной? Если честно, то я тоже наблюдал только по 1му типу на 86/64 платформу )
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 по нужному адресу. Собственно и все.