windows - 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在所有进程加载期间都是相同的吗?
解决方案
我想使用
PsSetCreateProcessNotifyRoutineEx
并保存 我在UniqueThread
为PS_CREATE_NOTIFY_INFO
我的目标进程调用回调时得到的。
关于CreatingThreadId
从PS_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\\KnownDlls
(ArbitraryUserPointer == 0
在这种情况下),wow64 处理几次映射kernel32.dll(32 位和 64 位)带有L"WOW64_IMAGE_SECTION"
或L"NOT_AN_IMAGE"
名称的ArbitraryUserPointer
推荐阅读
- php - 通过转发器获取自定义帖子类型字段
- android - 错误:未找到 Gradle DSL 方法:'implementation()' 但我有最新的 Android Studio,gradle,
- java - Java 和 GlassFish 部署错误:项目当前已归档部署
- android - React Native Firebase 数据库中的 SyntaxError 异常
- python - 从字符串中删除连续元音
- javascript - 为什么我不能在 render 方法中使用 2 个 JSX 标签?
- javascript - 在一分钟的时间间隔内将函数调用限制为最多 15 次
- powerbi - 如何使用 Power Bi 中的 Power Query 编辑器从选择两列的不同值中创建新列
- android - 当尝试更新我的应用程序时出现错误:失败 INSTALL_FAILED_UPDATE_INCOMPATIBLE
- android - 在开发中使用 minifyEnabled=true 是不行的;]