如何在Windows进程创建初期注入DLL,拦截ShellExecuteExW并及时检测进程
在Windows进程初始化阶段实现DLL注入与API拦截的方案
针对你遇到的进程启动过快、DLL注入时机滞后导致拦截失效的问题,以下是几种能确保在进程执行前完成注入的可靠方案:
1. 基于CreateProcess挂起模式的早期注入
这是用户态下最直接的可靠方案,核心思路是让目标进程创建后立即挂起,注入完成再恢复执行:
- 调用
CreateProcessW时传入CREATE_SUSPENDED标志,此时进程已完成内存映射,但主线程尚未执行任何用户态代码 - 通过
WriteProcessMemory将你的DLL路径写入目标进程的虚拟内存空间 - 调用
CreateRemoteThread,以目标进程的LoadLibraryW函数地址为线程入口,传入DLL路径的内存地址完成注入 - 最后调用
ResumeThread恢复目标进程主线程,此时你的DLL已加载初始化,可拦截后续的ShellExecuteExW调用
这种方式从根源上避免了进程先于注入执行的可能。
2. 利用Image File Execution Options(IFEO)实现自动注入
通过Windows注册表的IFEO机制,让系统在目标进程启动时自动加载你的DLL:
- 打开注册表编辑器,定位到
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe(不存在则新建项) - 新建字符串值
Debugger,值设为rundll32.exe "C:\path\to\your\dll.dll",EntryPoint(EntryPoint为DLL导出的初始化函数,省略则默认调用DllMain) - 系统启动cmd.exe时会自动加载你的DLL,此时进程初始化尚未开始,确保拦截代码优先执行
注意:该操作需要管理员权限,且对所有cmd.exe实例生效,测试后需清理对应注册表项。
3. 内核驱动级别的进程创建拦截与注入
若需全局监控或绕过用户态限制,可使用内核驱动实现最早期的注入:
- 编写内核驱动,调用
PsSetCreateProcessNotifyRoutineEx注册进程创建回调函数 - 在回调中监控目标进程(如cmd.exe)的创建事件,此时进程处于初始化最早期(用户态代码未运行)
- 通过
ZwCreateThreadEx在目标进程中创建远程线程,调用LoadLibraryW加载你的DLL
该方式能在进程完全初始化前完成注入,但内核驱动需要数字签名,开发调试门槛较高。
4. 父进程Hook补充方案
从进程启动源头控制,避免子进程过快导致的拦截遗漏:
- 在可能触发cmd.exe启动的父进程中注入DLL,Hook其
ShellExecuteExW函数 - 检测到该函数要启动cmd.exe时,修改
SHELLEXECUTEINFO结构参数,强制以挂起模式启动(配合SEE_MASK_NOCLOSEPROCESS标志) - 对挂起的cmd.exe进程执行注入后,再恢复其执行
内容的提问来源于stack exchange,提问作者rohini sasidharan
相关产品推荐
相关产品推荐

