首页
社区
课程
招聘
[carvingdbg] 设计的讨论
发表于: 2005-4-9 11:16 10126

[carvingdbg] 设计的讨论

2005-4-9 11:16
10126
[carvingdbg] 设计的讨论

1. 讨论关于 open file 和 debug file

open file 是把一个档案从硬盘读取,把它进行反汇编,把结果顺序输出到 ListView 中。这种方式跟 IDA 或 w32dsm 类似,暂时没有包含调试功能

debug file 是未开发完成的新部份,它是 CreateProcess 以后,以 debugger 身份对目标进行 ReadProcessMemory,把目标程序的实际内存进行反汇编,输出固定行数的 ListView 中,并可以放断点和调试。这种方式跟 OD 类似,假如程序在运行时修改指令 (smc) ,debugger 中会即时反映出来。

现在的开发进度以反汇编部份为主,先完成一个正确无误并且速度理想的反汇编核心。现在的源码,反汇编的速度是快的,但是把 ListView 加入 item时是非常缓慢,这一步是主要浪费时间的原因。当反汇编大型档案时 (我使用我写的 crackme6.exe 来测试,它的体积是 7.14 MB) ,内存使用量极大,导致反汇编核心的内存开始抄 (swap)到硬盘上,速度下降。 将来的设计,可能使用像 IDA 的方式,把反汇编出来的数据有系统地储存在硬盘的档案里 ( IDA是 database 档 ),这样便可以解决有限内存的问题。

我在开发 debug file 那部份时,发现了一个问题,假如CreateProcess 后debugger 在段序的 Entry point 断下,开始对 Entry point 地方进行第一次反汇编,那幺我们怎样可以肯定在 Entry point 那一行之上的指令是从那里开始进行分隔 ?

例如 :

1006420 :  push ebp
1006421 :  mov ebp, esp


我们的 Entry point 是 1006420,我们从指令的反汇编得知这条指令的长度,继而向下找出下一条指令,是位于 1006421,继续反汇编。 那幺,位于 Entry point 1006420 之上的指令,我们应该从那个位置开始反汇编 ?  ( 从 1006419 还是 1006418 ?  或是那里 )

解决是方法,可以是在反汇编 Entry point 的时候,便把整个程序的所有跳转和位置转移 ( jmp, jx, call ) 都进行跟踪,找出所有相关的程序段,使整个程序的所有指令位置都被检出来,这样便能得知 Entry point 之上的指令从那里开始反汇编

这种做法需要考虑的问题,是将来面对令花指令时的能力,使用这种方法很有可能被花指令扰乱,使 debugger 误以为程序的某一部份是 data,不是指令
(现时 OD 也有这种程况 )

大家有甚幺想法 ?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (33)
雪    币: 229
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我们可以先把所有的程序反汇编出来,SAVE到DATABASE中,这样一来的话我们不用动态的去反汇编,到时直接找了读就可以了,本来一定会出现你说的这样的问题的吧
2005-4-9 12:09
0
雪    币: 229
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
想了一下还是用DATABASE的方式应当会很好,可以剩去很多复杂的代码.
2005-4-9 12:14
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
ollydbg采用的是内存分块反汇编,每次反汇编一整块。当有需要的时候再反汇编另一块。
不要用listview了,
要自己画界面,否则会很慢的。
2005-4-9 12:41
0
雪    币: 3246
活跃值: (374)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
5
标准的listview不能实现语法高亮吧,呵呵
2005-4-9 14:02
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
6
最初由 goldenegg 发布
ollydbg采用的是内存分块反汇编,每次反汇编一整块。当有需要的时候再反汇编另一块。
不要用listview了,
要自己画界面,否则会很慢的。


嗯,同意,我的那个就是自己画的,虽然现在还很难看,但以后可以扩展的空间很大.
自己画的难点是处理单击后选中,还有各种滚动的情况.那些ScrollWindow什么的函数的让我折腾了好久
2005-4-9 15:54
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
7
最初由 vcboy 发布
我们可以先把所有的程序反汇编出来,SAVE到DATABASE中,这样一来的话我们不用动态的去反汇编,到时直接找了读就可以了,本来一定会出现你说的这样的问题的吧


可是,现在的程序经常动态修改,如果没有像 OD 那种即时反汇编实际内存的能力,这样 debugger 对抗 smc 和花指令的能力很低

当然, open file 那一项功能是把档案从硬盘反汇编,可以使用 database 来实现储存数据,便于管理

关于输出介面,如果可以的话,自行绘画是个好的主意。现在的程序开发很初步,暂时使用 ListView 来输出结果。

Roba有没有兴趣参与开发绘画反汇编介面的一部份 ?  
2005-4-9 21:33
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
8
最初由 goldenegg 发布
ollydbg采用的是内存分块反汇编,每次反汇编一整块。当有需要的时候再反汇编另一块。
不要用listview了,
要自己画界面,否则会很慢的。


是不是反汇编整个 .code 段 ?

如果exe 的体积很大的话,会不会缓慢 ?
2005-4-9 21:43
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
9
<累积要解决的问题 >:

-        floating point / mmx 等等的反汇编,并考虑对于将来开发 64 bit 反汇编的扩充问题
-        整体程序的视窗, GUI 管理 ( 暂时是没有统一管理,使用单纯的 resource script + CreateDialog )
-        反汇编以绘图方式显示,取代缓慢的 ListView
-        静态反汇编档案的功能,由 database 储存数据
-        动态调试功能的开发,需要考虑多进程 / 多线程的支援
-        完善的扩充介面,让 plug-in 容易开发
2005-4-9 22:10
0
雪    币: 229
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
数据库打算自己做还是用现成的?~~~~到时我这里试一下现成的效率吧,效率高的话还是用现成的,如果低的话就没招自己做了.(就是自己做的话功能没有现成的强了
2005-4-10 00:02
0
雪    币: 229
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 riijj 发布


是不是反汇编整个 .code 段 ?

如果exe 的体积很大的话,会不会缓慢 ?


不应当是.code段,应当是说指定的一个地址段单独拿出来反吧!.code段不是一样的大!
2005-4-10 00:17
0
雪    币: 229
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
listview是一定要自己重新做一个的,不是自己画的功能方面也很弱
2005-4-10 00:22
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
13
最初由 vcboy 发布
数据库打算自己做还是用现成的?~~~~到时我这里试一下现成的效率吧,效率高的话还是用现成的,如果低的话就没招自己做了.(就是自己做的话功能没有现成的强了


可以使用较简单的 random access file ,一个档案,自行控制。储存反汇编资料,我觉得不需要设计太复杂

当然,也可以用 ODBC 连接一些 database 档,最简单的格式例如 MS access 档

因为这个 project 是 GPL 的开源 project ,使用的东西尽量不是商业的东西,尽量使用公开的东西和格式
2005-4-10 00:36
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
14
最初由 vcboy 发布


不应当是.code段,应当是说指定的一个地址段单独拿出来反吧!.code段不是一样的大!


一个地址段是甚么意思  ?

例如现在的 Entry point 位置是 1006420,那么我应该反汇编那里至那里的地方 ?  用甚么方法来得知 ?

我知道的段,是指内存里的分段,如果说一个程序内的指令位置,它的段应该是位置整个 .code ,整个 .code 由 VirtualQuery 看是一个单一区域
2005-4-10 00:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
深大了...
2005-4-10 14:22
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
16
最初由 riijj 发布


关于输出介面,如果可以的话,自行绘画是个好的主意。现在的程序开发很初步,暂时使用 ListView 来输出结果。

Roba有没有兴趣参与开发绘画反汇编介面的一部份 ?



我不懂数据库,所以这个界面和数据的接口还得好好学习一下.

如果觉得我的那个玩意 自己画的界面还可以的话,很乐意接受这个任务
2005-4-13 09:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
最初由 riijj 发布


一个地址段是甚么意思 ?

例如现在的 Entry point 位置是 1006420,那么我应该反汇编那里至那里的地方 ? 用甚么方法来得知 ?
........


》应该反汇编那里至那里的地方《我想这个就是所谓的‘核心技术’。
2005-4-13 10:26
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
汇编显示界面的处理可以参考我链接中的代码
http://bbs.pediy.com/showthread.php?threadid=12899
2005-4-15 15:52
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
19
最好是按照流程来。

可以加入push/ret的识别和手动dis
2005-4-19 13:29
0
雪    币: 1227
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
最近对解释执行很有兴趣,如果有时间写的话,我会给出一部分我的x86解释器代码。现在的猛壳很多,我想如果把解释执行调试的功能集成进去也许会很有用。
2005-4-19 13:53
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
21
最初由 firstrose 发布
最好是按照流程来。

可以加入push/ret的识别和手动dis


我正在研究流程的反汇编方式
可是,我不明白为甚么 OD 可以快速地反汇编程序的任何位置  (例如,当我们
按住 OD 的滚动条翻上了数十页,OD 亦可以正确定位,把指令反汇编,而不
会错误地在一条指令的中间开始反汇编。 )
2005-4-19 14:55
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
22
最初由 hume 发布
最近对解释执行很有兴趣,如果有时间写的话,我会给出一部分我的x86解释器代码。现在的猛壳很多,我想如果把解释执行调试的功能集成进去也许会很有用。


“解释执行” 是甚么  ?
hume 兄可否解释一下
2005-4-19 14:56
0
雪    币: 1227
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
vmware,vpc可用过?
但是这些模拟器都是半解释执行的像bochs这种是纯粹解释执行的,VB PCODE是解释执行的。
有些壳反跟踪,检测断点之类的手段,在解释执行面前将很容易被击破(结合类似ollyscript的脚本机制),其实解释执行是对付这些小伎俩的最根本的技巧,但是纯粹的解释也存在很多问题(比如效率和对系统的模拟非常困难),但如能在和实际的调试跟踪功能结合起来,重点在于对付反跟踪和方便“人”的手动分析,绝对是现有的所有调试器没做到的。
dos下的TR为什么强大,就因为它是完全解释执行的,跟踪过程完全可控。
windows下这样纯粹解释很不现实,但可以进行局部的解释执行,可有效对抗各种反跟踪手法,若很好的和动态调试相结合必定能够打开一个调试器的新局面。
空有想法没有时间,大家讨论一下而已,不要太认真了。。。。
2005-4-19 15:20
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
24
最初由 hume 发布
vmware,vpc可用过?
但是这些模拟器都是半解释执行的像bochs这种是纯粹解释执行的,VB PCODE是解释执行的。
有些壳反跟踪,检测断点之类的手段,在解释执行面前将很容易被击破(结合类似ollyscript的脚本机制),其实解释执行是对付这些小伎俩的最根本的技巧,但是纯粹的解释也存在很多问题(比如效率和对系统的模拟非常困难),但如能在和实际的调试跟踪功能结合起来,重点在于对付反跟踪和方便“人”的手动分析,绝对是现有的所有调试器没做到的。
dos下的TR为什么强大,就因为它是完全解释执行的,跟踪过程完全可控。
windows下这样纯粹解释很不现实,但可以进行局部的解释执行,可有效对抗各种反跟踪手法,若很好的和动态调试相结合必定能够打开一个调试器的新局面。
........


我明白了,
意思是不是虚拟程序的执行过程  ?

这个功能的确是好,但制作不简单, windows API的虚拟真是不懂得怎样

难道要像 linux 里的 wine 一样,把 windows 的各呼叫都模仿 ?
2005-4-19 15:36
0
雪    币: 1227
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
只所以要和动态调试相结合,就是要避免完全模拟API以及大部分和操作系统相关的东西,在解释执行时,遇到完整的API调用甚至库函数可以交给系统去执行,虚拟部分只要能控制结果就可以了,再传回作为运算结果继续运行原程序。需要模拟的恐怕是一些阴损的招法,这个我觉得全自己做也不可能完成,完全可以提供一套脚本或插件机制由有需求的人按需要去做,关键在于我们想怎么控制程序都可以。
2005-4-19 16:04
0
游客
登录 | 注册 方可回帖
返回
//