delphi - Csrss中Hook进程创建

标签 delphi hook dll-injection

我正在尝试 Hook 进程创建,并在用户打开任何新进程时在我的 Hook 过程中接收“通知”。为了仅 Hook 一个函数,我尝试在 csrss.exe 的 CsrCreateProcess 中执行此操作。 但是每次当我在这个进程中注入(inject) DLL 时,我都会遇到 BSOD(蓝屏)。 我的注入(inject)代码是:

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 内注入(inject)并 Hook NtCreateSection,这应该可以解决我的问题,对吗? 其他简单问题:是否可以使用 x86 可执行文件在 x64 进程中注入(inject) x64 DLL?

最佳答案

在评论中,您声明您正在尝试从 32 位注入(inject)器将 64 位 DLL 注入(inject)到 64 位目标进程中。使用 CreateRemoteThread 方法无法完成此操作。您需要创建一个 64 位注入(inject)器。

csrss 之上是一个系统完整性关键组件。即使您解决了位数问题,如果不允许注入(inject),我也不会感到惊讶。我绝对建议不要继续尝试注入(inject) csrss

关于delphi - Csrss中Hook进程创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24601669/

相关文章:

delphi - 如何在控制台应用程序中使用 TIdUDPServer?

javascript - 如何在 jQuery ui 对话框按钮单击中提供 Hook ?

c# - 如何在 VS2013 调试期间加载 dll

delphi - VirtualStringTree - 在单元格中嵌入控件 - 控件不显示

delphi - 在 Delphi 中使用接口(interface)是否需要 GUID?

delphi - 如何创建虚拟光驱

php - 将 Woo-commerce 变体销售价格低于实际价格

c++ - Linux X11 - 全局键盘 Hook

c++ - 使用 CreateToolHelp32Snapshot 找到加载的 dll,在 dll 中找到一个函数,然后调用它,GetProcAddress

c++ - 注入(inject)后未执行 DLLMain()