逆向课程第三讲逆向中的优化方式,以及加减乘

              逆向课程第三讲逆向中的优化方式,以及加减乘

一丶为什么要熟悉优化方式

熟悉优化方式,可以在看高级代码的时候浮现出汇编代码,以及做逆向对抗的时候,了解汇编代码混淆

优化和混淆是相反的

优化: 指的是汇编代码越少越好,让程序更快的执行

混淆: 一条汇编代码变为多条汇编代码,影响逆向人员的破解能力,但是软件的效率大大降低

二丶加减乘的常见的几种优化方式

优化方式分为:

1.常量折叠

2.常量传播

3.变量去除

这些优化方式成为窥孔优化 (有10几种后面会一一到来)

首先了解什么是常量折叠,常量传播,然后最后讲解什么是窥孔优化

1.常量折叠

介绍常量折叠,首先写一段小程序,举例子说明.

PS: 优化只有在Release版本下才会优化. Debug版本也会优化,在不影响用户调试的前提下进行优化的.

程序:

程序很简单,

常量+常量

变量+常量

变量+变量

首先常量加常量在优化中的汇编代码表现形式

我们定位入口点,查看下反汇编

自己的程序为了快速定位入口点,所以加个int 3断点,触发异常即可.

可以看出,直接变为push 0xF了,然后调用printf

这个就叫做常量折叠

常量折叠: 指的是在编译前遇到的常量,都可以进行计算的,得出一个新的常量值,这样则可以直接变为一个常量去push了

2.常量传播 或者叫做常量扩散

先看下刚才的所有汇编代码把.

首先说下这段汇编代码的意思:

push 0XF           压栈常量
push 00406030  压入格式化符号 %d,下面一样
call  00401030   调用printf        
下面一样,依次类推

这个时候可能会有疑问了

我们的变量+常量,  变量加变量,为什么都变成了一个常量去push了

答:

  这个叫做常量传播: 常量传播,指的是变量在写入或者读取的时间内,没有对它做修改,或者传地址,以及重新写入(也可以理解为赋值)的动作,那么在引用这个变量的时候,可以当做常量替换

可能不太懂:

  通俗一点就是说,我用变量+变量,两个变量上面根本就没有修改过,然后也没有传入地址(传入地址代表不确定是否修改,所以不给优化,VS2013 会优化,具体自己看)所以可以用常量代替

这个时候又有一个新问题了

我们变量加常量的时候,随便变为了常量传播了,但是用常量替换了

应该是 把n换成了常量 + 常量的

就比如:

n + 6

n没有修改过,现在是0,因为常量传播的原因,变为了0

变成了

0 + 6 才对,那为什么还是push一个常量了,这个就要说下,这个是窥孔优化了.

请先转到JMP 3窥孔优化查看.

JMP 回来之后,那么此时看减法和加法一样的. 只不过需要注意的是

比如我们的高级代码为:

n - 3

那么汇编代码可能变为add -3  ,或者直接sub

当然不影响结果.

乘法:

乘法的优化分为带幂优化和不带幂优化

带幂优化: 带幂优化则是我在算乘法的时候,我可以左移几位,最终取得我们要的结果

不带幂优化: 直接指令相乘.

看下高级代码对应汇编代码:

高级代码:

对应的汇编代码: 

PS看的是Debug版本,Release版本直接都常量折叠了,push的都是常量

可以看出都是有符号的相乘,不带幂的相乘

3.窥孔优化

窥孔优化,上面我们说了,变量+常量,那么变量没有修改的前提下,可以用常量代替的,

变为了常量+常量

但是优化方式是这样的

首先先看看你的变量+常量是否可以常量传播,现在能常量传播,变为了常量+常量了

其次,检查源代码有没有改变(或者标志,反正会检查)改变了,继续第二此优化,此时看到了常量+常量,接着常量折叠了.

优化就是这样的.

而且看你的变量也没有使用过,也去掉吧.

比如我们不让它常量传播怎么办,好办,直接写个空函数,然后传入地址即可.因为条件是不能传入地址,因为不确定是否会改变(2013会优化)

查看汇编代码

我们上面只要让n和m变成了不常量传播,那么此时n和m则不能常量传播,不能常量传播了,就要老老实实的该怎么做怎么做.

JMP 回去

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

@ts-check

本文作者:IMWeb elvin 原文出处:IMWeb社区 未经同意,禁止转载 由于 JavsScript是弱类型,所以在大型项目中使用时显得能力略有...

2758
来自专栏魂祭心

原 Type System Overvie

3528
来自专栏PHP在线

深入浅析PHP7.0新特征(五大新特征)

截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了...

29611
来自专栏风中追风

高效编程之HashMap的entryset和keyset比较

最近看了一点spring的源码,甚是苦涩;对spring稍微有了点整体的认识,但对很多细节的地方还是懵逼啊。。。太多不懂了的,只能慢慢去读,先把简单的不懂的解决...

37110
来自专栏nnngu

经典Java面试题收集

1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象...

4926
来自专栏前端架构与工程

【译】《Understanding ECMAScript6》- 第七章-Promise

目录 异步编程 Promise基础 链式Promise 多重Promise响应 Promise继承 总结 异步操作是JavaScript最强大的功能之一。Jav...

2006
来自专栏C#中的VList数据结构

VList data structures in C#

VLIST数据结构是由Phil Bagwell设计的,它作为在函数式编程语言单链表的替代品。它可以被认为是链接列表和动态数组(如.NET Framework的L...

3687
来自专栏C/C++基础

C++注释风格建议

有个笑话,一位从不写注释的程序员在编写一段复杂的代码时,骄傲地认为这段代码只有自己和上帝知道它是干嘛的,等过了一段时间再回顾时,发现没有注释,感叹到这段代码现在...

2011
来自专栏漫漫前端路

使用 TypeScript 开发你的项目

早在去年(2017),TypeScript 赢来了它的爆发式增长。时至今日,随着 JavaScript 的代码数量越来越庞大,越来越多的开发者意识到 JavaS...

5392
来自专栏deed博客

Java Map 集合类简介

2193

扫码关注云+社区

领取腾讯云代金券