Доброе время суток! У меня следующий вопрос: как с под драйвера можно загрузить в АП dll ? Много в гугле искал, толку мало (может плохо искал, хотя старался) подумал о варианте с RtlCreateUserThread и запись в процесс функции поиска базы ntdll.dll, потом Api: LdrLoadDll и потом уже загрузку dll в АП процесса, но вариант немного геморный (и есть маленькая проблема: нужно узнать размер функции для записи в АП, а как это сделать - хз, пишу на си). Еще нашел вариант с http://www.rsdn.ru/article/baseserv/InjectDll.xml, но тоже как бы не очень. Есть еще вариант хороший: MmLoadSystemImage, но проблема в том что она не экспортируется ядром, есть способы ее нахождения? И есть другие способы сделать загрузку? Заранее всем благодарен!
Проблема в том, что я хочу сделать внедрение к каждому процессу, по этому думаю нужно сделать перехвать NtCreateProcess, и как я понимаю для APC нужен поток или я ошибаюсь?
Для доставки пользовательской апк нужен не только поток, есчо нужно чтобы он вошёл в сервис в котором ожидание происходит, нормально есчо и с разрешением на доставку апк(Alertable), хотя последнее можно изменить. Либо можно поставить апк в очередь треда до его старта, в этом случае апк будет доставлена(LdrInitializeThunk -> LdrpInitialize -> NtTestAlert). Хотя апк будет доставлена уже после нотификации загруженных модулей, но перед вызовом указанного для треда Win32StartAddress. Альтернативой ядвляется захват контекста треда, либо захват указателей на обработчики, либо редирект из какогото места на диспетчер исключений(пользовательский либо ядерный не важно).
уж луче создать поток который будет искать LdrLoadDll и загрузить dll, не считаете? Загвоздка в том, что не знаю как узнать размер функции на си
можно в процесс инжектнуть шелкод, затем просплайсить чегото (скажем Sleep() или еще какуюто апишку)так, чтоб при вызове ф-ции вызывался шелкод. в шелкоде сделать { UnSplice() return LoadLibrary() } и останется только подождать совсем уже немного (главное похукать чтото реально частоиспользуемое) это как вариант. ну или как сделал один мой знакомый, сделать тоже самое, но в нотификаторе создания треда\процесса и просплайсить уже энтрипойнт треда\процесса
patolog Я собирал статистику, чаще всего вызывается ZwWaitForMultipleObjects, могут от этого плясать=) А вообще х..ня это. Если автору достаточно, чтобы дллка размещалась в АП процесса назначения согласно таблицы секций и всё (без записей в списке модулей и пр), тогда можно просто самому промапить ее туда через ZwCreateFile / ZwCreateSection (SEC_IMAGE) / ZwMapViewOfSection. Если дллка не находится в файле, тогда сэмулировать работу загрузчика, пройдясь по таблице секций и промапировав нужные секции либо из памяти через MmMapLockedPagesSpecifyCache, либо выделением места в процессе и копированием туда.
Y_Mur Спасибо! понял как можно это реализовать. Great Нет, мне еще нужно чтобы был импорт, по этому простой мапинг секций - не прокатить patolog интересная идея, но я делаю перехват NtCreateProcess, а там есть только ntdll.dll и хорошо бы если сначала длл инициализировалась, а потом уже код
Грузи DLL в адресное пространство через ZwAllocateVirtualMemory, пиши небольшой загрузчик на asm, грузи его, перед этим вшив нужные адреса, далее передавай ему управление любым удобным способом. Загрузчик настроит образ PE, там не много дел и создаст поток на EP, нужно только убедится что ntdll и kernel32 прошли инициализацию перед работой с ними.
P.S. Не требуется грузить DLL с диска, можно носить ее в памяти дрова, просто прописывать в выделенную память и настраивать через загрузчик.
я думаю использовать еще один модуль на асм - плохая затея (есть печальный опыт), вот подумал сделать так: сделать выделение памяти ZwAllocateVirtualMemory, скопировать функцию загрузки (методом поиска базы ntdll.dll в PEB и функции LdrLoadDll, кстати такой метод будет работать под любой ОС? читал что в висте или 7 - не работает) и потом создать поток, только не експортируеться RtlCreateUserThread (или я ошибаюсь? если нет - то как можно найти ее, или как создать поток) и с помощью этого потока сделать загрузку dll в АП процесса Как смотрится этот вариант?
x64 ну некоторая часть кода - для меня интересная, но как загрузить и настроить dll или exe - я знаю как сделать, но вот с импортом - опять же проблемы, так как нужно его настроить (что не составляет проблемы, если есть LoadLibrary), а грузить все dll что нужны для текущей dll - согласитесь, глупо. Хотя кто я такой чтобы судить