首页
社区
课程
招聘
反汇编的结果为什么不一定正确
发表于: 2011-4-13 10:27 8176

反汇编的结果为什么不一定正确

2011-4-13 10:27
8176
同样的二进制代码,为什么反汇编后结果会不相同?《IDA Pro》中也提到了反汇编器是通过反汇编算法对可执行文件进行反汇编的,反汇编算法有“线性扫描反汇编”和“递归下降反汇编”等算法。从下图中也可以看出05 89 45 F8 90用不同的算法反汇编结果不同:

    但是,CPU是能正常执行这段代码的,CPU取址-译码应该也有一个算法吧,为什么反编译器不用CPU取址-译码的算法进行反汇编呢?

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
processor 的解码逻辑是给机器看,给机器看,它只会按照它的解码方法进行,没有什么各式各样的算法
disassembler 是给人看,是更好地为了使人看明白,所以产生各种的 disassembly 算法
2011-4-13 10:51
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
cpu解码不会错的。逻辑上cpu是顺序执行,(当然实际上intel设计了乱序执行,但和cpu解码无关,不讨论),
cpu取了这一条指令,下一个内存单元的二进制数“xx”就会被cpu进行解码看是具体做什么机器操作的指令。
反汇编程序是人为的反汇编,有时候因为无法确定一条指令具体从哪个字节开始,而出现反汇编的结果不同。
比如一连串二进制“aa bb ac 9e f3 6a”,反汇编程序从"aa"解码,和从"bb"开始解码,自然得到不同结果,
但实际 cpu执行只有一种解码方式。
2011-4-13 11:16
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了!!
2011-4-13 12:11
0
雪    币: 93
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
CPU顺序执行,那就是从aa开始解码,为什么反汇编算法还要从bb开始解码呢,反汇编按照CPU顺序执行来解码,不是就能得到正确的人能够理解的代码吗?为什么要舍弃代码的正确性而来换取所谓“人能看明白”呢?
2011-4-13 14:42
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
6
跳转到bb的地址~~所以一段数据,在执行之前,根本很难断定应该从什么位置开始反汇编。
2011-4-13 14:50
0
雪    币: 93
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
PE头里面不是指明代码段的开始位置了么,不能从代码段开头开始反汇编吗?
2011-4-14 09:37
0
雪    币: 277
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
例如一个条件跳转,或者call eax之类,在真正执行前无法知道会跳转到哪条指令。例如
mov eax, [edx]
test eax, eax
jz +2
aa
bb
cc
dd

由于不知道edx存放的是什么,不能确定实际从哪条指令开始执行。
2011-4-14 10:33
0
雪    币: 84
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
建议楼主去了解了解什么是花指令,为什么会存在花指令。
2011-4-14 17:56
0
雪    币: 93
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看了下花指令,终于了解一些了,谢谢大家的回复
2011-4-14 20:13
0
游客
登录 | 注册 方可回帖
返回
//