Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Вклиниться" в адр. пространство библиотеки до выполнения Dllmain [Win2k]


Страницы:   1 2 3 4

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. Просто копирую код второпях


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо