首页
社区
课程
招聘
[原创][2013/4/28更新]windbg高亮插件,已开源
发表于: 2013-4-25 15:02 7009

[原创][2013/4/28更新]windbg高亮插件,已开源

2013-4-25 15:02
7009
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日
有问题请在本贴回



效果图:

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 411
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
XP sp3,windbg 6.12.0002.633 X86,加载程序load楼主插件后,shift+f5,windbg崩溃。

上传的附件:
2013-4-27 19:07
0
雪    币: 3545
活跃值: (1872)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=Elijah;1171258]XP sp3,windbg 6.12.0002.633 X86,加载程序load楼主插件后,shift+f5,windbg崩溃。

[/QUOTE]

win7上测试了下也是这样,这是因为windbg一个会话结束了,原先.load的dll会自动卸载,暂时还没有处理这部分。省事点就直接注入dll。不过新版本简单处理了下,载入后直接loadlibrary使计数加1,这样会话结束后不会自动卸载。
2013-4-28 08:59
0
雪    币: 411
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
试用新版本,感谢发布好工具。
2013-4-28 11:22
0
雪    币: 3545
活跃值: (1872)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
5
自己顶一下,已开源~~
2013-4-29 17:31
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
随手改了一下。
去除了对boost的依赖,使用windows api访问ini。 (因为本人不喜欢boost所以没有)
去除了对windbg sdk的依赖。
允许dll在停止调试时卸载。 (功能点DetourDetach, wndproc设回旧值)
另外两个工程也使其可编译通过了(这个有点无聊,因为这两个工程没有用)
工程升至了vs2010 (因为本人不用vs2008)

下载: windbg-asm-highlight.rar

只测试了x64。 ix86估计问题不大。

楼主这个使现方案的原理是hook textout, 在画字串时会进行计算,会产生一定的迟滞,闪烁感加强了。
这个改起来比较麻烦,待有空的时候再慢慢改这个问题。
上传的附件:
2013-5-1 00:04
0
雪    币: 9
活跃值: (180)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
谢谢分享
2018-10-13 11:18
0
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢分享
2018-10-14 00:15
0
游客
登录 | 注册 方可回帖
返回
//