injdrv源码深度剖析:从Process Notify到APC队列的内核编程精髓

【免费下载链接】injdrv proof-of-concept Windows Driver for injecting DLL into user-mode processes using APC 【免费下载链接】injdrv 项目地址: https://gitcode.com/gh_mirrors/in/injdrv

injdrv是一个基于Windows内核的DLL注入工具,通过Process Notify机制和APC队列实现用户态进程的DLL注入。本文将深入剖析injdrv的核心实现原理,从进程监控到APC注入的完整流程,帮助开发者理解内核级注入技术的精髓。

内核驱动初始化流程

injdrv的驱动入口点DriverEntry函数位于src/injdrv/main.c,负责驱动的初始化工作。该函数主要完成以下任务:

  1. 注册驱动卸载例程DriverDestroy
  2. 创建注入配置(DLL路径设置)
  3. 初始化注入驱动核心功能
  4. 注册进程创建通知和镜像加载通知例程

关键代码如下:

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。

APC调度流程 图:KiUserApcDispatcher函数反汇编,展示APC调度流程

用户态APC处理流程

Windows内核提供了KiUserApcDispatcherKiUserCallForwarder两个关键函数处理用户态APC。从反汇编代码可以看到,APC调度过程会检查APC类型,处理WOW64进程的特殊情况,并最终调用APC例程。

KiUserCallForwarder函数 图:KiUserCallForwarder函数反汇编,负责转发APC调用

注入效果验证

injdrv提供了完整的注入验证机制,通过Process Explorer可以观察到目标进程已成功加载注入的DLL。下图展示了putty.exe进程被注入后的模块列表:

DLL注入效果 图:Process Explorer显示注入的DLL已成功加载到目标进程

驱动安装与使用

injdrv提供了命令行工具injldr用于驱动的安装和管理。通过管理员命令提示符执行以下命令即可安装并启动驱动:

injldr -i

安装过程会显示驱动加载状态和进程监控日志:

injldr工具运行界面 图:injldr工具安装驱动并启动监控会话

总结

injdrv通过精妙的内核编程技术,实现了基于Process Notify和APC队列的DLL注入机制。其核心在于利用Windows内核提供的进程监控和异步执行机制,在恰当的时机将DLL加载代码注入到目标进程中。

项目的核心代码结构如下:

通过分析injdrv的源码,开发者可以深入理解Windows内核编程、进程监控和DLL注入等高级技术,为系统级应用开发积累宝贵经验。

要开始使用injdrv,请克隆仓库:

git clone https://gitcode.com/gh_mirrors/in/injdrv

【免费下载链接】injdrv proof-of-concept Windows Driver for injecting DLL into user-mode processes using APC 【免费下载链接】injdrv 项目地址: https://gitcode.com/gh_mirrors/in/injdrv

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐