能力值:
( LV9,RANK:170 )
|
-
-
2 楼
processor 的解码逻辑是给机器看,给机器看,它只会按照它的解码方法进行,没有什么各式各样的算法
disassembler 是给人看,是更好地为了使人看明白,所以产生各种的 disassembly 算法
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
cpu解码不会错的。逻辑上cpu是顺序执行,(当然实际上intel设计了乱序执行,但和cpu解码无关,不讨论),
cpu取了这一条指令,下一个内存单元的二进制数“xx”就会被cpu进行解码看是具体做什么机器操作的指令。
反汇编程序是人为的反汇编,有时候因为无法确定一条指令具体从哪个字节开始,而出现反汇编的结果不同。
比如一连串二进制“aa bb ac 9e f3 6a”,反汇编程序从"aa"解码,和从"bb"开始解码,自然得到不同结果,
但实际 cpu执行只有一种解码方式。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
CPU顺序执行,那就是从aa开始解码,为什么反汇编算法还要从bb开始解码呢,反汇编按照CPU顺序执行来解码,不是就能得到正确的人能够理解的代码吗?为什么要舍弃代码的正确性而来换取所谓“人能看明白”呢?
|
能力值:
( LV12,RANK:270 )
|
-
-
6 楼
跳转到bb的地址~~所以一段数据,在执行之前,根本很难断定应该从什么位置开始反汇编。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
PE头里面不是指明代码段的开始位置了么,不能从代码段开头开始反汇编吗?
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
例如一个条件跳转,或者call eax之类,在真正执行前无法知道会跳转到哪条指令。例如
mov eax, [edx]
test eax, eax
jz +2
aa
bb
cc
dd
由于不知道edx存放的是什么,不能确定实际从哪条指令开始执行。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
建议楼主去了解了解什么是花指令,为什么会存在花指令。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
看了下花指令,终于了解一些了,谢谢大家的回复
|
|
|