1 环境搭建 vs2019+wdk10
我自己搭建了两套环境(window7和xp系统)
vs2019下载官网社区版即可 免费的无需破解
wdk10 注意两者要下载对应的版本 ,我这里下载的都是最新的版本 两者可以无缝衔接
VS2019 安装插件选择C++即可
一路下一步即可 安装完成后再安装 WDK 安装路径好像不能改 我的直接安装到了 D:\Windows Kits
安装完成后 会有驱动安装的提示 ,一路next安装即可 一定要安装 !!! 我之前一直都没安装上 所以VS2019没有 对于的驱动开发模块
登录VS2019时 选择创建新项目可看到 有了驱动开发模块。
WDK安装完成后,在开始菜单中找到windbg程序对应的位置,右击发送快捷方式到桌面
配置启动参数
"D:\Windows Kits\10\Debuggers\x64\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_2,resets=0
操作系统环境遍历设置
_NT_SYMBOL_PATH SRV*D:\Myself_Software\Windows_soft\symbols* http://msdl.microsoft.com/download/symbols 一定要注意的空格呀!
2 虚拟机操作系统安装 xp与win7 64位 暂时没安装win10
往上有人说 wdk版本太新不能调试xp系统,经自己测试可以调试 ,网上说的都不靠谱啊 一定要自己尝试。
系统安装地址:msdn官网
XP系统如下
注意xp系统不要下载如下版本 不晓得为什么系统文件后缀不是iso而是img
对于window7系统 也是下载如下的版本,原因 其他版本都存在各种各样的问题,踩了太多坑了,不多BB了
操作系统的大小超过4G后 VMware会不能识别到操作系统 所以我们下载的都是纯净版的。
VMware安装操作系统略 自行百度。
操作系统的网路设置可参考:https://blog.csdn.net/qq_33523925/article/details/92387360
3 系统调试端口设置
3.1 xp系统调试端口设置
添加如下代码
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com_2 /baudrate=115200
通过win+R msconfig查看启动项目设置 windows7 系统也是一样的
进入windows7 系统配置
以管理员身份启动cmd,输入 bcdedit /copy {current} /d Win7Debug
然后 win+R msconfig 设置启动项目
注意及时拍快照以便回复系统!!!
系统参数配置如下
4 关于windows7 64驱动签名的问题 参考文章
1 https://www.52pojie.cn/thread-877849-1-1.html
2 https://www.52pojie.cn/thread-1027420-1-1.html
首先去看雪论坛找到签名证书 https://bbs.pediy.com/thread-187925.htm
另外HackingTeam 证书暂时没找 (又找到地址的可以下方评论区回复我)
结合上吾爱破解的两篇文章做出驱动签名的dll, 使用loadPE把我们做出的HookSigntool.dll挂到DSignTool.ext程序上
5 VS2019 创建第一个驱动程序(window7系统的)
6 驱动签名
7 测试驱动
8 收工。
------------------------------------------------------------------------------2021-03-22 中断提权 ------------------------------------------------------------------------------
首先手动在idtr 表注册20号中断
XP系统查看注册 20号中断
运行结果
设置编译器生成固定基址
其他配置
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
// 设置vscode在release开发环境下的 随机基址(否) 固定基址(是)
// IdtEntry函数的编译后的固定地址 0x00401040 为了插入到中断表中
// r idrt 读取中断表地址 0x8003f400
// dq 8003f400 l40 (注意是字母L的小写 不是数字1)
// dw = 双字节WORD格式;
// dd = 4字节DWORD格式 ;
// dq = 8字节格式;
//
//
// 手动注册idt表
// 参考 03号中断 8003f430 8053ee00`0008e8b4 前四位8053+ 后四位ed04 = 函数的实际地址8053e8b4 中间8位 表示中断性质 ee00`0008
// eq 8003f500 0040ee00`00081040 eq 编辑的意思 必须与03号中断保持一致
DWORD g_tmp = 0;
void __declspec(naked) IdtEntry()
{
__asm
{
mov eax, dword ptr ds : [0x8003f500]
mov g_tmp, eax
iretd // 函数结束 注意32位操作系统用iretd 64位的用iret
}
}
void goToIdtEntry()
{
__asm int 0x20 // 跳转我们注册20号中断函数
}
int main()
{
if ((DWORD)IdtEntry != 0x00401040)
{
printf("IdtEntry is not 0x00401040, wrong addr: %p\n", IdtEntry);
system("pause");
exit(-1);
}
printf("IdtEntry函数是固定基址 %p\n", IdtEntry);
// 跳转中断表
goToIdtEntry();
// %x 十六进制整数0f
// %u 无符号十进制整数
// %p 指针
printf("g_tmp = %x\n" ,g_tmp);
printf("g_tmp = %p\n", g_tmp);
system("pause");
return 0;
}