在Csrss中创建钩子进程

时间:2014-07-07 00:42:02

标签: delphi hook dll-injection

我正在尝试挂钩进程创建,并在用户打开任何新进程时在我的挂钩过程中收到“通知”。要挂钩只有一个函数,我试图在csrss.exe的CsrCreateProcess中执行此操作。 但每当我在这个过程中注入DLL时,我都会得到一个BSOD(蓝屏)。 我的注射代码是:

function Inject(DLL: PAnsiChar; ProcessID: Cardinal):Boolean;
var
  lProcess: THandle;
  lMem:     Pointer;
  lLibrary: Pointer;
  Bytes:    NativeUInt;
  lThread:  DWORD;
  RemoteThread: DWORD;
begin
  Result := FALSE;
  if FileExists(DLL) then  { If Path of DLL is valid }
  begin
    lProcess:= OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID); { Open process to DLL Inyect }
    if lProcess <>  0 then  { If Process is opened }
    begin
      lMem:= VirtualAllocEx(lProcess,nil,Length(DLL),MEM_COMMIT,PAGE_READWRITE); { Reserve virtual space for load DLL }
      if (Assigned(lMem)) then
      begin
        lLibrary:= GetProcAddress(GetModuleHandle('kernel32'),'LoadLibraryA');  { Parameter used for load library DLL in remote process }
        WriteProcessMemory(lProcess,lMem,Pointer(DLL),Length(DLL),Bytes); { Write DLL in remote space created with VirtualAllocEx }
        RemoteThread:= CreateRemoteThread(lProcess,nil,0,lLibrary,lMem,0,lThread); { Create Remote Thread for run DLL }
        if (RemoteThread <> 0) then
        begin
          WaitForSingleObject(RemoteThread, INFINITE); // Wait for the LoadLibraryA thread to finish
          CloseHandle(RemoteThread); { Close handle of Thread }
          Result := TRUE;
        end;
      end;
      CloseHandle(lProcess); { Close handle of process opened }
    end;
  end
end;

我的DLL代码是:

procedure DLLMain(dwReason: DWORD);
begin
  case dwReason of
  DLL_PROCESS_ATTACH:
  begin
    MessageBoxA(0,'Injected', 'Injected', MB_OK);
    //@TrampolineCreateProcess := InterceptCreate(@CsrCreateProcess, @HookCsrCreateProcess);
  end;
  end;
end;

begin
 DLLProc := @DLLMain;
 DLLMain(DLL_PROCESS_ATTACH);
end.

尝试在csrss中挂钩此功能是个坏主意吗?我开始考虑注入explorer.exe并挂钩NtCreateSection,这应该解决我的问题吧? 其他快速问题:是否可以在x64进程中注入x64 DLL,并使用x86可执行文件?

2 个答案:

答案 0 :(得分:0)

在评论中,您声明要尝试从32位注入器向64位目标进程注入64位DLL。使用CreateRemoteThread方法无法做到这一点。您需要创建一个64位注入器。

最重要的是csrss是系统完整性关键组件。即使您解决了比特问题,如果注入它也不会让我感到惊讶。我肯定会建议不要继续尝试注入csrss

答案 1 :(得分:0)

要访问csrss进程,您需要启用SeDebugPrivilege。这可以通过调用RtlAdjustPrivilege来完成。