4

我正在注入一些代码来挂钩进程中的 api,但在 chrome.exe 等某些应用程序中存在一些问题

我的测试应用程序启动一个暂停的进程,进行注入和 api 挂钩,然后恢复它。

挂钩 CreateProcessW 是为了能够挂钩子进程。如果调用了CreateProcessW,则强制创建挂起,hook子并恢复。

注入的代码仅依赖于 ntdll api,因此,虽然挂钩进程尚未完全初始化,但 ntdll.dll 始终存在。

使用带有 CREATE_SUSPENDED 标志的 CreateRemoteThread 或 NtCreateThreadEx 使用辅助线程注入代码。(不管哪一个,问题依然存在)

在此介绍之后,问题是在某些进程(如某些 chrome 子进程)中,CreateRemoteThread 返回 TRUE,但是当我恢复注入器线程时,它以代码 0xC0000022 退出并且进程也退出。

如果我将 WinDbg 附加到暂停的 chrome.exe 子进程,在我做任何事情之前,它也会失败并且 chrome.exe 以相同的行为结束。

似乎在 RtlUserThreadStart 之前执行的操作系统代码会生成错误,但我不知道如何调试它。

如何调试在 RtlUserThreadStart 之前运行的代码?是否有允许我这样做的调试器或 windbg 选项?

编辑:

从这里的最后一篇文章之后,我可以检索到这个信息:

0a88:0814 @ 02688302 - LdrpInitializeProcess - INFO: Beginning execution of chrome.exe (c:\Program Files (x86)\Google\Chrome\Application\chrome.exe)
    Current directory: C:\Windows
    Search path: C:\Windows\SYSTEM32 0a88:0814 @ 02688318 - LdrpInitializeProcess - ERROR: Initializing the current directory to "C:\Windows" failed with status 0xc0000022
0a88:0814 @ 02688334 - LdrLoadDll - ENTER: DLL name: C:\Windows\SYSTEM32\wow64.dll DLL path: NULL 0a88:0814 @ 02688349 - LdrpLoadDll - ENTER: DLL name: C:\Windows\SYSTEM32\wow64.dll DLL path: C:\Windows\SYSTEM32
0a88:0814 @ 02688365 - LdrpLoadDll - INFO: Loading DLL C:\Windows\SYSTEM32\wow64.dll from path C:\Windows\SYSTEM32 0a88:0814 @ 02688380 - LdrpFindOrMapDll - ENTER: DLL name: C:\Windows\SYSTEM32\wow64.dll DLL path: C:\Windows\SYSTEM32
0a88:0814 @ 02688396 - LdrpSearchPath - ENTER: DLL name: C:\Windows\SYSTEM32\wow64.dll DLL path: C:\Windows\SYSTEM32
0a88:0814 @ 02688412 - LdrpResolveFileName - ENTER: DLL name: C:\Windows\SYSTEM32\wow64.dll
0a88:0814 @ 02688427 - LdrpResolveFileName - RETURN: Status: 0xc0000022
0a88:0814 @ 02688443 - LdrpSearchPath - RETURN: Status: 0xc0000022
0a88:0814 @ 02688458 - LdrpFindOrMapDll - RETURN: Status: 0xc0000022
0a88:0814 @ 02688474 - LdrpLoadDll - RETURN: Status: 0xc0000022
0a88:0814 @ 02688490 - LdrLoadDll - RETURN: Status: 0xc0000022
0a88:0814 @ 02688505 - LdrpInitializeProcess - ERROR: Loading WOW64 image management DLL "C:\Windows\SYSTEM32\wow64.dll" failed with status 0xc0000022
0a88:0814 @ 02688521 - _LdrpInitialize - ERROR: Process initialization failed with status 0xc0000022
0a88:0814 @ 02688536 - LdrpInitializationFailure - ERROR: Process initialization failed with status 0xc0000022

该进程是使用受限令牌创建的,主线程继承它,但我的注入器线程不受限制,因为它是由我的应用程序创建的。

我可以假设 ntdll 的 api 还没有被 chrome 钩住(在这种情况下),因为注入发生在 CreateProcess 返回到 chrome 之前。

我的线程中的非限制令牌可能会以某种方式与进程令牌冲突吗?

4

2 回答 2

2

查看Debugging WinLogonwindbg帮助(debugger.chm)。只需将“chrome.exe”替换为“winlogon.exe”即可。此技术从内核模式调试器控制用户模式调试器 (ntsd)。我相信这将允许您比单独使用用户模式调试器更早地调试 chrome.exe 的进程初始化。

于 2014-03-18T13:23:05.680 回答
1

chrome中的问题如下:

Chrome 以非常有限的权限启动子进程(因为沙箱),但在恢复主线程之前,它会使用具有更多权限的令牌模拟主线程,以便让进程初始化。

我的注入器线程没有模拟,因此有限的进程令牌在执行例程0xC0000022时引发了退出代码。LdrpInitializeProcess

于 2014-03-20T18:03:40.943 回答