zoukankan      html  css  js  c++  java
  • PC逆向之代码还原技术,第三讲汇编中加法的代码还原

    PC逆向之代码还原技术,第三讲汇编中加法的代码还原

    一丶汇编简介

    在讲解加法的代码还原之前.我们首先要知道. 加法在汇编中对应的指令是什么.
    Add 汇编指令. Add x,y 将x的值 加上y 并且重新赋值给x

    二丶高级代码对应汇编观看.

    观看如下代码

    int main(int argc, char* argv[])
    {
    
    	1 + 2;
    	int nValue = 10 + 2;    //常量 + 常量
    	int nVar = nValue + 10; //变量 + 常量
    	int nVar3 = nValue + nVar; //变量 + 变量
    	return 0;
    }
    

    有四种方式
    第一种 直接 空语句 1 + 2 ;
    第二种 常量 + 常量
    第三种 变量 + 常量
    第四种 变量 + 变量

    1.代码还原解析:

    代码还原解析需要了解的知识:

    reg: 代表任意通用寄存器
    imm: 立即数,可以看做常量
    ? : 代表任意数值.可以 [ebp -?]可以确定那个变量,变量是在栈中存放的.

    • 第一种方式
      此语句并不会产生作用.所以不会产生对应的汇编代码.

    • 第二种方式
      常量 + 常量 会在编译的时候直接进行优化. 如上面代码 10 + 2 产生的对应汇编代码为

    mov [ebp - ?],0xC
    
    • 第三种方式:

    第三种方式是变量+ 常量. 在汇编中.变量 + 常量并不能直接操作.需要交给寄存器进行中转

    所以会产生如下表达式

    mov reg,[ebp - ?]
    add reg,imm
    mov [ebp - ?],reg
    

    上面代码对应:

    .text:0040126F                 mov     eax, [ebp+ - 4]
    .text:00401272                 add     eax, 0Ah
    .text:00401275                 mov     [ebp - 4], eax
    
    • 第四种方式
      第四种方式 变量+变量

    变量 + 变量 不用想,肯定是交给寄存器中转.
    产生代码定式:

    mov reg,[ebp - ?]
    add reg,[ebp - ?]
    mov [ebp - ?],reg
    

    上面代码产生的汇编代码.IDA中查看.

    .text:00401278                 mov     ecx, [ebp+var_4]
    .text:0040127B                 add     ecx, [ebp+var_8]
    .text:0040127E                 mov     [ebp+var_C], ecx
    

    三丶根据上图完整汇编代码进行还原总结

    text:00401250 _main_0         proc near               ; CODE XREF: _main↑j
    .text:00401250
    .text:00401250 var_4C          = byte ptr -4Ch
    .text:00401250 var_C           = dword ptr -0Ch
    .text:00401250 var_8           = dword ptr -8
    .text:00401250 var_4           = dword ptr -4
    
    .text:00401268                 mov     [ebp+var_4], 0Ch  常量赋值给变量
    
    .text:0040126F                 mov     eax, [ebp+var_4]  三句代码可以看成一句
    .text:00401272                 add     eax, 0Ah          变量 + 常量 
    .text:00401275                 mov     [ebp+var_8], eax
    
    .text:00401278                 mov     ecx, [ebp+var_4]  三句代码可以看成一句
    .text:0040127B                 add     ecx, [ebp+var_8]  变量 + 变量 结果给变量
    .text:0040127E                 mov     [ebp+var_C], ecx
    .text:00401289 _main_0         endp
    .text:00401289
    

    总结

    根据上面加法的代码以及汇编对应的代码.我们可以产生代码定式

    常量 + 常量 常量直接进行优化.不会产生汇编代码.如果赋值给变量则产生汇编代码

    mov [ebp - ?],imm 
    

    常量 + 变量 赋值给变量 会产生汇编代码.此时我们心中要知道.如果操作变量相加.则肯定需要寄存器
    中转.所以会产生汇编代码

    mov reg,[ebp - ?]
    add reg,imm
    mov [ebp - ?] reg
    

    变量 + 变量 赋值给变量 操作了变量.那么心中自然知道.会操作寄存器. 而汇编允许寄存器+栈中的值
    所以可以产生代码定式

    mov reg,[ebp - 4] 变量1
    add reg,[ebp - 8] 变量2
    mov [ebp - c],reg 变量3
    三个代码可以看成 变量 + 变量 赋值给了变量
    

    注意:上面为Debug版本下产生的代码定式. 在Releas下会进行优化.
    在Releas下我们上面的代码会直接优化,没有产生任何汇编代码.
    原因是: 常量传播 窥孔优化 常量折叠. 因为上面代码我们并没有用. 无意义的代码.所以不断进行优化就会优化没有.
    可以参考本人编写的详细博客: 博客链接

  • 相关阅读:
    HTML滚动时位置固定
    SQL Server 2008中的代码安全===主密钥
    细说SQL Server中的加密
    SQL Server中的加密
    jQuery跨域调用WebService
    js中的preventDefault与stopPropagation详解
    jQuery中return false,e.preventDefault(),e.stopPropagation()的区别
    Tinymce在ASP.NET中的使用方法
    JSON.stringify 语法实例讲解
    json转字符串 —— jsonObj.toJSONString()与JSON.stringify(jsonObj)json to string
  • 原文地址:https://www.cnblogs.com/iBinary/p/9955060.html
Copyright © 2011-2022 走看看