双击调试配置请查看 连接: https://www.cnblogs.com/aliflycoris/p/5877323.html
一丶编译的区别.
首先, 还是使用 WDK7.1.7600 编写. 但是编译的时候, 要使用 x64 来编译. 其代码框架不变.
1. 驱动加载
驱动加载的程序还是使用普通的驱动加载即可. 但是 64 位 (win7), 微软推出了两种新的方式.
1.DSE
2.KPP
DSE: 这个机制是 驱动强制签名, 也就是说你编写的驱动, 都要进行签名. 才可以加载.
KPP: 内核补丁保护, 比如我们说的 SSDT 表,(ring3 -> ring0 中专表) 在 XP 下是可以 HOOK 的, 现在, 这些都被保护了, 只要你更改了系统的核心源码, 直接蓝屏.
2. 去掉 KPP 保护.
在编写的 64 为内核驱动, 如果我们的系统是安全模式启动, 则没有 DSE 保护. 也就是说不用签名.
现在有工具可以直接去使用.
第一个选项是, 点击之后, 你的系统启动则是在安全模式启动.
第二个选项是, 点击之后, 你的驱动可以添加一个测试签名.
3. 注意的问题
如果进行了上面来了两个步骤, 我们的驱动还是不能加载, 那么这也是一个坑. 微软说了, 在 PE 文件中, 你的驱动必须有签名检查.
正确的姿势:
首先, 编写驱动的 source 文件加上命令行选项.
LINKER_FLAGS = /INTEGRITYCHECK
且必须放在最下面, 加了这个选项, 那么你的驱动, 可以使用微软提供的 HOOK 函数了.
二丶 64 位 GDT 表
首先, 地址变大了, 变成了 48 位的地址, 其高位是 FFFF, 属于是符号扩展.
IDT 也是变大了.
其内核中的结构体也变大了.
不光这个结构体, 还有里面的, 有兴趣的自己解析一下查看.
三丶 SSDT 表的寻找, 以及 SSDT 加密
我们知道 ring3 -> ring0 会通过 SSDT 表进行中专,
其 EIP 会存放在 msr 寄存器中. xp 下是 174 175 176
现在查看 AMD 的 CPU 指令, 会发现. 进 0 环会调用 SystemCall 命令.
其 MSR 寄存器是在 C000081 C000082 C000083
其 EIP 会存放在 82 里面.
那么我们可以 使用指令.
rdmsr
C00082
读取三环进 0 环的地址. 对其解析.
因符号文件没有下载完全. 所以还暂时没有办法解析.
SSDT 加密算法是 模块首地址 + 当前表中的地址 >>4 . 我们要计算地址的时候. 只需要将 SSDT 表中的内容的函数地址 <<4 位加上模块首地址即可.
来源: https://www.cnblogs.com/iBinary/p/8395870.html