使用WinDbg双机调试SYS无源码驱动程序

DemonGan

发布日期: 2019-02-09 22:44:12 浏览量: 1010
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

背景

有很多学习逆向的小伙伴,逆向一些用户层的程序很熟练了,但是由于没有接触过内核驱动开发,所以对于驱动程序的逆向无从下手。

对于驱动程序的调试可以分为有源码调试和无源码调试。本文主要讨论无源码驱动程序的调试,也就是逆向驱动程序的方法和步骤。本文演示的是使用 VMware 虚拟机和 WinDbg 程序实现双击调试。

实现过程

VMware虚拟机设置

1.打开相应 WMware 虚拟机上的 “Edit virtaul machine settings”。

2.“Hardware”选项中 —> 点击“Add”,添加一个串口设备 Serial Port 。如果有打印机(Printer)存在,则先移除虚拟机的 打印机 硬件,然后再添加串口设备 Serial Port,因为打印机会占用串口 COM1。

3.“Next”,在“Serial Port” 里选中 “Output to named pipe”。

4.“next”,然后如下设置:

5.“Finish”之后,回到如下“Virtual Machine Settings”页面,在“I/O Mode” 里选中“Yield CPU on poll”。

6.点击“OK”之后,WMware 虚拟机设置就完成了。接下来,我们开机,进入虚拟机系统中,并对虚拟机系统进行设置,将其设置成调试模式。

虚拟机里的操作系统设置

1.如果操作系统不是 Win10,则开机进入桌面后,在运行窗口输入 msconfig —> 引导 —> 高级选项 —> 调试 —> 确定。

2.如果操作系统是 Win10,则

1.在设置 —> 安全和更新 —> 针对开发人员 —> 开发人员模式;

2.管理员身份运行CMD,输入 bcdedit /set testsigning on 开启测试模式;

3.在运行窗口输入 msconfig —> 引导 —> 高级选项 —> 调试 —> 确定;

3.关机重启,这样虚拟机里的操作系统就设置完成了。接下来,就开始在真机系统上对 WinDbg 程序进行设置并下断点调试了。

使用 WinDbg 程序开始双机调试无源码驱动程序

1.我们在真机上以管理员身份运行 WinDbg,点击 File —> Kernel Debug —> COM,然后在 Port中输入:\\.\pipe\com_1,其它都勾选上,点击“确定”。

2.通常 WinDbg 就会一直显示 等待建立连接(Waiting to reconnect…) 状态,如下面所示:

3.这时,需要我们点击 Break(Ctrl+Break) 暂停调试。这样,虚拟机就会停下来,我们就可以在 WinDbg 中输入命令。

4.我们就可以输入命令,使用 WinDbg 程序来调试虚拟机中的操作系统内核。先来介绍些常用的 WinDbg 命令:

  1. lm :表示列举虚拟机加载和卸载的内核模块起始地址和结束地址。
  2. bubp :下断点。
  3. uuf :反汇编指定地址处的代码。
  4. dd 查看指定地址处的数据。
  5. dt 查看数据类型定义。

其中,bu 命令用来设置一个延迟的、以后再求解的断点,对未加载模块中的代码设置断点;当指定模块被加载时,才真正设置这个断点;这对动态加载模块的入口函数或初始化代码处加断点特别有用。

在模块没有被加载的时候,bp 断点会失败(因为函数地址不存在),而 bu 断点则可以成功。新版的 WinDBG 中 bp 失败后会自动被转成 bu。

那么,在无源码的驱动程序 .sys 的入口点函数 DriverEntry 中下断点的指令为:

  1. bp 驱动模块名称+驱动PE结构入口点函数偏移
  2. // 如:bp DriverEnum+0x1828

5.我们演示调试无源码驱动程序 DriverEnum.sys,虚拟机系统环境是 Win10 64位。然后,在 WinDbg 程序中输入指令:bp DriverEnum+0x1828。其中,bp表示下断点;DriverEnum 表示驱动程序 DriverEnum.sys 的驱动模块名称;0x1828 表示驱动程序 DriverEnum.sys 的入口点偏移地址,这个偏移地址可以由 PE 查看工具查看得出,如下图:

输入完下断点指令后,我们在输入 g,让系统继续执行,直到执行到断点处,便会停下。

我们,在虚拟机系统里,加载并启动我们的驱动程序 DriverEnum.sys,在启动之后,真机上的 WinDbg 成功在 DriverEnum.sys 的入口点 DriverEntry 处停下。这时,我们可以使用快捷键 F10 或者 F10 步过或者步入来单步调试,还可以继续使用 bp 下多个断点。

总结

步骤并不复杂,只是啰嗦而已。大家细心点跟着上述教程,认真操作就可以成功对无源码的驱动程序的入口点函数 DriverEntry 下断点,实现调试。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件

发送私信

这一切都不是我的,但总有一天,会是我的

73
文章数
67
评论数
最近文章
eject