[教程]逆向反汇编第八课
2010-10-10 16:11
330 查看
在进行软件分析的过程中,经常需要计算转移指令机器码或修改指定的代码.虽然许许多多的辅助工具同样可以做到这些事,但是掌握其原理还是必要的.
根据转移的距离远近,还可以分为以下几类:.
短转移:无条件转移和条件转移的机器码都是两个字节.转移范围是-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个字节的范围内.
有两个因素制约转移指令机器码:一个是上表列出的转移类型;另一个是转移的位移量.
(1)短转移指令机器码计算实例
例如,代码段中有一条如下所示的无条件转移指令:
无条件短转移的机器码形式为EBxx,其中EB00~EB7F,是向后转移,EB00~EBFF是向前转移.转移指令的机器码形式是:
位移量=目的地址-起始地址-跳转指令本身的长度.
转移指令机器码="转移类别机器码"+"位移量"
(2)长转移指令机器码计算实例
例如:代码段中有一条如下所示的的无条件转移指令:
无条件转移指令的长度是5个字节,机器码是E9,根据上面公式,此例转移的位置为:
00402398h-00401000h-5h=00001393h
转移指令机器码="转移类别机器码'+"位移量"="E9"+'93 13 00 00'=E9 93 13 00 00
上面两个实例演示转移指令向后转移(由低地址到高地址).如果是向前转移(由高地址到低地址),计算方法一样.
例如,代码段中有一条如下所示的无条件转移指令向前转移:
位移量=401000h-402398-5h=FFFFEC63h(取后32位)
转移机器码="E9'+"63 EC FF FF"=E9 63 EC FF FF
根据转移的距离远近,还可以分为以下几类:.
短转移:无条件转移和条件转移的机器码都是两个字节.转移范围是-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个字节的范围内.
指令格式 | 机器码 | 测试条件 | 如….则跳转 |
CALL | E8 | ---- | 无条件转移指令 |
JMP | EB | ----- | 无条件转移 |
JO | 70 | OF=1 | 有溢出 |
JNO | 71 | OF=0 | 无溢出 |
JB/JC/JNAE | 72 | CF=1 | 高于等于/不低于/无进位 |
JAE/JNB/JNC | 73 | CF=0 | 无进位 |
JZ/JE | 74 | ZF=1 | 等于零/等于 |
JNZ/JNE | 75 | ZF=0 | 不为零/不等于 |
JBE/JNA | 76 | CF=1或ZF=1 | 低于等于/不高于 |
JA/JNBE | 77 | CF=0且ZF=0 | 高于/不低于等于 |
JS | 78 | SF=1 | 符号为负号 |
JNS | 79 | SF=0 | 符号为正号 |
JP/JPE | 7A | PF=1 | 奇偶位为偶(或1的个数为偶数个) |
JNP/JPO | 7B | PF=0 | 奇偶位为奇(或1的个数为奇数个) |
JL/JNGE | 7C | SF!=OF | 小于/不大于等于 |
JGE/JNL | 7D | SF=OF | 大于等于/不小于 |
JLE/JNG | 7E | SF!=OF或ZF=1 | 小于等于/不大于 |
JG/JNLE | 7F | SF=OF且ZF=0 | 大于/不小于等于 |
(1)短转移指令机器码计算实例
例如,代码段中有一条如下所示的无条件转移指令:
......... ;00401000 jmp 00401005 ......... ;00401005 xor eax,eax ........
无条件短转移的机器码形式为EBxx,其中EB00~EB7F,是向后转移,EB00~EBFF是向前转移.转移指令的机器码形式是:
位移量=目的地址-起始地址-跳转指令本身的长度.
转移指令机器码="转移类别机器码"+"位移量"
(2)长转移指令机器码计算实例
例如:代码段中有一条如下所示的的无条件转移指令:
....... ;00401000 jmp 00402398 ....... ;00402398 xor eax,eax ......
无条件转移指令的长度是5个字节,机器码是E9,根据上面公式,此例转移的位置为:
00402398h-00401000h-5h=00001393h
转移指令机器码="转移类别机器码'+"位移量"="E9"+'93 13 00 00'=E9 93 13 00 00
上面两个实例演示转移指令向后转移(由低地址到高地址).如果是向前转移(由高地址到低地址),计算方法一样.
例如,代码段中有一条如下所示的无条件转移指令向前转移:
;00401000 xor eax,eax ..... ;00402398 jmp 00401000 ...
位移量=401000h-402398-5h=FFFFEC63h(取后32位)
转移机器码="E9'+"63 EC FF FF"=E9 63 EC FF FF
相关文章推荐
- [教程]逆向反汇编第八课
- [教程]逆向反汇编第一课
- [教程]逆向反汇编第二课
- [教程]逆向反汇编第三课
- [教程]逆向反汇编第四课
- [教程]逆向反汇编第五课
- [教程]逆向反汇编第六课
- [教程]逆向反汇编第一课
- [教程]逆向反汇编第七课
- [教程]逆向反汇编第二课
- [教程]逆向反汇编第九课
- [教程]逆向反汇编第三课
- [教程]逆向反汇编第十课
- [教程]逆向反汇编第五课
- [教程]逆向反汇编第十一课
- [教程]逆向反汇编第六课
- [教程]逆向反汇编第七课
- [教程]逆向反汇编第九课
- Win32汇编教程十 定时器的应用
- Spring Data JPA教程, 第八部分:Adding Functionality to a Repository (未翻译)