0x01 前言
Windbg
作为 Windows
下的主流调试器,除了人机交互相比其他调试器略有不足外,其他功能都是十分强大的存在。在所有的调试器中断点功能都是必不可少的,Windbg
可以使用 bp
等命令很方便的对地址和符号下断点,这些都是非常常用的,但是对字符下断点,尤其是 unicode
字符下断点则用的比较少,但是用的好确实能解决许多问题,比如需要记录和断下一些关键 API 的参数字符等。
0x02 对关键 API 下字符比较断点
如何使字符比较断点断下,使用 Windbg
脚本是一种不错的选择(这里的脚本并非 Python
而是 Windbg
自带的能够被解析的脚本,语法简单),这里并不推荐使用命令行,因为在文件中编辑脚本便于检测错误。 首先来看一下选取的可执行文件的例子,这是一个常用的看图软件,使用 FreeImage
为核心技术,可以方便的读取图片文件,这里以随机从网上下载的 test.bmp
图片作为输入,查看是否调用了系统底层函数 Kernel32!CreateFileW
,以及是否能通过参数及时的断下。 首先在 C 盘的根目录下新建 commands.txt
脚本文件以便让 Windbg
去读取执行。 之后编写以下脚本,/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 读取脚本文件。 运行之后查看执行结果发现成功断下,并且传入 CreateFileW
的第一个参数符合图片路径。
0x03 官网更为详细的记载以及扩展