打开隐藏文件
打开XP虚拟机的隐藏文件可以看到boot.ini文件
配置系统引导
Windows7_x86
以管理员身份运行cmd 去配置msconfig
由于GUI界面工具的限制,所以我们使用控制台命令去操作
bcdedit 在NT60系列操作系统(Windows 8/7/Vista/2008)中的一个命令行工具
使用bcdedit
修改windows7_32系统的启动菜单
使用注册表工具是修改不了该配置的。
操作步骤
我们需要做的就是系统配置里,去创建引导,具体步骤如下:
使用bcdedit /?
查看相关命令操作
使用该命令bcdedit /copy {current} /d DebugEntry
,将当前的引导复制粘贴一份
随即生成id a3565eff-40d7-11ed-a882-ce94402d623c
并且在GUI界面多出一份拷贝出来的引导
使用bcdedit /displayorder {a3565eff-40d7-11ed-a882-ce94402d623c} /addlast
将该引导添加到列表尾部
使用该命令配置虚拟机与物理交互的频率(波特率)bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200
使用该命令设置boot断点,当boot加载的时候,就断下来bcdedit /bootdebug {a3565eff-40d7-11ed-a882-ce94402d623c} ON
使用该命令配置操作系统断点bcdedit /debug {a3565eff-40d7-11ed-a882-ce94402d623c} ON
使用该命令配置选择引导超时时间为30秒
配置完后在电脑中重启电脑
虚拟机串行端口配置
然后关机配置虚拟机的相关操作
选择添加串行端口
相关配置如图所示:
windbg的配置
前提是已经安装了WDK
配置windbgx86.exe
"C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\windbg.exe" -y SRV*E:\symbol*[http://msdl.microsoft.com/download/symbols](http://msdl.microsoft.com/download/symbols) -b -k com:port=//./pipe/com_1,baud=115200,pipe
软件启动路径:"C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\windbg.exe"
符号加载路径:-y SRV*E:\symbol*[http://msdl.microsoft.com/download/symbols](http://msdl.microsoft.com/download/symbols)
配置串行端口:-b -k com:port=//./pipe/com_1,baud=115200,pipe
根据自己的情况去修改。
使用lm
查看加载符号路径或者加载情况
使用.reload
根据当前需要去加载符号
操作系统下载网址:msdn,我告诉你
环境准备:
在Windows7X86虚拟机里下载VS2008
VS2008 下载网址:
WDK的安装
VS2019下载SDK和WDK
查看本机系统版本号
下载WDK的对应版本
WDK与SDK的版本要一致
简单例子验证驱动是否正确安装
测试代码:
//相当于普通程序的 windows.h
#include <ntddk.h>
//卸载函数
void DriverUnload(PDRIVER_OBJECT object) {
//打印一句话,方便观察
DbgPrint("hello world: driver is unloading...");
}
//主函数,相当于main
//driver里有些信息,就是关于本驱动的
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
//驱动使用DbgPrint(),普通程序用printf(),你懂我意思
DbgPrint("hello world");
//你可以认为我们赋值给了一个回调函数指针
//恰当的时机(在卸载这个驱动的时候),就会调用这个函数指针
driver->DriverUnload = DriverUnload;
//就是return 0而已,只是好看点
return STATUS_SUCCESS;
}
错误1297设备驱动程序不安装在任何设备上,如果需要,请使用基本驱动程序。
把该文件删掉,因为我们没有做硬件驱动的处理。
警告处理
方法一:
重新编译会发现 错误,因为警告等级太强了。
使用宏方法告诉编译器未引用的形参
UNREFERENCED_PARAMETER
//相当于普通程序的 windows.h
#include <ntddk.h>
//卸载函数
void DriverUnload(PDRIVER_OBJECT object) {
UNREFERENCED_PARAMETER(object);
//打印一句话,方便观察
DbgPrint("hello world: driver is unloading...");
}
//主函数,相当于main
//driver 里有些信息,就是关于本驱动的
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
UNREFERENCED_PARAMETER(driver);
UNREFERENCED_PARAMETER(reg_path);
//驱动使用DbgPrint(),普通程序用printf(),你懂我意思
DbgPrint("hello world");
//你可以认为我们赋值给了一个回调函数指针
//恰当的时机(在卸载这个驱动的时候),就会调用这个函数指针
driver->DriverUnload = DriverUnload;
//就是return 0而已,只是好看点
return STATUS_SUCCESS;
}
编译成功,无报错
方法二:
修改警告等级
在“C/C++——常规”中修改警告等级为“3”;警告视为错误设为“否”,如图
设置警告模式
在“Driver Signing——General”中修改“Sign Mode”为“Off”,如图
虚拟机驱动测试
配置完后重新编译放进虚拟机里加载运行
直接蓝屏
原因是缺少文件,而造成文件缺失的原因是编写代码的时候没有配置值好。
然后在VS2019进行相关配置
配置完后重新编译放进虚拟机里加载运行,便看到驱动加载成功
使用Degview查看输出消息
附录:
- 该文件驱动是不能跑虚拟机的,是没有效果的。
开启监控的时候,可以监控三环进0环的线程
可以拿到线程的EIP,并且可以修改,造成劫持
直接做注入 远程call。
ThreadSpy
https://github.com/SpadeXiu/ThreadSpy
PT调试
https://github.com/intelpt/WindowsIntelPT