![]() |
Всем привет.
В силу своей деятельности, возникла необходимость определять инжекты динамических библиотек (DLL) на уровне user-mode. Простейшие инжекты достаточно просто обнаруживаются через перебор модулей процесса(EnumProcessModules),но, кроме простейших способов существует и различные усложнения, противодействующие детекту обычными методами. Одним из таких способов является Reflective-Injection, это особая техника, позволяющая встраивать библиотеки непосредственно в память целевого процесса, без упоминания в списке загруженных модулей. Цитата:
Начнем с того, что каждая динамическая библиотека содерит PE Заголовки (Header), они начинаются с двух определенных символов - MZ. Благодаря им, мы можем перебрать память процесса и найти все заголовки динамических библиотек. https://forum.antichat.xyz/attachments/28260534/ Эти заголовки являются обязательными и используются в любой PE-формат программе/библиотеке. Если превратить данный метод обнаружения в определенный набор действий, то мы получим примерно подобное:
Но, дальше труднее. PE Заголовки возможно удалить из памяти после инжекта, так как они не используются в процессе работы, только лишь в начале. С этого момента, у нас пропадает возможность как либо идентифицировать библиотеку обычными методами. Так как именно PE Header содержит информацию о библиотеке (в том числе название, физический путь, базовый адрес и т.д). Поэтому такие части кода следует называть chunk-кодом. Но, мы ведь встраиваем определенный код в виртуальную память процесса, и этот процесс не протекает бесследно? Верно, мы всё еще можем обнаружить такие сегменты при помощи полного изучения памяти процесса. Обьединив размер всех секций + заголовков известных нам библиотек и самого процесса, мы можем узнать размер оставшеегося неизвестного пространства, и получить те самые участки с chunk-кодом. Если снова представить данный способ в виде плана, то он будет примерно следующим:
1677012829965.png0Z0SK0 · 21 Фев 2023 в 23:56' data-fancybox="lb-post-1260534" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/190892/" style="cursor: pointer;" title="1677012829965.png"> https://forum.antichat.xyz/attachments/28260534/ Но остаётся следующая проблема, мы не можем идентифицировать эти участки как либо. И тут нам в помощь приходят эвристические методы. Например, взяв известную нам последовательность байтов (byte pattern), мы можем найти ее в chunk-коде. И тем самым идентифицировать возможную библиотеку. Откуда же взять эту последовательность? Тут необходимы ваши знания reverse-engineering`а. У нас есть возможность открыть любую библиотеку в различных дебаггерах и изьять начало любой из функций внутри библиотеки в виде набора байтов. А после найти этот набор байтов в chunk-коде. https://forum.antichat.xyz/attachments/28260534/ Конечно и тут существуют проблемы, данный способ неприменим при self-morphing коде, или обернутом в какую либо VM машину (VMProtect к примеру). Так как набор байтов постоянно меняется при исполнении, и не оставляет нам возможности его найти. Существуют и другие трудности при данном методе обнаружения, код может быть встроен непосредственно в секции игры с патчингом оригинальных PE-заголовков, но мы способны сравнить ожидаемый размер секций программы и их размер непосредственно в процессе исполнения для обнаружения различных патчингов или инжектов. |
Цитата:
|
Цитата:
|
Цитата:
|
| Время: 21:24 |