首页
论坛
专栏
课程

[调试逆向] [原创]开源一个自己 正在写的调试器,希望可以给你看到不一样的烟火

2019-1-9 18:20 6943

[调试逆向] [原创]开源一个自己 正在写的调试器,希望可以给你看到不一样的烟火

2019-1-9 18:20
6943

0x00 前言

几年前,刚接触逆向的时候,自己就萌生一个要单独写一个调试器的想法(当时就觉得自己动手做一个项目,是学习最快的途径)。但彼时的我没有那么多时间去折腾。今年意外地得到一份比较长的病假,遂想着把当时的初衷给完成了。经过一段时间的学习和探索,虽然还不能完全实现自己理想中的调试器,但也已经初具雏形了。

 

那我为啥选择这个时候发出来,而不是等到完成之后再发呢?因为随着项目的推进,自己也开始觉得个人能力和精力的有限。仅凭我个人的努力绝非一朝一夕就能完成它的,况且自己做了这段时间以来,也隐约看到了自己的瓶颈。遂有了把它开源出来的想法,一则可以找些志同道合的朋友完成它,也提升自己的能力;二来,也是趁着这个月自己的病假结束了,希望可以转行找一份逆向相关的工作(研发或者安全相关的工作最好)。

0x01 整体框架

在动手做之前,我就对要实现什么样功能的调试器这点上思考了很久。最后决定要做就做逼格高点的,确定了硬件虚拟化支持+闪瞎眼的界面+动态脚本支持为发展方向。

硬件虚拟化

自己在参照intel手册做硬件虚拟化驱动时,在填充VMCS区域时碰到了问题,让我一点头绪也找不到,所以这部分就暂且没做。已完成的相关源码也包含在工程 vt_driver 里面了,因为64位不支持内联汇编,所以就设定了vt_lib_32vt_lib_64两个工程为其提供统一接口的的静态函数库(vs虽然为大部分指令提供了相应的函数,但当时自己为了更深入的学习以及了解各个指令的实现细节,就坚持自己写了相关指令对应的C调用函数)。

界面库

我并不喜欢OD的界面,感觉窗口切换太繁琐了。WinDBG的窗口还好点,可以浮动也可以固定,在数据对比的时候很方便。后面我在思考界面的形式的时候就萌发了新的一种交互方式:可分离式界面(反正也是学习过程,多探索总没坏处)。所谓的可分离式界面就是调试器外观的各个可视化组件都可以由用户自己去配置组合。但是怎么去配置组合,开始我也不是很确定。直至接触到了DuiLib的时候,思路就渐渐明晰了。就像DuiLib的界面一样,用户可以自己去通过XML去调节配置自己需要的外观,那剩下的分离和显示,就只需要程序内部绑定好相应的元素就行了。因此我就选择了DuiLib作为界面开发库。

动态脚本

python 那么火,不用它才怪,再说我也只会这种动态脚本(。。。逃)。当然,选这个还有其他理由:更快的脚本开发速度以及更多的扩展支持。当然后续自己如果想学机器学习的话,也还能在这上面折腾下。

调试器

因为自己写这个调试器的初衷就是为了学习,所以对于关键的基础设施,我都是参考资料来自己动手写。目前做的汇编引擎和反汇编引擎都是参考 intel手册 来做的。调试引擎还没怎么做,因为这部分涉及到一些系统知识,自己相关的经验不足,还没想好怎么下手。

0x02 功能和工作进度介绍

调试器-反汇编引擎

反汇编引擎的编写主要参考了 intel手册 2517页以及后续页的 One-byte Opcode MapTwo-byte Opcode MapThree-byte Opcode Map。通过将这几张表的内容整理成一个静态的结构(详见 DbgEngine 目录下的 Disasm_one.h Disasm_two.h Disasm_three_3a.h Disasm_three_38.h),在反汇编的时候通过检索相应的字节码按图索骥就可以了。比如在处理0x01234567 的时候会先从 Disasm_one.h 中的 检索出 0x01 对应的处理函数,然后使用该处理函数处理后续的字节。多个字节的操作码也是一样比如 0x0f3812345678 ,会先从 Disasm_one.h 检索出 0x0f 的处理函数,该函数继续调用 Disasm_two.h 中的 0x38 对应处理函数,0x38处理函数继续调用 Disasm_three_38.h 中的 0x12 处理函数来处理后续的字节。

在反汇编文件的时候,目前只做了一遍扫描。从程序入口点进行解析,碰到call,jmp 等跳转指令就会将相应的地址加入待解析记录中,遇到retn 结束当前函数的解析然后循环取下一个函数地址去解析。
目前完成了32位下的一部分X86指令,还没有做64位的区分处理。

 

调试器-汇编引擎

汇编引擎使用类似反汇编引擎中的表,不过汇编引擎的表是通过 python 脚本采集 intel手册 第二卷 相关的指令介绍来整合起来的(详见 DbgEngine 下的 asm_struct.h )。
汇编引擎在初始化的时候会按照之前采集表格中的助记符在内存中来建立一个前缀树索引表。在汇编的时候,根据助记符找到对应的指令详细记录(可能会有很多条),然后匹配每一条记录的操作数个数和操作数宽度,最后会将所有符合的汇编结果(结果可能有多条)返回给调用者。

 

 

界面库

DuiLib 的版本众多,我选用的版本来源于

https://github.com/redrains/DuiLib_Redrain

 

这个版本的代码修复一些bug。

 

由于 DuiLib 的界面是基于 XML 配置的,所以通过修改 XML 就很容易修改程序的外观。而我在原来的基础上加上四条规则:

① 按钮的 name 属性为 command 的话,点击按钮就可以执行一个本地程序

通过这条规则,你就可以方便建立自己的工具箱了,把自己的常用的工具都整合在一起,你甚至都不用切换程序就能打开了。

② 按钮的 name 属性为 sub_window 的话,用户可以打开一个基于XML 配置的自定义的窗口

通过这条规则,你可以把调试时寄存器的显示和堆栈的显示内容放在一个窗口内;如果不喜欢,你也可以加入或者删除其它内容。总之,完全取决于你。

③ 按钮的 name 属性为 function 的话,就可以执行一些程序内建的指令

初步的构思的是把 单步、步过、暂停、开始等一些可以控制调试器的行为称为内建指令。通过把按钮绑定这些指令,你就可以在任意窗口上进行控制了。

④ 按钮的 name 属性为 py_console 的话,就可以启动一个python 控制台

目前是通过调用 allocconsole 函数开启控制台的,着实难看。以后再想下怎么修改。
通过以上几条规则的配合,你就可以进行混搭,打造自己的“家庭影院”了。

至于前面说的可分离式界面,举个栗子:下图的反汇编列表是分别定义在两个不同的窗口,一个定义在MainWnd.xml内,另一个定义在DisasmWnd.xml内。除此之外,没有其他的代码会对他们进行分开描述。但是他们显示的内容都是一样的,操作也一样。你也可以像这样把反汇编列表放在其他窗口上,只需要修改对应的xml就行了。通过对不同可视化元素的组合,你就可以根据个人习惯打造自己的专属交互页面了。

 

 

 

动态脚本引擎

python 是以静态库的方式编译进程序的。启动一个 python 控制台之后,就可以像官方控制台那样进行操作了,目前集成调试器的读取PE功能,汇编功能。第三库需要添加至 Lib 目录。暂时还不能执行单独的脚本文件。后续考虑把它扩展成类似的winDBG的控制台。
解析PE结构

 

反汇编举例

0x03 后记

项目开源地址:

https://github.com/a12098718/NiujiaoDebugger

 

开发交流群

群名称:牛角调试器开发群
群 号:657517093

 

调试器的名字为 牛角 ,我不喜欢那些自己都看不懂的E文名字,土一点挺好的。来源嘛,就是那句 钻牛角尖 的俗语,虽然原意有点贬义,但我觉得做技术的就是要碰到问题死钻下去,直至解决为止。



[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

最后于 2019-1-11 11:13 被蓝色橘子编辑 ,原因: 添加通讯方式
上一主题 下一主题
打赏 + 7.00
打赏次数 2 金额 + 7.00
收起 
赞赏  gegon   +2.00 2019/01/10
赞赏  junkboy   +5.00 2019/01/09
最新回复 (54)
junkboy 2019-1-9 18:31
2
1
火钳刘明
淡淡的荧光 1 2019-1-9 18:34
3
1
楼主留个qq
Editor 2019-1-9 18:58
4
1
666 
sxpp 1 2019-1-9 20:22
5
1
赞一个
hkfans 3 2019-1-9 20:51
6
1
DUI 666
猪会被杀掉 1 2019-1-9 20:57
7
1
精神可嘉,不过这样的调试器经常发布了几个版本后就没下文了......
老牜lyh 2019-1-9 22:14
8
1
膜拜中666666
Tennn 5 2019-1-9 22:20
9
1
弄个有特色的实用的出来 比如专过反调试  我写了个用的qt511  自用专门过反调试的…  
蓝色橘子 1 2019-1-9 22:35
10
1
维护也不是件容易的事。如果没有利益或者特别强烈的愿望,很少人能熬得住。未来不可期,我是先把现在能做的做好就行了~~
hekes 2019-1-10 00:31
11
1
mark
PYGame 2019-1-10 01:12
12
1
666看起来不错
暴强 2019-1-10 07:06
13
1
你怎么不用x64dbg的源码开发?
niuzuoquan 2019-1-10 08:14
14
1
mark
itmaple 2019-1-10 08:42
15
1
mark
gegon 2019-1-10 09:40
16
1
支持
kongfubull 2019-1-10 09:43
17
1
也是6得不行。
xie风腾 2019-1-10 10:15
18
1

玩几年就开发调试器,牛哟
我是哥布林 2019-1-10 10:31
19
1
赞一个
killpy 2 2019-1-10 12:29
20
1
毅力可嘉  感谢分享
IamHuskar 4 2019-1-10 14:15
21
1
蓝色橘子 维护也不是件容易的事。如果没有利益或者特别强烈的愿望,很少人能熬得住。未来不可期,我是先把现在能做的做好就行了~~
这个兄弟是懂套路的。曾经梦想仗剑走天涯,后来作业太多就放弃了
如斯咩咩咩 2019-1-10 14:53
22
1
火钳刘明
cmputer 2019-1-10 16:18
23
1
厉害,厉害
谢C 2019-1-10 16:31
24
1
火钳刘明
BkHumor 2019-1-10 18:06
25
1
膜拜!膜拜!
热情的菜鸟 2019-1-10 18:45
26
1
跟楼上同胞问个好。
accessdenied 2019-1-10 18:54
27
1
必须支持,要是能坚持维护就好了
逻辑错误 1 2019-1-10 19:59
28
1
这个厉害啊, 还支持python. 界面就这样挺好的, 简洁直接.
醉卧美人膝 2019-1-10 20:42
29
1
6666
zjjhszs 2019-1-10 22:22
30
1
我想吐槽的是 VS版本  越玩越高级,我只想好好爱V6, 可便捷性,源码阅读性,我无爱了
wanttobeno 2019-1-11 09:17
31
1
这里空指针报错

应该改为  tmpHandle。
写一点使用说明:
打开后界面后,点击“工作界面”显示汇编界面。






最后于 2019-1-11 09:19 被wanttobeno编辑 ,原因:
pureGavin 2019-1-11 10:21
32
0
Tennn 弄个有特色的实用的出来 比如专过反调试 我写了个用的qt511 自用专门过反调试的…
大佬要不也发篇文章开源一下??
蓝色橘子 1 2019-1-11 11:08
33
0
话说怎么回复别人呢?求过路的告知一下,我用的是chrome ,试着换了几个浏览器,点别人回复的引用没有效果啊!
二娃 2019-1-11 12:53
34
0
蓝色橘子 话说怎么回复别人呢?求过路的告知一下,我用的是chrome ,试着换了几个浏览器,点别人回复的引用没有效果啊!
点了引用的那一层回复背景颜色会加深
挽梦雪舞 2019-1-11 12:58
35
1
是不是禁用了
蓝色橘子 1 2019-1-11 13:33
36
0
二娃 点了引用的那一层回复背景颜色会加深
谢谢你~  我试试~~
蓝色橘子 1 2019-1-11 13:36
37
0
wanttobeno 这里空指针报错应该改为  tmpHandle。写一点使用说明:打开后界面后,点击“工作界面”显示汇编界面。
有兴趣可以加企鹅群 657517093 
瀚海云烟 1 2019-1-11 13:51
38
0
现在只能 火后刘明了 ? 
yllen 2019-1-11 14:31
39
0
stevenlong 2019-1-11 18:59
40
0
毅力点赞
Besttwuya 2019-1-12 04:35
41
0
毅力强
严启真 2019-1-12 19:07
42
0
我就想知道如何暂停程序并读取寄存器的值,看来还要多学啊
蓝色橘子 1 2019-1-12 19:26
43
0
严启真 我就想知道如何暂停程序并读取寄存器的值,看来还要多学啊
在调试事件下面可以调用api读取寄存器的值~这部分内容还没做
yirucandy 4 2019-1-16 17:03
44
0
支持一个!
fjqisba 2019-1-16 19:44
45
0
我是来加群的,那晚8点没加群的我这次一定不能错过
windxiang 2019-1-18 09:33
46
0
赞一个下载来学习了
DWwinter 2019-1-22 14:35
47
0
学习学习,好东西。
Besttwuya 2019-1-30 06:15
48
0
支持
lynnux 2019-1-30 10:42
49
0
这个东西光写界面就感觉麻烦得要死,建议学习x64dbg调试引擎啥的都用别人的,把界面写好就够了
蓝色橘子 1 2019-2-2 09:35
50
0
lynnux 这个东西光写界面就感觉麻烦得要死,建议学习x64dbg调试引擎啥的都用别人的,把界面写好就够了
如果只是为了做一款好用的产品,相关的组件当然是优先选择已有的成熟案例啦,那样不仅节约时间也提高产品的可靠性。可我做这个的初衷并不这样,自然选择适合我的方式来做~
游客
登录 | 注册 方可回帖
返回