首页
社区
课程
招聘
关于如何确定内存中指令的起始地址的疑惑
发表于: 2007-12-26 11:51 4387

关于如何确定内存中指令的起始地址的疑惑

2007-12-26 11:51
4387
指令可以是单字节也可以是多字节的,那CPU究竟是按一个什么样的规律去决定每一条指令的起始地址的啊,花指令可以迷惑像OD这样反汇编软件,让它显示错误的结果,却怎么样也干扰不到CPU对指令正确执行吧。这是为什么了?

由此可以引发以下这个问题,在OD中如果在程序的某个地方断下来,这时候如果按F9,应该就是执行的ContinueDebugEvent,程序的结果肯定不会错。但如果用单步步入的方式在同样的地方开始执行程序,会不会因为碰到花指令而让程序执行出错误的结果了?

CCDeBuger大哥,如果逛到这里来了,麻烦帮我回答一下吧。

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
INTEL开发者手册,,,有详细的介绍OPCODE的格式,,,

反汇编器会被迷惑是因为数据指令的二义性,即无法在给定数据中确定一条完整的指令。能够确定的就只有代码执行的入口,以及下一条要执行的指令。同样地,假如你按F7,一直单步,那么当前EIP指向的每一条指令都是正确的

最简单的反汇编器是由上到下一条一条指令反汇编的,而真实的代码流程并不是这样的。
反汇编器的静态方式决定了会受花指令影响显示出错误的结果。所以大多数人用调试器(如OD)脱壳,而不是用反汇编器(如IDA)

会有这样的疑问是因为你没有理解事物的本质。所有关于为什么XX不能正常YY的问题都是由于你没有想过如何实现XX,稍微想想,不难得出让XX不能正常工作的方法。

最后建议你想问题,要到点子上,既然你知道花指令是对抗的反汇编技术的,就应该去找反汇编相关的资料,而不是把问题越扯越远。
2007-12-26 13:03
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是啊,就是因为没有理解到这个,我也想找关于这个的资料,其实我用的也是OD,但是OD显示指令也是会被迷惑的,这方面的资料<<INTEL开发者手册>>,我去看看。
2007-12-27 17:07
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
版主大大,我再问下<<Intel 64及IA-32 架构软件开发者手册>>全名是不是这样的。另外我还是有点疑惑,你是说在给定的数据的里没法确定一条完整的指令,但汇编器从程序的执行入口处进行分析,不是应该就可以确定每一条指令吗?
2007-12-27 20:13
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
????呵呵。。可能我还不太熟悉IDA吧!!!!个人观点IDA似乎是用来分析的。。怎么能得到程序结果呢?
刚才特意查了下什么是花指令。。。。感觉这东西不过是添加了点脏数据。。或者说把真相掩藏与大海之中。。。。。似乎与错误完全没关系。。
您说的程序执行出错。应该是反调试吧??这个,普通的反调试似乎有很多方法。。。不过如果拒绝任何调试器的调试。应该是修改了中断吧!!
不过个人感觉还是挡不住SOFTICE的。。。这东西似乎是个独立的操作系统。。

论坛最好能有个精华贴。能对各种概念做个稍微浅显的解释。。比如花指令。比如DUMP,比如IDT(其实好多英文,如果引用的时候能够写上全称,就非常帮助理解了)
2007-12-27 22:07
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
版主大哥和CC大哥一样,一般露一下就不再出来了,唉。楼上这位兄弟可以再看看我最后的回复,版主说的花指令就是指在给定地址因为指令二义性,而造成的反汇编器对指令的误判,我其实是问,如果都从程序入口处开始判断,反汇编器应该能够正确的读到每一条指令了。因为是从最初的起点开始读,所以应该不会出现识别不了花指令的情况了吧。CPU应该就是根据这样的原理,所以从入口处按顺序读指令就不会出错的吧。
2007-12-28 16:23
0
游客
登录 | 注册 方可回帖
返回
//