开源易语言驱动SSDTnbspnbspHookSDK开发模板
功能说明:
该程序是一段使用易语言编写的 Windows 内核模式驱动程序源码。从整体结构来看,这是一个典型的底层系统工具框架,主要用于实现系统调用层面的挂钩(Hook)技术,具体表现为对 SSDT(System Service Descriptor Table,系统服务描述表)表的读写与修改。此类驱动通常在 Ring0 权限下运行,能够访问和操作内核关键数据结构,常见于游戏辅助开发、系统安全研究或反病毒对抗技术的教学演示中。
### 一、程序总体架构与功能概述
程序属于“驱动入口”程序集,表明其编译后将生成一个.sys 格式的驱动文件。整个程序的核心逻辑围绕内核对象的加载、卸载以及与用户态应用程序的通信展开。通过定义特定的设备名称和符号链接,用户态程序可以通过 CreateFile 打开该设备,并通过 DeviceIoControl 发送控制码(IOCTL)来请求执行具体的内核操作。
根据代码中的注释信息(如“魔鬼作坊”、“外挂制作教程”、“驱动过保护教程”等),可以看出该代码不仅是一个功能实现,更是一个用于教学或作为基础模板存在的示例程序。它展示了如何在易语言环境下构建一个简单的内核驱动,并处理核心的 SSDT 挂钩逻辑。
### 二、关键子程序功能详解
程序中包含以下几个核心子程序,它们共同构成了驱动的完整生命周期:
1. **.子程序 _启动子程序**
这是驱动加载时的入口点,对应内核中的 DriverEntry 回调函数。当驱动程序被系统加载时,此子程序最先执行。
* **功能**:主要进行初始环境检查或变量设置。当前代码中直接返回 0,表示加载成功。
* **注释信息**:其中包含了大量关于“魔鬼作坊”论坛及各类教程的链接声明,包括易语言按键/封包技术、内存辅助教程、OD/CE/汇编基础等。这证实了该程序的背景是服务于游戏辅助学习和底层技术培训的教育性质代码。
2. **.子程序 DriverUnload**
这是驱动的卸载函数,对应内核中的 DriverUnload 回调。当驱动被管理员手动停止或被系统卸载时触发。
* **资源清理**:代码首先检查 `初始化` 标志位,如果已初始化,则调用 `ExFreePool` 释放之前分配的钩子列表内存 `addr_HookerList`。这是防止内存泄漏的关键步骤。
* **对象销毁**:随后,它构造 ANSI 字符串转换为 UNICODE 字符串,删除符号链接(`IoDeleteSymbolicLink`),读取驱动对象指针,最后删除设备对象(`IoDeleteDevice`)。这确保了驱动卸载后不会残留未注册的接口或句柄,保证系统的稳定性。
3. **.子程序 DispatchCreate**
处理设备创建请求(IRP_MJ_CREATE)。当用户态程序尝试通过文件名打开该驱动设备时,系统会调用此函数。
* **功能**:初始化 IRP(I/O 请求包)的状态为成功(`#STATUS_SUCCESS`),并立即完成请求(`IoCompleteRequest`)。这意味着驱动接受所有的打开请求,不在此处做权限校验。
4. **.子程序 DispatchClose**
处理设备关闭请求(IRP_MJ_CLOSE)。当用户态程序关闭驱动句柄时触发。
* **功能**:与 DispatchCreate 类似,简单确认状态为成功并完成请求,无额外逻辑。
5. **.子程序 DispatchDeviceControl**
这是整个程序中逻辑最复杂、最重要的部分,负责处理设备控制请求(IRP_MJ_DEVICE_CONTROL)。用户态应用通过此接口向驱动发送指令。
* **参数解析**:代码从 IRP 包中提取了控制码(`uIoControlCode`)、输入输出缓冲区指针及大小。
* **挂钩逻辑 (Control Code 2236416)**:
* 当控制码等于 `2236416` 时,触发 Hook 操作。
* 程序首先验证 `初始化` 状态是否为真。
* 接着遍历 `addr_HookerList`(钩子列表),循环次数由 `_hook 个数` 决定。
* 在循环中,从列表中读取 SSDT 索引(`SSDT_Index`)和新函数地址(`新函数地址`)。
* 调用 `Write_SSDT` 函数将系统服务表中的指定项修改为新的函数地址。一旦修改成功,原系统的某些系统调用将被重定向到用户自定义的内核函数上。
* **去挂钩逻辑 (Control Code 2236420)**:
* 当控制码等于 `2236420` 时,触发 UnHook 操作。
* 流程与 Hook 类似,但在遍历时读取的是 `原始函数地址`。
* 同样调用 `Write_SSDT`,但这次是将 SSDT 条目恢复为原来的地址。这对于驱动卸载前修复系统至关重要,防止因保留挂钩而导致系统崩溃或蓝屏。
* **默认处理**:若控制码不匹配,返回无效参数状态。
### 三、技术细节与安全机制分析
1. **SSDT 挂钩技术**:
代码明确使用了 `SSDT_Read_IRP`、`Write_SSDT` 等封装函数。SSDT 挂钩是一种经典的 Rootkit 技术,常用于隐藏进程、文件或端口。在此程序中,它允许动态拦截特定的系统服务。例如,可以拦截 `NtOpenProcess` 来阻止其他程序检测特定进程的内存,这在游戏辅助中非常常见。
2. **内存管理**:
程序中定义了全局变量 `addr_HookerList`,并在驱动启动前(推测在其他地方)分配内存以存储挂钩列表。每个挂钩记录似乎占用 12 字节(索引 4 字节 + 原始地址 4 字节 + 新地址 4 字节),这种紧凑的结构有利于在内核堆中高效管理多个钩子。
3. **通信协议**:
采用标准的 IOCTL 机制。控制码 `2236416` 和 `2236420` 是通过 `FILE_DEVICE_UNKNOWN` 宏计算得出的自定义代码。这意味着开发者可以在不修改内核代码的情况下,通过改变这些数字来区分不同的命令,增加了协议的灵活性。
4. **调试与教育目的**:
代码中大量的中文注释解释了各个模块的作用,甚至列出了相关的视频教程网站。这表明该代码的主要用途不是直接投入商业产品,而是作为一个可运行的范例,帮助学习者理解易语言如何编写驱动、如何处理内核 API 以及如何实现底层的内存与系统调用劫持。
### 四、总结
综上所述,这段易语言代码是一个完整的、具备基本功能的**内核级 SSDT 挂钩驱动程序**。它实现了驱动的生命周期管理(加载、卸载、设备通信),并提供了一套标准化的接口用于安装和移除系统服务层级的函数拦截器。虽然代码片段在某些 API 调用上较为简洁(如 `ReadIntByAddr`、`Write_SSDT` 的具体实现在外部),但其框架结构清晰,涵盖了 Windows 驱动开发的核心要素。对于想要学习游戏底层技术、系统安全或易语言内核编程的用户来说,这是一份具有较高参考价值的基础模板。在实际应用中,需注意此类技术可能违反部分软件的服务条款,且修改 SSDT 在现代操作系统(如 Vista 之后的版本开启了 PatchGuard)中极易导致系统崩溃或被安全软件识别查杀,因此多用于研究环境或经过特殊绕过处理的场景。
======驱动入口
| |
| |------ _启动子程序
| |
| |------ DriverUnload
| |
| |------ DispatchCreate
| |
| |------ DispatchClose
| |
| |------ DispatchDeviceControl
| |
| |------ DriverEntry
| |
| |------ SDK_Hook
| |
| |------ SDK_初始化Hook
| |
| |------ SDK_取原始函数地址
| |
| |------ SSDT_HOOK
| |
| |
======辅助
| |
| |------ Get_KeServiceDescriptorTable_ServiceTableBase_Address
| |
| |------ Write_SSDT
| |
| |------ ReadIntByAddr
| |
| |------ Call
| |
| |------ CALL_
| |
| |------ GetProcAddressAddress
| |
| |------ GetIntAddress
| |
| |------ SYSCALL_INDEX
| |
| |------ Get_Func_Address
| |
| |
======Fake函数
| |
| |------ NewZwOpenProcess
| |
| |------ NewZwTerminateProcess
| |
| |
======调用的Dll
| |
| |---[dll]------ DbgPrint
| |
| |---[dll]------ DbgPrintInt
| |
| |---[dll]------ DbgPrintString
| |
| |---[dll]------ strlen
| |
| |---[dll]------ _Write_Int
| |
| |---[dll]------ _Read_Int
| |
| |---[dll]------ _Write_String
| |
| |---[dll]------ _Read_String
| |
| |---[dll]------ _Write_DRIVER_OBJECT
| |
| |---[dll]------ _Read_DRIVER_OBJECT
| |
| |---[dll]------ _Write_IRP
| |
| |---[dll]------ _Read_IRP
| |
| |---[dll]------ IoCreateDevice
| |
| |---[dll]------ IoCreateSymbolicLink
| |
| |---[dll]------ RtlAnsiStringToUnicodeString
| |
| |---[dll]------ RtlInitAnsiString
| |
| |---[dll]------ RtlFreeUnicodeString
| |
| |---[dll]------ IoIsWdmVersionAvailable
| |
| |---[dll]------ IoDeleteDevice
| |
| |---[dll]------ IoDeleteSymbolicLink
| |
| |---[dll]------ IoCompleteRequest
| |
| |---[dll]------ MmGetSystemRoutineAddress
| |
| |---[dll]------ _Read_SSDT
| |
| |---[dll]------ ExAllocatePool
| |
| |---[dll]------ ExFreePool
注:本站源码主要来源于网络收集。如有侵犯您的利益,请联系我们,我们将及时删除!
部分源码可能含有危险代码,(如关机、格式化磁盘等),请看清代码在运行。
由此产生的一切后果本站均不负责。源码仅用于学习使用,如需运用到商业场景请咨询原作者。
使用本站源码开发的产品均与本站无任何关系,请大家遵守国家相关法律。