注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

逆向_第八课  

2010-03-20 08:53:23|  分类: 逆向 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
   在进行软件分析的过程中,经常需要计算转移指令机器码或修改指定的

代码.虽然许许多多的辅助工具同样可以做到这些事,但是掌握其原理还是必

要的.
    根据转移的距离远近,还可以分为以下几类:
    短转移:无条件转移和条件转移的机器码都是两个字节.转移范围是-

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
  评论这张
 
阅读(338)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017