Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Внедрение DLL в процесс |
Посл.ответ | Сообщение |
|
Создано: 01 мая 2006 15:55 · Личное сообщение · #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 и другие фырволы не запалили) ----------------------- ![]() |
|
Создано: 01 мая 2006 16:08 · Личное сообщение · #2 |
|
Создано: 01 мая 2006 16:34 · Личное сообщение · #3 |
|
Создано: 01 мая 2006 16:45 · Личное сообщение · #4 может так: в DllEntryPoint вызываеш GetModuleFileName(NULL,buf,sizeof(buf)) вернет имя exe загрузившего твою dll. если это rundll32 или regsvr32 (или типа этого) то список модулей не трогаешь. если это SERVICES.EXE или SVCHOST.EXE - делаешь что нужно во всех остальных случаях можно просто вернуть FALSE (если тебе конечно не нужно во всех процессах присутствовать) ![]() |
|
Создано: 01 мая 2006 17:50 · Поправил: BaGiE · Личное сообщение · #5 kropalik спасибо за подсказку, но у меня уже так и есть. однако в этом способе нет универсальности - так как может быть кто-то по другому будет запускать DllRegisterServer, т.е. DLL'ку можно (и нужно) встроить в инсталлятор любой, и не факт, что он регистрирует OCX или DLL через regsvr32 или rundll32 ![]() |
|
Создано: 01 мая 2006 18:22 · Поправил: kropalik · Личное сообщение · #6 из MSDN: BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved); последний параметр написано что reserved но на самом деле содержит 0 или 1 в зависимости от способа загрузки Dll (статически или через LoadLibrary) может поможет ? P.S. кстати удаление из списка загруженных Dll не всегда достаточно. еще имеет смысл испохабить MZ и PE заголовки (после того как станут ненужны) ато длл всеравно можно будет найти через VirtualQuery() ![]() |
|
Создано: 01 мая 2006 20:13 · Личное сообщение · #7 kropalik насчет lpvReserved это я не знал. и хотя в данном случае это мне и не поможет (загрузка этой DLL всегда динамическая), но все равно спасибо за информацию, может и пригодится когда. А насчет того, чтобы испортить заголовки то это наверное пока-что слишком (Outpost вроде еще не дошел до такого), хотя может и сделать на всякий случай стоит Вообще то я по пути еще хотел спросить - может кто-нить знает почему если я в своей DLL, внедренной в SERVICES.EXE вызываю MessageBox, то он не отображается, но звук от него слышно. Если внедриться в другой процесс, то все ок (но от имени пользователя, а не SYSTEM). А еще пробовал в WINLOGON.EXE внедряться - но система часто падает в BSOD почему-то. В CSRSS.EXE и LSASS.EXE DLL не грузится (???) ![]() |
|
Создано: 02 мая 2006 15:10 · Личное сообщение · #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 · Личное сообщение · #9 |
|
Создано: 11 мая 2006 13:56 · Личное сообщение · #10 |
|
Создано: 11 мая 2006 14:12 · Личное сообщение · #11 |
|
Создано: 11 мая 2006 16:33 · Личное сообщение · #12 |
![]() |
eXeL@B —› Программирование —› Внедрение DLL в процесс |