我正在尝试编写一个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中回调。
所以,我的问题是:我是否可以相信UniqueThread从PS_CREATE_NOTIFY_INFO获得的https://plnkr.co/edit/N18FNNRgd1YuYKTKlc3H?p=preview在整个加载过程中是否相同?
答案 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"
ArbitraryUserPointer
个名字