64位vista,win7中KeServiceDescriptorTable问题

本文介绍在从32位向64位系统移植驱动过程中遇到的问题及解决办法,特别是针对KeServiceDescTable符号导致的加载失败进行了详细分析。

     最近在移植64位驱动,原本在32位驱动中使用到了KeServiceDescTable进行SSDT Hook等。但是在64位系统上是不允许进行SSDT HOOk的。在64位的XP系统上,使用到这个导出符号式没有问题的。但是在64位Vista和Win7下面,如果使用了这个符号,那么你在加载驱动的时候,返回的错误是找到不指定文件。在修这个bug真是有点吃力,只能一点点个跟进去,还好手边有WRK,要不然就完蛋了。首先说说加载驱动的过程吧,首先由应用层启动服务,之后会调用nt中的NtloadDriver,进去之后调用了IopLoadUnloadDriver(驱动卸载也是调用这个,只是参数改为FALSE),最好调用了IopLoadDriver进行。在这个函数中才是真正的加载驱动,包括加载镜像文件,检查导入表,修改重定位表等。具体的还是要看WRK的代码了。WRK虽然不是具体操作系统的原始代码,但是整个框架是有的。

    不说这个了,跟到IopLoadDriver之后,通过错误信息,还以为是镜像文件不存在导致的呢。后来发现在进行检查导入表的时候返回失败了。但是导入表中的函数实在是太多了,单步调就太痛苦了。在返回错误的时,下单点,查看当前检测的符号名,基本上确定是由KeServiceDescriptionTable导致的了。之后,专门写了专门用来检查导入表符号的小工具,真是有点累。这个工具主要的功能就是静态分析PE文件的导入表,挨个对导入表中的符号,去导入文件的导出表中去搜索。搜索的代码基本上用的是WRK中的代码。奇怪的是,在ntoskrnl.exe中有导出这个符号的。于是我在次调试分析加载过程。使用条件断点,很快确定是这个符号的文件。之后把驱动中使用到KeServiceDescriptionTable驱动。果然不出所料,驱动可以加载起来了。O(∩_∩)O哈哈~
     总结一下,这个符号虽然是有导出的,但是我们不可以使用。这个可能就是为了防止SSDT hook的时候来着吧。

<think>我们正在讨论内核中的KeServiceDescriptorTable,它是Windows NT内核中一个关键的数据结构,用于系统服务调度。 用户的问题只有一个关键词“KeServiceDescriptorTable”,因此我们需要解释这个结构并可能涉及它的使用。 同时,根据规则,我们需要在最后提出3-5个相关问题。 回答结构: 1. 解释KeServiceDescriptorTable是什么。 2. 说明其作用和在Windows内核中的置。 3. 简要提及如何访问和使用(注意:直接操作此表可能不稳定且在不同版本间不兼容)。 4. 注意事项(如内核补丁保护等)。 然后,按照要求提出3-5个相关问题。 注意:由于用户的问题比较简短,我们需要提供足够的信息,但不要过于冗长。</think>### KeServiceDescriptorTable 详解 KeServiceDescriptorTableWindows 内核中一个关键的数据结构,用于管理**系统服务调度表**(SSDT)。它是内核模式驱动程序与用户模式应用程序之间的桥梁,包含所有系统调用的地址信息。 #### 核心特性 1. **数据结构组成**: ```c typedef struct _KSERVICE_TABLE_DESCRIPTOR { PULONG_PTR Base; // 系统调用地址表 PULONG Count; // 调用数量 ULONG Limit; // 最大索引 PUCHAR Number; // 参数表 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR; ``` 2. **内存置**: - 于 `ntoskrnl.exe` 的只读数据段 - 物理地址固定(可通过 `MmGetSystemRoutineAddress` 获取) - 32系统:`0x804AB5A0` (XP) 到 `0x80C94010` (Win10) - 64系统:`0xFFFFF803` 开头的内核地址 3. **功能机制**: - 当用户调用 `NtCreateFile` 等 API 时 - CPU 通过 `SYSENTER` 指令进入内核 - 系统服务号 (eax) 作为索引查询此表 - 跳转到对应的内核函数地址执行 #### 使用注意事项 1. **修改风险**: ```c // 禁止直接修改原始表(触发PatchGuard) __writecr0(readcr0() & ~0x10000); // 关闭写保护 OriginalNtCreateFile = KeServiceDescriptorTable->Base[SYSCALL_INDEX]; KeServiceDescriptorTable->Base[SYSCALL_INDEX] = HookedFunction; __writecr0(readcr0() | 0x10000); // 恢复写保护 ``` - ❌ 此操作会导致蓝屏(BSOD)于 Win7+ 系统 2. **合法访问方式**: - 通过未导出的 `KeAddSystemServiceTable` 注册新服务 - 使用 `MmGetSystemRoutineAddress` 获取函数地址 - 利用 `KiServiceTable` 替代方案(需动态定) 3. **安全防护**: - PatchGuard 监控此表的内存完整性 - 驱动签名强制验证(Windows 10+) - 虚拟化安全(VBS)阻止未签名驱动加载 #### 典型应用场景 1. **系统调用监控**: - 通过 SSDT Hook 记录敏感 API 调用 2. **反病毒/EDR**: - 检测恶意 SSDT 修改行为 3. **内核漏洞利用**: - CVE-2021-43208 等漏洞利用此结构
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值