-
-
[原创][2013/4/28更新]windbg高亮插件,已开源
-
发表于:
2013-4-25 15:02
7008
-
[原创][2013/4/28更新]windbg高亮插件,已开源
2013/4/29:开源,求精~~
代码说明:
工程名为SciLexer是因为先测试scintilla里的SciLexer组件,测试通过后发现完全可以利用的asm词法解析引擎,顺便就建立了windbg高亮插件子工程名为hs。test子工程只是测试SciLexer组件的,已经过期,基本上只看hs子工程就OK。
工程属性里设置了windbg插件sdk的目录,本来我是想写windbg插件的,结果发现根本不需要sdk,任何普通dll都可以用.load命令加载,所以如果你没有windbg sdk的话,直接删除engextcpp.cpp并更改dllmain等相关代码(我现在的机子没有编程环境),所以默认编译需要:vs2008及以上,boost库,windbg sdk。
hook ExtTextOutW,并设置SetTextColor设置文本色,当然也可以设置背景色,但貌似还不需要。ExtTextOutW_Hook中判断是否要处理(如判断窗口是否是汇编窗口和命令窗口,并加入窗口缓存),要处理的话调用CText类的lex函数分析,lex分析完毕会调用CText里的SetStyles,在这里我们才进行文本着色,
SetStyles( int length, const char *styles )
length是字符个数,styles是一段buffer,每个字节对应一个处理过的字符,它的值就是该字符显示为什么颜色。如CPU就是6,对应SciLexer\include\SciLexer.h里的SCE_ASM_CPUINSTRUCTION,举例:
mov eax,0
styles里对应 666088802
其中8是SCE_ASM_REGISTER,2是SCE_ASM_NUMBER,所以我们显示的时候要分段显示,对同一值的调用一次SetTextColor,并马上ExtTextOutW,并修正X坐标以便下一个ExtTextOutW调用,测试发现每次ExtTextOutW只显示一行,所以不用管Y坐标。
不足:
ExtTextOutW的参数是unicode字符,但是词法分析的lex函数会调用StyleContext,该类并不支持unicode——也可能支持但我没有测试成功,反正最后是转换成多字节处理的,这可能是影响效率的一个重要因素。
hook lib用的detours,x64版本恕不提供源码,因为我也没有
(如果纠结源码可以用mhook,支持x64,原理是差不多的,我还port一份到mingw)
恕表达能力不强,关于源码有太多可以说的了,有问题可以本帖回
feature:
windbg文本高亮,支持x64
changelog:
2013年4月28日
解决shift+f5停止调试bug
2013年4月26日
增加地址、opcode、jumpcall指令的颜色设置
增加命令窗口用户输入的颜色设置(只是简单地对>后的文字进行加色)
2013年4月25日
首个版本发布,暂时只有Disassembly窗口的高亮
使用方法:
将hs.dll放入32位windbg的安装目录,hs-x64.dll放入64位(x64)windbg的安装目录,
运行windbg,输入命令
.load hs
64位是
.load hs-x64
note:
首次运行是会产生asm.ini文件,里面可以设置颜色、汇编指令等,如果开了UAC而以普通权限运行windbg就可能没有asm.ini产生,只需要以管理员权限运行windbg然后加载一次就行了
特别感谢linx2008 http://hi.baidu.com/linx2008/item/0bee3aedc6d49e275b2d6441
by lynnux,2013年4月25日
有问题请在本贴回
效果图:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!