![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Вклиниться" в адр. пространство библиотеки до выполнения Dllmain [Win2k]
BiN © (2004-03-11 12:38:00)Добрый день, уважаемые мастера!
Возможно ли выполнить сабж без создания своего загрузчика.
Надеюсь, вы не подумаете, что здесь ведется разработка трояна - скорее наоборот.
Kerk (2004-03-12 16:27:00) [41]
> Способ, описанный в этой статье (вызов "не с начала")...
вызов "не с начала" описан не в этой статье... я ж ссылку совсем в другое место дал. Статья, о которой ты сказал, что это "текст для пакостников", не описывает как перехватить функции до выполнения DllMain [надо, кстати, это автору сказать].
методы описаные в статье реализованы в проекте HackerDefender и тестировались в разных операционках и сервис-паках.
Игорь Шевченко (2004-03-12 16:21:00) [42]Способ, описанный в этой статье (вызов "не с начала"), может сгодиться только для условии точного изучения конкретных реализаций функции LdrLoadDll. (И такое изучение придется делать для каждой системы, если не для каждого сервис-пака). Проще уж по методу Свена Шрайбера, через файлы идентификаторов для отладчика находить нужные адреса неэкспортируемых функций, составить табличку с адесами в каждом конкретном сервис-паке каждой конкретной версии системы (этот способ тоже имеет право на существование, благо неоднократно опробовался) и вызвать нужные функции (в данном случае, Ldr pLoadDll) напрямую.
> А почему это текст - "текст для пакостников"?
I give you three guesses...
Kerk (2004-03-12 16:10:00) [43]При изучении LdrLoadDll оказывается, что она сводится к другой функции, которая и производит чтения параметров и соответствующие вызовы ядра. И в NT, и в w2k дополнительным параметром является булевская переменная - исполнять или нет цепочку DllMain. Вызовем функцию LdrLoadDll "не с начала", а после того, как положим в стек 0 - FALSE (а не 1 - TRUE). Таким образом, после завершения LdrLoadDll и соответствующего исправления таблиц импорта нам останется лишь вызвать DllMain всех вновь появившихся модулей с причиной DLL_PROCESS_ATTACH.
http://i2r.rusfund.ru/static/565/out_16836.shtml
:-)
А почему это текст - "текст для пакостников"?
Тут раз в неделю появляются вопросы тех, кто пишет софт для всяких там клубов, о том, как от всех спрятаться...
Игорь Шевченко (2004-03-12 16:00:00) [44]Kerk © (12.03.04 15:39)
LdrLoadDll в процессе своей работы вызывает DLLMain (DllEntryPoint) в загружаемой DLL. Автору ветки хочется иметь возможность получить доступ к DLL до вызова DLLMain.
Текст "для пакостников" не говорит, как это сделать.
Kerk (2004-03-12 15:39:00) [45]2Игорь Шевченко
Вот:
Все остальные модули могут быть загружены динамически в середине кода после
перехвата процесса. Вот почему мы должны перехватить LdrLoadDll, которая
загружает новые модули.
NTSTATUS LdrLoadDll(
PWSTR szcwPath,
PDWORD pdwLdrErr,
PUNICODE_STRING pUniModuleName,
PHINSTANCE pResultInstance
);
Наиболее важно для нас pUniModuleName - имя модуля. pResultInstance
будет адресом модуля, если вызов был успешен.
Мы вызовем оригинальную LdrLoadDll и затем перехватим все функции в
загруженном модуле.
Игорь Шевченко (2004-03-12 15:34:00) [46]Kerk © (12.03.04 14:58)
И где там написано про то, как загрузить DLL и перехватить вызов DLLMain при загрузке ?
<offtopic>
На какие только ухищрения народ не идет, чтобы гадость ближнему сделать, просто поразительно.
</offtopic>
Kerk (2004-03-12 14:58:00) [47]практически тоже самое:
http://rootkit.host.sk/knowhow/hidingru.txt
Игорь Шевченко (2004-03-12 12:12:00) [48]BiN © (12.03.04 11:35)
Подробнее, пожалуйста, лучше всего, с примером
evvcom (2004-03-12 12:05:00) [49]Тогда это приложение будет работать под семейством WinNT. В 9x ntdll нет.
BiN (2004-03-12 11:35:00) [50]Решение найдено. Перехватить вызов DllEntryPoint можно путем правки кода вызова этой функции в адресном пространстве ntdll.
BiN (2004-03-11 15:21:00) [51]Ну что ж, спасибо всем за советы
Игорь Шевченко (2004-03-11 15:16:00) [52]BiN © (11.03.04 15:06)
Драйвер + Policy. Остальные способы не заткнут все дырки.
BiN (2004-03-11 15:06:00) [53]И все-таки, если не секрет, какую проблему надо решить ?
API-монитор, с возможностью разрешения/отклонения/перенаправления потенциально опасных действий.
Игорь Шевченко (2004-03-11 14:59:00) [54]BiN © (11.03.04 14:54)
Ну что же, мои 90% переросли в 100%
И все-таки, если не секрет, какую проблему надо решить ? Может, есть альтернативный способ ?
BiN (2004-03-11 14:54:00) [55]Digitman © (11.03.04 14:46) [16]
Хотелось бы, конечно произвольных. Я понимаю, что для перехвата записи-чтения на носители, а также в ms-реестр, можно (скорее всего даже нужно) написать драйвер аля Руссинович/Соломон- в этом направлении я тоже продвигаюсь - но все же хотелось бы обойтись только пользовательским режимом и только работой с одним процессом(+ его возможными дочерними).
Digitman (2004-03-11 14:46:00) [56]
> BiN
а тебе вызов каких ф-ций каких библиотек нужно перенаправить на себя ?
BiN (2004-03-11 14:42:00) [57]Игорь Шевченко © (11.03.04 14:28) [13]
Я уже проводил такой эксперимент
H1:=LoadLibraryEx('custom.dll', 0, DONT_RESOLVE_DLL_REFERENCES) H2:=LoadLibrary('custom.dll');
в результате H1 был равен H2 и при этом, что интересно, функция Dllmain не вызывалясь в обоих случаях. Что в принципе понятно: в SDK так и сказано:
During initial process startup or after a call to LoadLibrary, the system scans the list of loaded DLLs for the process. For each DLL that has not already been called with the DLL_PROCESS_ATTACH value, the system calls the DLL's entry-point function.
--------------------
Следовательно LoadLibrary в нашем случае найдя уже существующую ссылку на эту библиотеку, просто не загружает ее вторично.
К тому же, попробуйте вызвать
SomeProc:=GetProcAddress(H2);
if Assigned(SomeProc)
then SomeProc(); В результате получаете AV
Игорь Шевченко (2004-03-11 14:30:00) [58]P.S. Источник информации - MSDN Magazine RE :)
Игорь Шевченко (2004-03-11 14:28:00) [59]Сильно я сомневаюсь в возможности загрузки DLL с разрешением ссылок без вызова DllMain.
Единственная экпортируемая функция NTDLL.LdrLoadDll вызывает неэкспортируемую функцию NTDLL.LdrpLoadDll с параметром RunInitRoutines равным TRUE. Этот параметр как раз и определяет, нужно ли вызывать DllMain.
Может, глупое предложение, но попробовать LoadLibraryEx без разрешения ссылок, настроить таблицу импорта, убрать настроенные ссылки из таблицы импорта и вызывать Loadlibrary того же файла. На 90% не уверен, но попробовать можно.
BiN (2004-03-11 14:19:00) [60]...вдогонку
в строке P:=GetNtHeader(Result); в функции GetAddressOfEntryPoint, конечно же должен стоять вместо Result hLib. Просто копирую код второпях