最近在研究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