x86机器码识别及其反汇编算法

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:
         
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值