首页 > 解决方案 > Windows内核驱动程序:“CLIENT_ID CreatingThreadId”中的“HANDLE UniqueThread”在进程加载过程中是否相同?

问题描述

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

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

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

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

但为了获得 UniqueThread 句柄的SYSTEM_THREAD_INFORMATION 使用了ZwQuerySystemInformation

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

在加载 ntdll 之后,我会知道这要归功于PsSetLoadImageNotifyRoutineEx,我可以使用他的 APC 注入逻辑注入我的 dll。

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

所以,我的问题是:我可以相信我从 PS_CREATE_NOTIFY_INFO 获得的UniqueThread所有进程加载期间都是相同的吗?

标签: windowswinapidriverwindows-kernel

解决方案


我想使用PsSetCreateProcessNotifyRoutineEx并保存 我在UniqueThreadPS_CREATE_NOTIFY_INFO我的目标进程调用回调时得到的。

关于CreatingThreadIdPS_CREATE_NOTIFY_INFO

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

此 id 不是用于新创建的进程/线程,而是用于创建者。如果你想在PloadImageNotifyRoutine回调中注入 self dll - 这PcreateProcessNotifyRoutineEx对你没用。

PloadImageNotifyRoutine映像映射到目标进程时调用 -内部ZwMapViewOfSection。您需要检查ProcessId第二个参数PcreateProcessNotifyRoutineEx- 加载图像的进程的进程 ID)是否等于PsGetCurrentProcessId()。这意味着图像加载到当前进程并且您可以使用KeGetCurrentThread()- 您根本不需要 PsLookupThreadByThreadId

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

此时,任何用户模式结构都在进行中,但尚未初始化。因为它是由ntdll初始化的。结果 - 如果你注入你的 apc 并在此时强制执行它 - 你会遇到进程崩溃。而已

我可以建议您在加载kernel32.dll时注入您的 dll 。在这里你需要检查这是作为 dll 加载的,而不仅仅是图像映射 - 检查ArbitraryUserPointer线程 teb - 它是否指向L"*\\kernel32.dll"smss.exe在创建期间映射kernel32.dll\\KnownDllsArbitraryUserPointer == 0在这种情况下),wow64 处理几次映射kernel32.dll(32 位和 64 位)带有L"WOW64_IMAGE_SECTION"L"NOT_AN_IMAGE"名称的ArbitraryUserPointer


推荐阅读