#dllimport #portable-executable #dll-injection
#dllimport #переносимый-исполняемый #dll-внедрение
Вопрос:
Я пытаюсь написать некоторые функции для обнаружения сращивания кода DLL. Я понимаю, что под сращиванием кода dll подразумевается изменение байтов в начале функций в загруженных DLL-файлах, так что вместо перехода к полной реализации функции в dll она перейдет в какое-то другое местоположение.
До сих пор мой подход заключался в следующем:
Сначала загруженная информация о dll (например, база изображений загруженной dll и т.д.) Я получаю от использования библиотек Toolhelp32.
Для каждой загруженной dll:
- получите адрес каждой функции (rva), прочитав таблицу экспорта в памяти библиотеки dll
- считывание в 8 байтах по этому адресу в памяти
- получить функцию rva из версии dll на диске
- проанализируйте PE заголовок библиотеки dll на диске, чтобы преобразовать rva в file-offset — прочитайте 8 байт и здесь
- сравните эти 8 байт
Теперь я знаю, что делаю что-то не совсем правильно, и, возможно, я совершаю концептуальную ошибку.
Я тестировал с notepad.exe, 32 бит. Сравнения успешны для большинства функций в загруженных DLL, но, как правило, обнаруживаются некоторые различия.
Например:
ntdll.dll: порядковый номер=00000059, rva=0007e098, fileoffs =0007d498, функциональная база данных: 7c97e098
диск: 00 00 00 00 00 00 00 00
память: e4 04 00 00 00 00 00 00 00 00
и:
ntdll.dll: порядковый номер=0000003d, rva= 0009d0d8, fileoffs =0009c4d8 функциональная база данных: 77a9d0d8
диск: a1 5c 81 f9 77 c3 90 90
память: a1 5c 81 ad 77 c3 90 90
Кто-то упомянул мне, что это как-то связано с перемещениями. Однако я не могу разобраться в этом, и я не нашел никакой документации о том, как это применимо здесь.
У кого-нибудь есть какая-нибудь информация или ссылки на это? Или кто-нибудь знает, где у меня сбой? Заранее большое спасибо.
РЕДАКТИРОВАТЬ: Библиотеки DLL загружаются в соответствии с их предпочтительной базой изображений (при сравнении OptionalHeader.Привязка базы изображений к базовому адресу загруженного модуля в памяти).
Поэтому я застрял, пытаясь выяснить, почему может быть разница — например. выше: почему 1312 функций в ntdll, казалось, совпадали, а 1313-я — нет.
Ответ №1:
Перемещения представляют собой список виртуальных смещений, который содержит абсолютные адреса. Если изображение загружено не в соответствии с предпочтительной базой изображений, необходимо скорректировать все смещения, перечисленные в таблице перемещения. Если вы предпочитаете базу изображений 0x400000, а DLL загружается с 0x500000, вам просто нужно скорректировать данные со смещениями, указанными в списке перемещения, с 0x100000.
Смотрите, например, раздел «Перемещение базы файлов PE» в Peering inside PE для определения формата.
Комментарии:
1. Спасибо. то, что вы сказали, имеет смысл. Однако сейчас я обнаружил, что библиотеки DLL, с которыми я тестирую, загружаются по их предпочтительному адресу. Итак, я не уверен, что может быть причиной этой разницы…