0x01 前言
Windbg
作为 Windows
下的主流调试器,除了人机交互相比其他调试器略有不足外,其他功能都是十分强大的存在。
- 在所有的调试器中断点功能都是必不可少的,
Windbg
可以使用 bp
等命令很方便的对地址和符号下断点,这些都是非常常用的,但是对字符下断点,尤其是 unicode
字符下断点则用的比较少,但是用的好确实能解决许多问题,比如需要记录和断下一些关键 API 的参数字符等。
0x02 对关键 API 下字符比较断点
- 如何使字符比较断点断下,使用
Windbg
脚本是一种不错的选择(这里的脚本并非 Python
而是 Windbg
自带的能够被解析的脚本,语法简单),这里并不推荐使用命令行,因为在文件中编辑脚本便于检测错误。
- 首先来看一下选取的可执行文件的例子,这是一个常用的看图软件,使用
FreeImage
为核心技术,可以方便的读取图片文件,这里以随机从网上下载的 test.bmp
图片作为输入,查看是否调用了系统底层函数 Kernel32!CreateFileW
,以及是否能通过参数及时的断下。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191001195927725.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTI0OTQy,size_16,color_FFFFFF,t_70)
- 首先在 C 盘的根目录下新建
commands.txt
脚本文件以便让 Windbg
去读取执行。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191001200609570.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTI0OTQy,size_16,color_FFFFFF,t_70)
- 之后编写以下脚本,
/mu
是指定 Unicode
字符;${/v:EventName} poi(esp+4)
则是指定别名,poi(esp+4)
表示 Kernel32!CreateFileW
的第一个参数,这个需要看具体情况;$spat
函数作为比较函数,这里比较第一个参数是否含有 bmp
后缀,也就是刚刚传入的 test.bmp
;ad *
表示每次执行一次清空一下别名,最后如果条件成立则打印并且断下。
as /mu ${/v:EventName} poi(esp+4)
.if ($spat(@"${EventName}", "*.bmp*") == 0) {ad*; gc } .else {.echo; du poi(esp+4); ad*}
- 最后输入
bp KERNEL32!CreateFileW "$$<c:\commands.txt"
让 Windbg 读取脚本文件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191001201434818.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTI0OTQy,size_16,color_FFFFFF,t_70)
- 运行之后查看执行结果发现成功断下,并且传入
CreateFileW
的第一个参数符合图片路径。
![在这里插入图片描述](https://img-blog.csdnimg.cn/201910012016564.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTI0OTQy,size_16,color_FFFFFF,t_70)
0x03 官网更为详细的记载以及扩展