Windows内核驱动程序:“CLIENT_ID CreatingThreadId”中的“HANDLE UniqueThread”在加载过程中是否相同?

时间:2018-05-12 08:42:16

标签: windows winapi driver windows-kernel

我正在尝试编写一个APC dll注入驱动程序,我找到了this示例,并考虑根据我的需要对其进行修改。

在我理解了代码之后,这就是我想要修改它的方式(我的问题来自那里)。

code中,作者使用PsLookupThreadByThreadId接收指向目标进程的ETHREAD结构的引用指针。

PsLookupThreadByThreadId(pSpi->Threads[0].ClientId.UniqueThread,&Thread)

但要获得SYSTEM_THREAD_INFORMATION句柄的UniqueThread,他使用了ZwQuerySystemInformation

我想在加载ntdll之后立即加载我的dll,所以我想使用PsSetCreateProcessNotifyRoutineEx并保存UniqueThread来自我为进程调用回调时获得的PS_CREATE_NOTIFY_INFO我的目标是。

加载ntdll之后,我知道感谢PsSetLoadImageNotifyRoutineEx我可以使用他的APC注入逻辑注入我的dll。

我的目标是在PloadImageNotifyRoutine回调中注入我的dll,但不要像使用ZwQuerySystemInformation那样使用UniqueThread,而是将其保存在PcreateProcessNotifyRoutineEx中回调。

所以,我的问题是:我是否可以相信UniqueThreadPS_CREATE_NOTIFY_INFO获得的https://plnkr.co/edit/N18FNNRgd1YuYKTKlc3H?p=preview在整个加载过程中是否相同?

1 个答案:

答案 0 :(得分:2)

  

我想使用PsSetCreateProcessNotifyRoutineEx并保存   UniqueThread来自我PS_CREATE_NOTIFY_INFO时得到的CreatingThreadId   我会针对我定位的流程调用回调。

PS_CREATE_NOTIFY_INFO

PloadImageNotifyRoutine
  

进程和线程的进程ID和线程ID   创建新流程

此ID不适用于新创建的进程/线程,但适用于创建者。如果你想在PcreateProcessNotifyRoutineEx回调中注入自己的dll,PloadImageNotifyRoutine对你来说是无用的。

将图像映射到目标进程时调用的ProcessId - 在ZwMapViewOfSection内。您需要检查PcreateProcessNotifyRoutineEx PsLookupThreadByThreadId的第二个参数 - 加载图像的进程的进程ID )等于PsGetCurrentProcessId()。这意味着图片已加载到当前流程,您可以使用KeGetCurrentThread() - 您根本不需要 ArbitraryUserPointer

  

我想在加载ntdll后立即加载我的dll

此时任何正在处理的用户模式结构尚未初始化。因为它是由ntdll初始化的。结果 - 如果你注入apc并强制执行它 - 此时你的进程崩溃了。没有更多

我可以建议你在加载 kernel32.dll 时注入你的dll。在这里你需要检查这是加载为dll,而不仅仅是图像映射 - 检查线程teb中的L"*\\kernel32.dll" - 是否指向\\KnownDlls smss.exe map ArbitraryUserPointer == 0(在这种情况下为L"WOW64_IMAGE_SECTION")期间,> kernel32.dll ,wow64使用{{处理多个时间映射 kernel32.dll (32和64位) L"NOT_AN_IMAGE"

中的1}}或ArbitraryUserPointer个名字