能力值:
( LV9,RANK:610 )
|
-
-
2 楼
抢个沙发继续支持楼主!
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
哇,这么快就有续章了。。。
再顶!
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
4 楼
常年关注....
|
能力值:
( LV12,RANK:220 )
|
-
-
5 楼
(3) argument1, argument2, argument3:实际上intel指令最多也只有三个操作码,当只有两个操作码的时候,第一个为目标操作码,第二个为源操作码。
“操作码”改为“操作数”更容易理解些。
当只有两个操作码的时候,第一个为目标操作码,第二个为源操作码,这个也不一定,还受d位的影响。
|
能力值:
( LV12,RANK:220 )
|
-
-
6 楼
int main()
{
unsigned int BaseAddress;
unsigned char *pCurrent;
unsigned char *pLast;
INSTRUCTION stInstrcution;
char strInstrcution[MAX_INSTRUCTION_LEN];
BaseAddress = 0x401000;
pCurrent = pLast = Code;
while(pLast - Code <= sizeof(Code)) //该处地址越界
改为:
while(pLast - Code < sizeof(Code)-1)刚好
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
学习,很期待能其他领域也可以反汇编
|
能力值:
( LV9,RANK:370 )
|
-
-
8 楼
这个我知道,这里说的是操作码(还是用操作码吧,因为数总给人一种数字的感觉,至少我容易把操作数和立即数弄混,毕竟操作的对象并不数字),是指汇编格式中的操作码,而不是实际编码过程中的。
比如:mov argument1, argument2
这里位于argument1位置的为目标,而位于argument2位置的为源,这就像是固定了的几个槽,槽里可以随意放东西。这里说的就是固定了的槽的属性,而你说的d位影响的只是放在哪个槽里的问题。
这虽然只是个概念的问题,但是跟反编译器的实现是密切相关的。因为我是这样设计反编译后的汇编指令的:
prefix mnemonic argument1, argument2, argument3
这个格式是固定的(就像一个槽),解析指令的过程中,只要把各个部分填充,按照这个顺序和并起来就行了。所以我在解析过程中一些参数的传递是有考虑的,argument1就是指这个固定的argument1, argument2就是指固定的argument2,解析函数再根据d位,或其他方式来确定,哪个结果存放在哪个目标串中。
当然,这个只是我个人的设计,把指令各个部分分解,分别考虑,再合成,能简化解析过程。
|
能力值:
( LV9,RANK:370 )
|
-
-
9 楼
[QUOTE=xiep;525423]int main()
{
unsigned int BaseAddress;
unsigned char *pCurrent;
unsigned char *pLast;
INSTRUCTION stInstrcution;
char strInstrcution[MAX_IN...[/QUOTE]
这个越界的问题我的确没有考虑好,你说的这个减去1刚刚好也不一定,现在把无法识别的指令都是一个字节,假如以后能解析指令了,数组中的最后一个字节刚好是一个多字节指令(比如5个字节)指令的开始,那么越界的问题还是会存在的。
所以问题的关键是,读指令之前不知道最后一条指令的长度,如果想要防止越界发生,我想可以减去指令的最大长度,sizeof(INSTRUCTION)——也就是大致为目前的INSTRUCTION的大小或者精确的(4bytes(prefix)+3bytes(Opcode)+1byte(ModRM)+1byte(SIB)+4bytes(displacement) +4bytes(immediate) = 17bytes)。
这样才正确,不过code[]的长度也必须大于17bytes才能在其中取到指令。
|
能力值:
( LV12,RANK:220 )
|
-
-
10 楼
哈哈,个人有个人的习惯,不过Masm汇编经常说操作数操作数,我已经习惯这个称呼了
|
能力值:
( LV13,RANK:1050 )
|
-
-
11 楼
好文一定要顶。
|
能力值:
( LV2,RANK:10 )
在线值:

|
-
-
12 楼
尊敬的egogg:
拜读了您的大作打造自己的反汇编引擎——Intel指令编码学习报告,受益良多。非常感谢您将自己专研的知识与其他人分享。
我有个疑问,不知道您能不能在百忙之中抽出点时间来辅导一下。关于您文章中提到的opcode中的s位的意思我看懂了。但是还有两个问题请您帮我分析一下
第一:81,c0,f8 add eax,f8此时cpu是不是把f8当成8来看待?
83,c0,f8 add eax,f8 此时cpu是不是把f8当成-8来看待?
第二:如何控制汇编编译器,使它为指令(add eax,正或负的数值)分别生成81,或83的opcode的机器码?并且这样做有意义吗?
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
13 楼
学习了。。。。。
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
14 楼
必须得顶,好好学习。
|
能力值:
( LV2,RANK:10 )
在线值:

|
-
-
15 楼
学习了 谢谢楼主分享 
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
...(1) lable:标签,表面意思就是这条指令的一个指代...
...Svin给出了一个简单的程序,在Ollydgb中当作“白纸”来用...
--------------debug a bug---------------------
"lable" -- label 
"Ollydgb"--Ollydbg
|
能力值:
(RANK:290 )
|
-
-
17 楼
mark ~~~
|
|
|