x86机器码识别及其反汇编算法
x86体系结构CPU的每条指令都可能由以下六个域组成,并且它们在指令中的排列顺序是不能改变的。
这六个域分别是:
prefixes
code
ModR/M
SIB
displacement
immediate
在任何一条指令中code域是必须出现的,其他的域都是可选的。
由于这六个域在指令中的排列顺序是固定的,所以反汇编机器码,就是一个对它们的依次识别过程。
1.对prefixes的识别
Intel的官方手册上说有4类prefixes,为了便于编程和后面的描述,本人将prefixes分成了5类。
x86体系结构CPU的5类prefixes,它们分别为:
lock prefix :F0
repeat prefixes :F2,F3
segment override prefixes :2E,36,3E,26,64,65
operand-size override prefix :66
address-size override prefix :67
指令的prefixes可以由这5类prefixes组成,但是每类prefixes只能在指令中出现一次,至于每类prefixes在指令的出项顺序是没有要求的,这点和指令的六个域是不同的。当某类prefixes在同一指令中出现多次的时候,CPU在执行过程中,可能会出现不可预料的结果,至于会不会出现异常,Intel的官方手册中只用了这句话来说明:such use may cause unpredictable behavior.鬼知道会出项什么情况,因此算法必须对这类机器码具有识别能力。但是也可能异常情况不会发生,在反汇编过程,遇到同一类prefixes出现多次的情况,以最后出现的prefix为准,进行机器码识别。
prefixes识别的核心代码:
for( ; nSizeOfCode > 0; nSizeOfCode--, pCode++)
{
IsPrefix = 1; //这个是用来判断当前机器码是不是prefixes
switch(*pCode)
{
case 0xF0:
x86体系结构CPU的每条指令都可能由以下六个域组成,并且它们在指令中的排列顺序是不能改变的。
这六个域分别是:
prefixes
code
ModR/M
SIB
displacement
immediate
在任何一条指令中code域是必须出现的,其他的域都是可选的。
由于这六个域在指令中的排列顺序是固定的,所以反汇编机器码,就是一个对它们的依次识别过程。
1.对prefixes的识别
Intel的官方手册上说有4类prefixes,为了便于编程和后面的描述,本人将prefixes分成了5类。
x86体系结构CPU的5类prefixes,它们分别为:
lock prefix :F0
repeat prefixes :F2,F3
segment override prefixes :2E,36,3E,26,64,65
operand-size override prefix :66
address-size override prefix :67
指令的prefixes可以由这5类prefixes组成,但是每类prefixes只能在指令中出现一次,至于每类prefixes在指令的出项顺序是没有要求的,这点和指令的六个域是不同的。当某类prefixes在同一指令中出现多次的时候,CPU在执行过程中,可能会出现不可预料的结果,至于会不会出现异常,Intel的官方手册中只用了这句话来说明:such use may cause unpredictable behavior.鬼知道会出项什么情况,因此算法必须对这类机器码具有识别能力。但是也可能异常情况不会发生,在反汇编过程,遇到同一类prefixes出现多次的情况,以最后出现的prefix为准,进行机器码识别。
prefixes识别的核心代码:
for( ; nSizeOfCode > 0; nSizeOfCode--, pCode++)
{
IsPrefix = 1; //这个是用来判断当前机器码是不是prefixes
switch(*pCode)
{
case 0xF0: