首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Csrss中创建钩子进程

在Csrss中创建钩子进程
EN

Stack Overflow用户
提问于 2014-07-07 00:42:02
回答 2查看 1.7K关注 0票数 2

当用户打开任何新的进程时,我试图将进程创建挂钩,并在我的钩子过程中接收一个“通知”。为了只挂一个函数,我尝试在CsrCreateProcess at csrss.exe中完成这个任务。但是每次我在这个进程中注入一个DLL时,我都会得到一个BSOD (蓝色屏幕)。我的注射代码是:

代码语言:javascript
运行
复制
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代码是:

代码语言:javascript
运行
复制
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进程中注入x86 DLL?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-07 13:30:09

在注释中,您指出您正在尝试从32位注入器向64位目标进程注入64位DLL。这不能使用CreateRemoteThread方法完成。您需要创建一个64位注入器。

在这个基础上,csrss是一个系统完整性的关键组件。即使你解决了痛苦问题,如果不允许向它注入,我一点也不感到惊讶。我绝对不建议您继续尝试向csrss注入。

票数 0
EN

Stack Overflow用户

发布于 2015-05-30 14:20:51

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24601669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档