在RtlUserThreadStart之前的0xC0000022

时间:2014-03-18 02:42:38

标签: windbg inject createremotethread

我在进程中注入一些代码来挂钩api但是我在某些应用程序中遇到了一些问题,比如chrome.exe

我的测试应用程序启动暂停过程,执行注射和api挂钩,然后恢复它。

CreateProcessW被挂钩以便能够挂钩子进程。如果调用CreateProcessW,则强制将其挂起,挂钩子节点并恢复它。

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

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

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

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

似乎是O.S.在RtlUserThreadStart之前执行的代码生成错误,但我不知道如何调试它。

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

修改

here的最后一篇帖子之后,我可以检索此信息:

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之前进行了注入。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

chrome中的问题如下:

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

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