前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PC逆向之代码还原技术,第三讲汇编中加法的代码还原

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

作者头像
IBinary
发布2019-05-25 16:38:35
4460
发布2019-05-25 16:38:35
举报
文章被收录于专栏:逆向技术逆向技术

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

一丶汇编简介

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

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

观看如下代码

代码语言:javascript
复制
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 产生的对应汇编代码为
代码语言:javascript
复制
mov [ebp - ?],0xC
  • 第三种方式:

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

所以会产生如下表达式

代码语言:javascript
复制
mov reg,[ebp - ?]
add reg,imm
mov [ebp - ?],reg

上面代码对应:

代码语言:javascript
复制
.text:0040126F                 mov     eax, [ebp+ - 4]
.text:00401272                 add     eax, 0Ah
.text:00401275                 mov     [ebp - 4], eax
  • 第四种方式 第四种方式 变量+变量

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

代码语言:javascript
复制
mov reg,[ebp - ?]
add reg,[ebp - ?]
mov [ebp - ?],reg

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

代码语言:javascript
复制
.text:00401278                 mov     ecx, [ebp+var_4]
.text:0040127B                 add     ecx, [ebp+var_8]
.text:0040127E                 mov     [ebp+var_C], ecx

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

代码语言:javascript
复制
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

总结

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

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

代码语言:javascript
复制
mov [ebp - ?],imm 

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

代码语言:javascript
复制
mov reg,[ebp - ?]
add reg,imm
mov [ebp - ?] reg

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PC逆向之代码还原技术,第三讲汇编中加法的代码还原
    • 一丶汇编简介
      • 二丶高级代码对应汇编观看.
        • 1.代码还原解析:
        • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档