首页
社区
课程
招聘
[原创]动态调试与静态反汇编合一,运用虚拟机技术创建可逆向运行的调试器
发表于: 2010-8-22 21:00 139108

[原创]动态调试与静态反汇编合一,运用虚拟机技术创建可逆向运行的调试器

2010-8-22 21:00
139108
收藏
免费 7
支持
分享
最新回复 (124)
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
76
看过这篇文章后觉得自己把困难估计得过低了。尤其是在循环的识别和高级数据结构的恢复上。

http://www.fish888.com/-t171937

http://bbs.pediy.com/showthread.php?t=77108

但是用反汇编记录来帮助调试,用数据流来分开壳和可执行程序,这个思路也是对的,只是现在理论不成熟的情况下,要靠污点传播,凭经验,靠人肉,肯定是免不了的。

呵呵,接下来方向不变,目标可以降低一点。当个小助手用。
2010-8-28 22:22
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
77
哇,我知道了!原来问题要这么去解决。
2010-8-29 08:46
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
78
我的方法和他有不同,但原理是一样的。

http://www.paper.edu.cn/index.php/default/journal/downCount/1671-5497(2009)01-0143-05

一定要用到统计哦:

http://dm.thss.tsinghua.edu.cn/publication/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%B7%A5%E7%A8%8B05--%E5%9C%A8%E5%A4%A7%E5%9E%8B%E6%95%B0%E6%8D%AE%E9%9B%86%E4%B8%8A%E6%8F%90%E9%AB%98%E5%BA%8F%E5%88%97%E6%8C%96%E6%8E%98%E6%95%88%E7%8E%87%E7%9A%84%E7%BB%9F%E8%AE%A1%E6%96%B9%E6%B3%95.PDF

一样的想法,不一样的用途

http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1002_frank/1002_frank.html

一个ARM的实现

利用RealView Profiler工具进行软件代码优化

http://www.realview.com.cn/shoppic/iq-07/%E5%88%A9%E7%94%A8RealView_Profiler%E6%89%BE%E5%AF%BB%E4%BB%A3%E7%A0%81%E4%BC%98%E5%8C%96%E8%89%AF%E6%9C%BA.pdf

相关理论的最新进展

基于命题演算的高级控制结构恢复

http://www.ecice06.com/EN/article/downloadArticleFile.do?attachType=PDF&id=19058

我的程序中可以获得的信息要比以上的论文的前提条件更丰富,我们有一个完整的动态调试记录,虽然没有遍历分支,但是可以用符号计算来遍历,我们不仅可以命题演算,还可以用扫描和统计来了解实际到底是怎样的流程。因此,程序的理论基础虽然很薄弱,但还是有希望的。

找到的资料真不少,又是一篇简介,他们要是能结合动态调试的结果调整对控制流的分析,那么结果就更精确了

面向二进制代码安全分析的反编译关键技术研究(二进制,代码分)

http://www.jijinzu.com/gx/9261960.html
2010-8-29 08:52
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
79
经过今天一天的思考,我得到了一个很好的主意,表面上看混淆代码拉长了分析的线路,隐藏了真正的信息。

但实际上从另一方面来看,它们同时正在把更多的信息暴露出来。关键是如何去解读了。今天完成了对解读控制流的基本思路,明天搞数据流在控制流上的映射了。
2010-8-29 18:52
0
雪    币: 146
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
80
,.....不懂。只想知道代码已经写了多少了,能切张图, 让我开心一下么。
2010-9-5 16:14
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
81
如果我打这么多字
我一定没力气写代码
2010-9-5 17:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
82
文是好文,但是看得头大,收获有一点,表示感谢!
2010-9-10 10:47
0
雪    币: 608
活跃值: (91)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
83
都是很深奥的东西..看着很有希望的感觉..
但是就是实现起来...还是很漫长的道路.
2010-9-17 23:20
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
84
这几天我试了很多调试器和反编译器,最后发现都不是很理想,目前的决定是要用 gdb ,然后通过 gdb/mi 的接口让被调试的程序运行,然后读取一段内存,送到 beaengine 的引擎进行反汇编,当反汇编遇到跳转时,就停止,通知 gdb 在跳转指令处下断,然后执行到断点处,再反汇编下一段。还可以在执行中对我们感兴趣的地方下断,获取指令执行后的结果,这样就避免了单步执行的低效率,同时也不会遗漏任何真正有价值的信息。

那么,为什么不使用调试器本身的反汇编功能呢?

因为 beaengine 的反汇编有个很有用的特点,它可以输出反汇编的中间结果,就是一个描述指令具体细节的数据结构,这比给出一条指令的助记符格式更好,省得先把指令翻译到助记符,再从助记符翻译到数据结构了。
为了支持更多的调试器后端,这个分析引擎和调试器要做到模块上的分离。

数据库我选 postgresql。

对于循环,我只反汇编第一次,然后在出口语句和关键信息处理语句上下断,这样又可以节省时间了。争取到循环结束时,是提供这个循环处理的结构化数据视图和处理框架。

图形界面的话,我想了想,还是用 gtk 来做,比 QT 更开源,比 wxwidget 更有自由度。

欢迎更多的建议。
2010-9-19 06:21
0
雪    币: 7
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
85
测试一下回帖
2010-9-19 09:39
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
86
我一直默默等待神器的出现
2010-9-19 10:20
0
雪    币: 171
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
87
搞得火热,大牛们
2010-10-23 03:57
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
88
很强大的说,谢谢楼主分享
2010-11-1 18:45
0
雪    币: 427
活跃值: (488)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
89
想法是美好,现实是惨酷的。
我也在想:如果能有一位顶级的调试大师来回答下这一命题,就好了。
2010-11-1 22:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
90
拜读,楼主的想法相当学术,期待更多的好点子
2011-1-4 14:25
0
雪    币: 193
活跃值: (1023)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
91
很多东西 都很模糊 看的头大
2011-1-9 22:04
0
雪    币: 82
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
92
刚学混淆,楼主给了一个好的思路,支持下!
2011-1-11 10:54
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
93
这个难度有点大。
2011-1-11 11:14
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
94
这是一个很大的工程,以一个人的力量要做完真的是很难
2011-1-11 11:57
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
95
何时能看到楼主的大作......期待中
2011-6-13 01:43
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
96
膜拜fg, 那么早就知道BitBlaze了,不愧为是博览群书啊。

Symbolic Execution 可以解决大部分问题。

另外metasm 里面用到的backtrace,也比较有意思,实际上这也是Symbolic Execution的一种形式。

Optimization能够帮助理解虚拟机,但是最终要化整为零,要花很多工夫,而且最后也要特化处理。这两种形式网上都有相关论文和例子(我记得是http://www.openrce.org/blog/view/1238/VMProtect,_Part_0:__Basics).  熟练用Ocaml的人就不多,熟练操作编译器技术的那就更是寥寥无几。

期待fg分享其他宝贵的信息。
2011-6-13 02:37
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
97
膜拜forgot,foxabu
今天才知道BitBlaze,下了src看了下。受益匪浅,好好学习
2011-6-13 11:26
0
雪    币: 357
活跃值: (3463)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
98
膜拜 fg 和 BitBlaze, 这帖子历史真久
2011-6-13 15:49
0
雪    币: 1994
活跃值: (1526)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
99
和我的想法不谋而和
2011-6-14 11:35
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
100
嗯 看了看 获益
2011-6-14 11:55
0
游客
登录 | 注册 方可回帖
返回
//