zoukankan      html  css  js  c++  java
  • 对VC6编译优化的简单测试


    最近在研究C++的逆向,为了了解VC编译器的代码生成规则,经常自己编写测试代码,然后使用VC编译,再通过Ollydbg来查看反汇编情况。
    但是,由于默认程序都是生成Debug版本,中间插入了一些未优化代码,尤其是堆栈检查指令CC,不但干扰我的分析调试过程,同时在实际的第三方程序调试过程中,也很少有Debug版本,所以我需要去掉这些信息。
    为什么不直接使用Release版本编译呢,这是因为默认的的Release优化是很可怕的,比如我写了一些简单的类和过程调用,都会被直接优化掉的,因此为了还原真实的程序意图和流程,我决定在Debug版本下自己控制编译选项,生成我需要的二进制码。

    本次测试的代码很简单,如下:
    int main(int argc, char* argv[])
    {
        return 0;
    }
    以下针对测试代码,采用不同的编译器优化选项来生成代码。
    本测试在WinXP下,使用VC6.0进行。

    由于编译选项较多,因此只作了一些基本测试。每一种测试我都说明了所使用的优化选项,以及展示了从Ollydbg中提取的反汇编代码。详情如下文所示:


    1. Disable Optimization
    ================================================================================
    本选项生成选项为Od
    Od: 禁止代码优化
    ================================================================================
    00401030 PUSH EBP
    00401031 MOV EBP,ESP
    00401033 SUB ESP,40
    00401036 PUSH EBX
    00401037 PUSH ESI
    00401038 PUSH EDI
    00401039 LEA EDI,DWORD PTR SS:[EBP-40]
    0040103C MOV ECX,10
    00401041 MOV EAX,CCCCCCCC
    00401046 REP STOS DWORD PTR ES:[EDI]
    00401048 XOR EAX,EAX
    0040104A POP EDI
    0040104B POP ESI
    0040104C POP EBX
    0040104D MOV ESP,EBP
    0040104F POP EBP
    00401050 RETN
    上面红色部分都是编译器填充的指令,对我的学习和测试干扰较大,我想要去掉它们,只保留绿色部分!


    2. Default Optimization
    ================================================================================
    本选项不生成任何优化开关
    ================================================================================
    00401030 PUSH EBP
    00401031 MOV EBP,ESP
    00401033 SUB ESP,40
    00401036 PUSH EBX
    00401037 PUSH ESI
    00401038 PUSH EDI
    00401039 LEA BP-40]
    0040103C ECX,10
    00401041 MOV EAX,CCCCCCCC
    00401046 REP EDI]
    00401048 XOR EAX,EAX
    0040104A POP EDI
    0040104B POP ESI
    0040104C POP EBX
    0040104D MOV ESP,EBP
    0040104F POP EBP
    00401050 RETN



    3. Minimize Optimization
    ================================================================================
    本选项生成选项为O1
    O1: 优化使产生的可执行代码最小
    Zi: 生成程序库文件(pdb),包含类型信息和符号调试信息
    GZ: 允许在Debug build 的时候捕捉Release build的错误
    ================================================================================
    0040100F XOR EAX,EAX
    00401011 RETN

    这玩意已经把栈帧的维护代码都优化掉了,不是我需要的结果!



    4. Maximize Optimization
    ================================================================================
    本选项生成选项为O2
    O2:  优化使产生的可执行代码速度最快
    ================================================================================
    00401010 XOR EAX,EAX
    00401012 RETN


    5. Customize Optimization (未选择任何优化选项)
    ================================================================================
    未选择任何自定义优化选项
    ================================================================================
    00401020 PUSH EBP
    00401021 MOV EBP,ESP
    00401023 XOR EAX,EAX
    00401025 POP EBP
    00401026 RETN

    这个是最符合源代码的结果了,因此在实际的逆向学习过程中,我将选择这种编译开关!



    6. Customize Optimization (Assume no aliasing)
    ================================================================================
    本选项生成选项为Oa
    Oa: 指示编译器程序里没有使用别名,可以提高程序的执行速度
    ================================================================================
    00401020 PUSH EBP
    00401021 MOV EBP,ESP
    00401023 XOR EAX,EAX
    00401025 POP EBP
    00401026 RETN

    7. Customize Optimization (Global Optimizations)
    ================================================================================
    本选项生成选项为Og
    Og: 使用全局优化
    ================================================================================
    00401020 XOR EAX,EAX
    00401022 RETN

  • 相关阅读:
    线段树
    数据结构<三> 队列
    数据结构<二>双向链表
    数据结构<一>单链表
    扩展欧几里德算法
    90 个 node.js 扩展模块,我们疯了
    nodejs的查询构造器
    express的路由配置优化
    express路由方案
    Redis学习笔记~目录
  • 原文地址:https://www.cnblogs.com/bitxj/p/2722092.html
Copyright © 2011-2022 走看看