zoukankan      html  css  js  c++  java
  • 逆向课程第三讲逆向中的优化方式,以及加减乘

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

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

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

    优化和混淆是相反的

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

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

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

    优化方式分为:

    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 回去

  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/iBinary/p/7801091.html
Copyright © 2011-2022 走看看