Обнаружение соединения кода DLL

#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, с которыми я тестирую, загружаются по их предпочтительному адресу. Итак, я не уверен, что может быть причиной этой разницы…