终极指南:如何使用injdrv实现Windows内核驱动DLL注入的完整教程
injdrv是一个基于Windows内核的DLL注入工具,通过APC(异步过程调用)技术实现在用户模式进程中注入DLL,支持Windows 7至Windows 10系统及x86、x64、ARM32、ARM64多种架构,尤其适用于Wow64进程的跨架构注入场景。
项目核心功能解析 🚀
作为一款开源内核驱动工具,injdrv的核心价值在于解决传统DLL注入在底层系统环境中的兼容性问题。其通过PsSetLoadImageNotifyRoutine回调机制,在进程初始化早期(ntdll.dll加载后)完成注入操作,确保DLL在主程序执行前加载完毕。
突出特性一览
- 全架构支持:完美适配x86/x64/ARM32/ARM64处理器
- 跨版本兼容:从Windows 7到Windows 10的所有主流系统版本
- Wow64双模式注入:支持同架构(如x86 DLL注入x86进程)和跨架构(如x64 DLL注入Wow64进程)两种模式
- 早期注入机制:在进程初始化阶段完成注入,避免干扰主程序运行
注入原理深度图解 🔍
injdrv采用三级注入机制,针对不同系统架构自动选择最优方案:
1. Thunk注入模式(x86系统专用)
通过创建内存节区(Section)实现可执行代码注入,解决Windows 8.1以下系统的内存保护限制。驱动先以PAGE_READWRITE权限映射内存写入DLL路径和调用代码,再通过二次映射切换为PAGE_EXECUTE_READ权限,既满足执行需求又避免安全风险。
2. Thunkless注入模式(x64系统专用)
利用x64调用约定的特性,直接将APC的NormalRoutine指向LdrLoadDll函数。通过精心构造KiUserApcDispatcher的调用参数,使系统自动传递第四个参数(BaseAddress),完美规避Control Flow Guard(CFG)的内存检查。
图:KiUserApcDispatcher函数的参数传递机制,展示APC调用与x64 calling convention的结合原理
3. Wow64Log重解析模式(ARM64系统专用)
通过拦截wow64log.dll的加载请求实现注入。该DLL是Windows系统预留的调试组件,默认不存在,injdrv通过文件系统过滤驱动将请求重定向到自定义DLL,实现无感知加载。
图:KiUserCallForwarder函数的执行流程,显示APC如何突破架构限制实现跨位注入
快速上手:三步完成DLL注入 ✨
准备工作
- 启用测试签名模式:
bcdedit /set testsigning on
shutdown /r /t 0
- 编译项目(需Visual Studio 2017+和WDK):
git clone --recurse-submodules https://gitcode.com/gh_mirrors/in/injdrv
驱动安装与注入操作
以管理员身份运行命令行工具:
# 安装驱动并启动注入服务
injldr -i
# 启动ETW跟踪会话(无驱动安装)
injldr
# 卸载驱动
injldr -u
效果验证
启动目标进程后,通过Process Explorer可观察到DLL已成功注入:
图:Process Explorer显示x64 DLL成功注入x86 Wow64进程的状态
同时,injldr会实时输出ETW跟踪日志,记录被注入进程的函数调用情况:
图:injldr工具展示的ETW跟踪界面,显示hooked函数的调用记录
高级应用场景与最佳实践 💡
典型应用场景
- 调试分析:注入监控DLL捕获进程初始化阶段的系统调用
- 自动化测试:在测试框架中注入辅助DLL控制目标程序行为
- 兼容性适配:为旧架构应用提供跨系统运行的兼容性支持
性能优化建议
- 最小权限原则:仅授予驱动必要的系统权限,避免使用
PAGE_EXECUTE_READWRITE内存属性 - 延迟注入策略:对非关键进程采用延迟注入,减少系统启动负载
- 多线程处理:在驱动中使用工作项(Work Item)处理注入队列,避免阻塞关键路径
常见问题解决方案 ❓
注入失败排查指南
- 签名问题:确保测试签名已启用(
bcdedit /enum查看testsigning状态) - 架构 mismatch:x64系统需同时编译32位和64位DLL
- 路径权限:DLL文件需放置在System32目录或设置正确的权限
系统兼容性处理
- Windows 7特殊配置:需等待
kernel32.dll和user32.dll加载完成后注入 - CFG防护规避:x64系统必须使用Thunkless模式,避免触发控制流保护
- VAD内存限制:ARM64系统需通过
IoReplaceFileObjectName重定向实现注入
总结与法律声明 ⚠️
injdrv作为内核级注入工具,仅用于合法的系统调试和逆向工程学习。在使用过程中需严格遵守:
- 仅在授权环境中测试
- 不得用于未授权的进程修改
- 遵守目标系统的使用许可协议
项目源码采用MIT许可协议,核心实现位于src/injdrv/main.c,注入逻辑封装在src/injlib/injlib.c中。深入学习建议结合Windows内核编程文档和WDK开发工具链,理解APC机制与进程初始化的底层交互原理。
通过合理利用injdrv的底层注入能力,开发者可以构建更强大的系统级调试工具,但需始终牢记"能力越大责任越大"的安全准则,共同维护开源社区的技术伦理。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



