最优化编译设置文库

上传人:汽*** 文档编号:505533212 上传时间:2023-11-23 格式:DOCX 页数:13 大小:19.71KB
返回 下载 相关 举报
最优化编译设置文库_第1页
第1页 / 共13页
最优化编译设置文库_第2页
第2页 / 共13页
最优化编译设置文库_第3页
第3页 / 共13页
最优化编译设置文库_第4页
第4页 / 共13页
最优化编译设置文库_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《最优化编译设置文库》由会员分享,可在线阅读,更多相关《最优化编译设置文库(13页珍藏版)》请在金锄头文库上搜索。

1、人们都说 vc 做出的东西可以小点,现在你打开 vc 编译一个 Hello World 出来!点属性看下, 咦!我没走眼吧,就一 Hello World就160kb真是要人命啊!呵呵! 上面的情况是笔者所遭遇的情况.不过后来了解 vc 可以通过设置参数来自定义编译方 式.为什么文件那么大! 主要是编译器加入了很多没必要的代码(这里是对我们而言,不过有些 代码还是有利于安全的).好了我们就手动改下编译器的参数来看看能到多大!我们主要用到的技巧有:一,使用 release 版而不用 debug 版编译使用debug版编译会生成许多垃圾信息.我们先使用默认的设置进行一下编译.可以看到编译 后生成的文

2、件有152k之巨使用release版编译具体方法是:在build(编 译) Configuration(配置)中将Win32 debug移去,然后再次编译可以发现文件已经小 了很多,才24k.但离我们的目标还很远呢.二, 设置自己的入口点函数C或C+程序默认的入口函数是main ()或WinMain(),但我们现在不用什么Main,WinMain.因 为这些都不是直接的入口点,编译器在产生 exe 文件的时候,将为我们生成真正的入口点.下 面我们来定义自己的入口函数,具体是把main或WinMain改成其它的名字(如MyFun),打开 Project (工程) settings(设置)选项,选

3、中link选项卡,在Category(分类)下拉列 表中选output,在Entry-Point symbol(输入项-点符号)中输入我们刚才定义的入口函数 (MyFun),在源程序中也要做相应修改,然后再编译.现在是16k 了:)三, 更改编译对齐方式通常VC在编译的时候,采用的对齐方式是0x1000,即4096bytes,我们现在将他改成0x200,即 512bytes.在刚才打开的link选项卡,在下面的Project opt ions(工程选项)中添加:/align:512(还 可以将512设置的更小如16,32).注意两个参数之间有个空格.3k 了用32试试1.84k好用161.79

4、k 天哪!再把程序的数据段和代码段放在一起,添加:/merge.data二.text /merge:.rdata二.text 1.76k go on!另外,如果要是用到MFC函数的程序,可在Project (工程)-settings(设置)里面的通用 (General)选项卡中在Microsoft Founda tion Classes中选择使用一个 MFC 的 dll(Use MFC in a Share Dll)也会使文件大小缩小很多现在我们的超小后门编译好了,试下能用否.ok没 问题哦大家注意到程序运行时会产生一个cmd窗口,要让他没有就好了.这也好办.回到VC+中,在Project (

5、工程) settings(设置)选项,选中link选项卡,在下面的 Project options(工程选项)有/subsystem:console选项,表示程序是控制台程序,双击运 行是会有一个cmd窗口,把console改为windows就没有窗口了:),运行一下 没有窗口哦 但 有进程 连接一下试试ok没问题这样我们的超小1.76k telnet小后门就成功了不被查杀哦/ 编译器 cl.exe(Visual C+ 6.0)/没有做任何优化情况下,编译大小为:16K/编译优化后:1K (用16进制编辑器把尾部的0x00去掉:712bytes)#include windows.h#pragm

6、a comment(lib,kernel32.lib)/ 作用: 指定节对齐为512字节#pragma comment(linker, /align:512)/ 作用: 合并节/将.da ta节和.rda ta节合并到.t ext节(代码节)#pragma comment(linker, /merge:.data=.text)#pragma comment(linker, /merge:.rdata=.text)/ 作用: 指定子系统为 windows (和优化无关)/ vc编译器默认是console,会有个黑糊糊的CMD窗口,不好看.用windows就好了 #pragma comment(l

7、inker, /subsystem:windows)/ 作用: 指定入口函数/子系统为windows的默认入口点WinMain和console的默认入口点main,都会引入#pragma comment(linker, /ENTRY:main)/int WinMain(HINSTANCE current, HINSTANCE prev, LPSTR cmdline, int /showcmd)/ 作用: 去掉函数的栈帧代码, 纯属吹毛求疵:-)/ 即函数开头的 push ebp / mov ebp, esp 和结尾的 pop ebp / retn_declspec(naked)void mai

8、n()/ 调用 wmp. 这是按套路出牌的方法./typedef VOID (_stdcall *fnRunDllW)(HWND, HINSTANCE, LPCWSTR, DWORD); /(fnRunDllW)GetProcAddress(LoadLibrary(msdxm.ocx), RunDllW)(0,0,0,0);/不按套路出牌,不压入RunDllW的函数参数,直接调用./GetProcAddress(LoadLibrary(msdxm.ocx), RunDllW)(); MessageBox(0,0,0,0);/ 注意此时的堆栈是不平衡的./但是通过ExitProcess()退出自

9、身,就不用去考虑平衡了. ExitProcess(0);微软 C/C+ 编译器选项-优化-/O1 最小化空间/Op- 改善浮点数一致性/O2最大化速度/Os优选代码空间/Oa假设没有别名/Ot优选代码速度 /Ob 内联展开(默认 n=0)/Ow 假设交叉函数别名/Od禁用优化(默认值)/Ox最大化选项。(/Ogityb2 /Gs) /Og启用全局优化/Oy- 启用框架指针省略/Oi 启用内部函数-代码生成-/G3为 80386 进行优化/GH启用 _pexit 函数调用/G4为 80486 进行优化/GR-启用 C+ RTTI/G5为 Pentium 进行优化/GX-启用C+ EH (与/EH

10、sc相同)/G6为 PPro、P-II、 P-III 进行优化/EHs启用C+ EH (无SEH异常)/GB 为混合模型进行优化(默认)/EHa启用 C+ EH( w/ SEH 异常)/Gd_cdecl 调用约定/EHc外部“C”默认为no throw/Gr_fastcall 调用约定/GT 生成纤维安全 TLS 访问/Gz_stdcall 调用约定/Gm- 启用最小重新生成/GA为 Windows 应用程序进行优化/GL- 启用链接时代码生成/Gf启用字符串池/QIfdiv-启用 Pentium FDIV 修复/GF 启用只读字符串池/QI0f-启用 Pentium 0x0f 修复/Gy 分

11、隔链接器函数/QIfist-使用 FIST 而不是 ftol()/GZ启用堆栈检查 (/RTCs)/RTC1启用快速检查 (/RTCsu) /Ge对所有函数强制堆栈检查 /RTCc 转换为较小的类型检查/Gsnum 控制堆栈检查调用/RTCs 堆栈帧运行时检查/GS启用安全检查/RTCu 未初始化的本地用法检查/Gh启用 _penter 函数调用/clr:noAssembly为公共语言运行时库编译 noAssembly - 不产生程序集-输出文件-/Fafile 命名程序集列表文件/Fo 命名对象文件/FAsc 配置程序集列表/Fp 命名预编译头文件/Fdfile 命名 .PDB 文件/Frf

12、ile 命名源浏览器文件 /Fe命名可执行文件/FRfile命名扩展 .SBR 文件/Fmfile命名映射文件-预处理器-/AI 添加到程序集搜索路径/Fx 将插入的代码合并到文件/FU 强制使用程序集/模块/FI 命名强制包含文件/C不抽出注释/U移除预定义宏/D=|# 定义宏/u 移除所有预定义宏/E预处理到 stdout/I 添加到包含搜索路径/EP预处理到st dou t,没有#line忽略“标准位置” /P 预处理到文件心1=1/Zi 启用调试信息/Zl忽略 .OBJ 中的默认库名/ZI启用“编辑并继续”调试信息/Zg 生成函数原型/Z7 启用旧式调试信息/Zs 只进行语法检查/Zd

13、 仅有行号调试信息/vd0|1禁用/启用 vtordisp/Zpn在 n 字节边界上包装结构/vm 指向成员的指针类型/Za 禁用扩展(暗指 /Op)/noBool禁用“ bool ”关键字 /Ze启用扩展(默认) /Zc:arg1,arg2C+语言一致性,这里的参数可以是:forScope-对范围规则强制使用标准C+; wchar_t- wchar_t 是本机类型,不是 typedef- 杂项 - 选项响应文件/wo 发出一次警告 n/?, /help打印此帮助消息/w为 n 设置警告等级 1-4/c只编译,不链接/W设置警告等级(默认 n=1)/H最大外部名称长度/Wall启用所有警告/J

14、默认 char 类型是 unsigned/Wp64启用 64 位端口定位警告/nologo 取消显示版权消息 /WX 将警告视为错误/showIncludes 显示包含文件名/WL启用单行诊断/Tc将文件编译为 .c/Ycfile创建 .PCH 文件/Tp将文件编译为 .cpp/Yd 将调试信息放在每个 .OBJ 中/TC将所有文件编译为 .c/Ylsym为调试库插入 .PCH 引用/TP将所有文件编译为 .cpp/Yufile使用 .PCH 文件/V设置版本字符串/YXfile自动 .PCH/w禁用所有警告/Y-禁用所有 PCH 选项 /wd 禁用警告 n/Zm 最大内存分配(默认为 %) /we将警告 n 视为错误-链接-/MD与 MSVCRT.LIB 链接/MDd与 MSVCRTD.LIB 调试库链接/M

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号