| Посл.ответ |
Сообщение |
|
Создано: 1 мая 2006 15:55:51 Личное сообщение #1
-----------------------
Приветствую всех
-----------------------
Внедряю в SERVICES.EXE свою DLL'ку, через автозагрузку в реестре (AppInit_DLL). В этом случае DLL загружается в адресное пространство каждого (или почти каждого) запущенного приложения (в том числе и SERVICES.EXE). Проблема вот в чем. Outpost кричит что Apllication Layer Gateway Service (alg.exe) изменен и сразу выводит путь к моей DLL'ке. Но прочитав статью Ms-Rem'а "Инжект как метод обхода фаерволлов, жив или мертв?", стал использовать этот метод (удаление DLL из списка модулей в PEB). Однако DLL'ка представляет из себя COM-сервер, точнее маскируется под него (т.е. в экспортах DllRegisterServer, DllUnregisterServer... и т.д.). Для установки в систему необходимо просто зарегистрировать DLL как COM-сервер, а в DllRegisterServer находится процедура инсталляции.
Вся хрень в том, что если выдергивать свою DLL из списка модулей в PEB сразу, в DllEntryPoint, то такая DLL не пашет, а точнее DllRegisterServer и любые другие экспортированные функции не работают (вернее они сами работают, но например regsvr32 говорит, что DLL вроде загружена, но какая-то левая и может даже это и не DLL вовсе). Можно, конечно и по другому инсталлироваться в систему, например создать еще и экзешник для установки DLL, но так через regsvr32 инсталлироваться предпочтительнее.
-----------------------
Короче говоря вопрос:
можно ли как-нибудь узнать будет ли экзешник, в адресное пространство которого мы грузимся использовать экспорты нашей DLL или просто загрузит и всё, а вызывать никакие функции из нашей DLL не будет (т.е. если программа юзает DllRegisterServer в нашей DLL, то тогда не надо удалять DLL из списка модулей в PEB, а иначе удалять, чтоб Outpost и другие фырволы не запалили)
-----------------------
|
|
|
Создано: 1 мая 2006 16:08:25 Личное сообщение #2
ну дак разбери импорт модуля в памяти и все ...
|
|
Создано: 1 мая 2006 16:34:10 Личное сообщение #3
ckbg пишет:
ну дак разбери импорт модуля в памяти и все ...
и как прикажешь это сделать! программа(ы) (например regsvr32) не статически к моей DLL привязаны, а динамически загружают её и юзают DllRegisterServer. И в импорте соответственно ничего нету.
|
|
Создано: 1 мая 2006 16:45:14 Личное сообщение #4
может так:
в DllEntryPoint вызываеш GetModuleFileName(NULL,buf,sizeof(buf))
вернет имя exe загрузившего твою dll.
если это rundll32 или regsvr32 (или типа этого) то список
модулей не трогаешь.
если это SERVICES.EXE или SVCHOST.EXE - делаешь что нужно
во всех остальных случаях можно просто вернуть FALSE
(если тебе конечно не нужно во всех процессах присутствовать)
|
|
Создано: 1 мая 2006 17:50:08 · Поправил: BaGiE Личное сообщение #5
kropalik
спасибо за подсказку, но у меня уже так и есть. однако в этом способе нет универсальности - так как может быть кто-то по другому будет запускать DllRegisterServer, т.е. DLL'ку можно (и нужно) встроить в инсталлятор любой, и не факт, что он регистрирует OCX или DLL через regsvr32 или rundll32
|
|
Создано: 1 мая 2006 18:22:40 · Поправил: kropalik Личное сообщение #6
из MSDN:
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved);
последний параметр написано что reserved но на самом деле содержит 0 или 1
в зависимости от способа загрузки Dll (статически или через LoadLibrary)
может поможет ?
P.S. кстати удаление из списка загруженных Dll не всегда достаточно.
еще имеет смысл испохабить MZ и PE заголовки (после того как станут
ненужны) ато длл всеравно можно будет найти через VirtualQuery()
|
|
Создано: 1 мая 2006 20:13:33 Личное сообщение #7
kropalik
насчет lpvReserved это я не знал. и хотя в данном случае это мне и не поможет (загрузка этой DLL всегда динамическая), но все равно спасибо за информацию, может и пригодится когда. А насчет того, чтобы испортить заголовки то это наверное пока-что слишком (Outpost вроде еще не дошел до такого), хотя может и сделать на всякий случай стоит
Вообще то я по пути еще хотел спросить - может кто-нить знает почему если я в своей DLL, внедренной в SERVICES.EXE вызываю MessageBox, то он не отображается, но звук от него слышно. Если внедриться в другой процесс, то все ок (но от имени пользователя, а не SYSTEM). А еще пробовал в WINLOGON.EXE внедряться - но система часто падает в BSOD почему-то. В CSRSS.EXE и LSASS.EXE DLL не грузится (???)
|
|
Создано: 2 мая 2006 15:10:47 Личное сообщение #8
BaGiE пишет:
может кто-нить знает почему если я в своей DLL, внедренной в SERVICES.EXE вызываю MessageBox, то он не отображается, но звук от него слышно
Об этом много инфррмации. MessageBox показываеться на роб.столе указаной станции. Сам роб.стол может быть неактивным (скажем Winsta0\Winlogon - окошко увидишь только через Ctrl-Alt-Delete (и то не всегда ;) )... Посмотри на Васме. Там часто это обсуджалось: как именно переключить декстоп, как создать при желании свой, как подключиться к раб.станции...
А поконкретней об SERVICES.EXE: у него Service-0x0-3e7$\Default (что типично для таких сервисов)
Тебе нужно Winsta0\Default.
В крайнем случае обратись к первоисточнику - MSDN.
|
|
Создано: 11 мая 2006 13:14:01 Личное сообщение #9
BaGiE пишет:
В CSRSS.EXE и LSASS.EXE DLL не грузится (???)
Это Ring-0 процессы, залезть в них просто так не получится
|
|
Создано: 11 мая 2006 13:56:16 Личное сообщение #10
kkcos пишет:
BaGiE пишет:
В CSRSS.EXE и LSASS.EXE DLL не грузится (???)
Это Ring-0 процессы, залезть в них просто так не получится
Это не Ring-0 процессы
|
|
Создано: 11 мая 2006 14:12:43 Личное сообщение #11
ошибочка вышла, и правда
правда всё равно к ним просто так не побкопаешься.
|
|
Создано: 11 мая 2006 16:33:33 Личное сообщение #12
kkcos пишет:
правда всё равно к ним просто так не побкопаешься.
А вирус Сассер смог подкопаться к lsass.exe. Если бы ему не нужна была перезагрузка, то наверное lsass так бы пропатченный и выполнялся.
|