injdrv源码深度剖析:从Process Notify到APC队列的内核编程精髓
injdrv是一个基于Windows内核的DLL注入工具,通过Process Notify机制和APC队列实现用户态进程的DLL注入。本文将深入剖析injdrv的核心实现原理,从进程监控到APC注入的完整流程,帮助开发者理解内核级注入技术的精髓。## 内核驱动初始化流程injdrv的驱动入口点`DriverEntry`函数位于[src/injdrv/main.c](https://link
injdrv源码深度剖析:从Process Notify到APC队列的内核编程精髓
injdrv是一个基于Windows内核的DLL注入工具,通过Process Notify机制和APC队列实现用户态进程的DLL注入。本文将深入剖析injdrv的核心实现原理,从进程监控到APC注入的完整流程,帮助开发者理解内核级注入技术的精髓。
内核驱动初始化流程
injdrv的驱动入口点DriverEntry函数位于src/injdrv/main.c,负责驱动的初始化工作。该函数主要完成以下任务:
- 注册驱动卸载例程
DriverDestroy - 创建注入配置(DLL路径设置)
- 初始化注入驱动核心功能
- 注册进程创建通知和镜像加载通知例程
关键代码如下:
DriverObject->DriverUnload = &DriverDestroy;
Status = InjCreateSettings(RegistryPath, &Settings);
Status = InjInitialize(DriverObject, RegistryPath, &Settings);
Status = PsSetCreateProcessNotifyRoutineEx(&InjCreateProcessNotifyRoutineEx, FALSE);
Status = PsSetLoadImageNotifyRoutine(&InjLoadImageNotifyRoutine);
Process Notify机制实现
进程创建通知是实现注入的基础,injdrv通过PsSetCreateProcessNotifyRoutineEx注册进程创建回调函数InjCreateProcessNotifyRoutineEx,该函数在src/injdrv/main.c中定义。
当系统中创建新进程时,该回调函数会被触发,此时驱动可以获取进程ID、父进程ID等关键信息,为后续注入做准备。注册代码如下:
PsSetCreateProcessNotifyRoutineEx(&InjCreateProcessNotifyRoutineEx, FALSE);
APC注入核心原理
APC(异步过程调用)是Windows内核中的一种异步执行机制,injdrv利用KeInsertQueueApc函数将APC例程插入到目标进程的APC队列中,实现DLL的注入。相关实现位于src/injlib/injlib.c:
BOOLEAN Inserted = KeInsertQueueApc(Apc, // Apc
Context, // Context
SystemArgument1, // SystemArgument1
SystemArgument2); // SystemArgument2
APC注入的关键在于构造APC对象,并将其插入到目标线程的APC队列中。当目标线程进入可警告等待状态时,APC例程会被执行,从而加载指定的DLL。
图:KiUserApcDispatcher函数反汇编,展示APC调度流程
用户态APC处理流程
Windows内核提供了KiUserApcDispatcher和KiUserCallForwarder两个关键函数处理用户态APC。从反汇编代码可以看到,APC调度过程会检查APC类型,处理WOW64进程的特殊情况,并最终调用APC例程。
图:KiUserCallForwarder函数反汇编,负责转发APC调用
注入效果验证
injdrv提供了完整的注入验证机制,通过Process Explorer可以观察到目标进程已成功加载注入的DLL。下图展示了putty.exe进程被注入后的模块列表:
图:Process Explorer显示注入的DLL已成功加载到目标进程
驱动安装与使用
injdrv提供了命令行工具injldr用于驱动的安装和管理。通过管理员命令提示符执行以下命令即可安装并启动驱动:
injldr -i
安装过程会显示驱动加载状态和进程监控日志:
总结
injdrv通过精妙的内核编程技术,实现了基于Process Notify和APC队列的DLL注入机制。其核心在于利用Windows内核提供的进程监控和异步执行机制,在恰当的时机将DLL加载代码注入到目标进程中。
项目的核心代码结构如下:
- 驱动主程序:src/injdrv/main.c
- 注入库实现:src/injlib/injlib.c
- 注入工具:src/injldr/main.c
通过分析injdrv的源码,开发者可以深入理解Windows内核编程、进程监控和DLL注入等高级技术,为系统级应用开发积累宝贵经验。
要开始使用injdrv,请克隆仓库:
git clone https://gitcode.com/gh_mirrors/in/injdrv
更多推荐


所有评论(0)