[教程]逆向反汇编第八课

来源:互联网 发布:网络增值服务登录 编辑:程序博客网 时间:2024/04/29 22:45

在进行软件分析的过程中,经常需要计算转移指令机器码或修改指定的代码.虽然许许多多的辅助工具同样可以做到这些事,但是掌握其原理还是必要的.
根据转移的距离远近,还可以分为以下几类:.
短转移:无条件转移和条件转移的机器码都是两个字节.转移范围是-128~+127字节.
长转移:无条件转移的机器码是5哥字节,条件转移的机器码是6哥字节.这是因为条件转移要用2个字节表示其转移类型(如je jg和jns),其他4哥字节表示转移偏移量.无条件转移要用2个字节表示其转移(如je jg和jns),其他4个字节表示转移偏移量.转移仅用一个字节就可以表示其转移类型(jmp),其他4个字节表示转移偏移量.
子程序调用指令(call):不知道大家有其他语言基础没,有的话就好说了,其他语言中有子程序这个玩意.我们调用子程序就相当于CALL.call指令调用有两类,一类是平常经常接触到的,类似长转移.另一类其调用的参数涉及到寄存器 堆栈等值.比较复杂,如"call dword ptr [eax+2]".条件转移指令的转移范围是16位模式遗留下的,当时为了使代码紧凑些,CPU开发人员只给目的分配了一个字节,这样限制了跳转的长度只能在255个字节的范围内.

指令格式机器码测试条件如….则跳转CALLE8----无条件转移指令JMPEB-----无条件转移JO70OF=1有溢出JNO71OF=0无溢出JB/JC/JNAE72CF=1高于等于/不低于/无进位JAE/JNB/JNC73CF=0无进位JZ/JE74ZF=1等于零/等于JNZ/JNE75ZF=0不为零/不等于JBE/JNA76CF=1或ZF=1低于等于/不高于JA/JNBE77CF=0且ZF=0高于/不低于等于JS78SF=1符号为负号JNS79SF=0符号为正号JP/JPE7APF=1奇偶位为偶(或1的个数为偶数个)JNP/JPO7BPF=0奇偶位为奇(或1的个数为奇数个)JL/JNGE7CSF!=OF小于/不大于等于JGE/JNL7DSF=OF大于等于/不小于JLE/JNG7ESF!=OF或ZF=1小于等于/不大于JG/JNLE7FSF=OF且ZF=0大于/不小于等于

有两个因素制约转移指令机器码:一个是上表列出的转移类型;另一个是转移的位移量.
(1)短转移指令机器码计算实例
例如,代码段中有一条如下所示的无条件转移指令:

 

view plaincopy to clipboardprint?
  1. .........    
  2. ;00401000 jmp 00401005    
  3. .........    
  4. ;00401005 xor eax,eax    
  5. ........  

 

无条件短转移的机器码形式为EBxx,其中EB00~EB7F,是向后转移,EB00~EBFF是向前转移.转移指令的机器码形式是:
位移量=目的地址-起始地址-跳转指令本身的长度.
转移指令机器码="转移类别机器码"+"位移量"
(2)长转移指令机器码计算实例
例如:代码段中有一条如下所示的的无条件转移指令:

 

view plaincopy to clipboardprint?
  1. .......    
  2. ;00401000 jmp 00402398    
  3. .......    
  4. ;00402398 xor eax,eax    
  5. ......  

 

无条件转移指令的长度是5个字节,机器码是E9,根据上面公式,此例转移的位置为:
00402398h-00401000h-5h=00001393h
转移指令机器码="转移类别机器码'+"位移量"="E9"+'93 13 00 00'=E9 93 13 00 00
上面两个实例演示转移指令向后转移(由低地址到高地址).如果是向前转移(由高地址到低地址),计算方法一样.
例如,代码段中有一条如下所示的无条件转移指令向前转移:

 

view plaincopy to clipboardprint?
  1. ;00401000 xor eax,eax    
  2. .....    
  3. ;00402398 jmp 00401000    
  4. ...  

 

位移量=401000h-402398-5h=FFFFEC63h(取后32位)
转移机器码="E9'+"63 EC FF FF"=E9 63 EC FF FF

原创粉丝点击