VC的编译参数优化
一组优化VC成生可执行文件代码,通过设定不同的编译选项,对生成的可执行文件大小进行优化。可以达到712bytes。
来自:http://www.ph4nt0m.org
C++代码
1. /*
2. Author: void#ph4nt0m.org
3. */
4.
5. // 编译器 cl.exe(Visual C++ 6.0)
6. // 没有做任何优化情况下,编译大小为:16K
7. // 编译优化后: 1K (用16进制编辑器把尾部的0×00去掉: 712bytes)
8. #include
9. #pragma comment(lib,”kernel32.lib”)
10.
11. // 作用: 指定节对齐为512字节
12. #pragma comment(linker, “/align:512″)
13.
14. // 作用: 合并节
15. // 将.data节和.rdata节合并到.text节(代码节)
16. #pragma comment(linker, “/merge:.data=.text”)
17. #pragma comment(linker, “/merge:.rdata=.text”)
18.
19. // 作用: 指定子系统为windows (和优化无关)
20. // vc编译器默认是console,会有个黑糊糊的CMD窗口,不好看.用windows就好了
21. #pragma comment(linker, “/subsystem:windows”)
22.
23. // 作用: 指定入口函数
24. // 子系统为windows的默认入口点WinMain和console的默认入口点main,都会引入一段启动stub代码,指定入口函数可去掉之.
25. #pragma comment(linker, “/ENTRY:main”)
26.
27.
28. //int WinMain(HINSTANCE current, HINSTANCE prev, LPSTR cmdline, int showcmd)
29.
30. // 作用: 去掉函数的栈帧代码,纯属吹毛求疵:-)
31. // 即函数开头的push ebp / mov ebp, esp和结尾的pop ebp / retn
32. __declspec(naked)
33. void main()
34. {
35. // 调用wmp. 这是按套路出牌的方法.
36. //typedef VOID (__stdcall *fnRunDllW)(HWND, HINSTANCE, LPCWSTR, DWORD);
37. //((fnRunDllW)GetProcAddress(LoadLibrary(“msdxm.ocx”), “RunDllW”))(0,0,0,0);
38.
39. // 不按套路出牌,不压入RunDllW的函数参数,直接调用.
40. GetProcAddress(LoadLibrary(“msdxm.ocx”), “RunDllW”)();
41. // 注意此时的堆栈是不平衡的.
42. // 但是通过ExitProcess()退出自身,就不用去考虑平衡了.
43. ExitProcess(0);
44. }