最优化编译设置文库.doc

上传人:M****1 文档编号:563940496 上传时间:2023-11-30 格式:DOC 页数:14 大小:43.51KB
返回 下载 相关 举报
最优化编译设置文库.doc_第1页
第1页 / 共14页
最优化编译设置文库.doc_第2页
第2页 / 共14页
最优化编译设置文库.doc_第3页
第3页 / 共14页
最优化编译设置文库.doc_第4页
第4页 / 共14页
最优化编译设置文库.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

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

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

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

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

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

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

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

7、系统为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 main()/ 调用wmp. 这是按套路出牌的方法./typedef VOID (_stdcal

8、l *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()退出自身,就不用去考虑平衡了.ExitProcess(0);微软C/C+ 编译器选项 -优化- /

9、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(与 /EHsc 相同) /G6 为 PP

10、ro、P-II、P-III 进行优化 /EHs 启用 C+ EH(无 SEH 异常) /GB 为混合模型进行优化(默认) /EHa 启用 C+ EH(w/ SEH 异常) /Gd _cdecl 调用约定 /EHc 外部“C”默认为 nothrow /Gr _fastcall 调用约定 /GT 生成纤维安全 TLS 访问 /Gz _stdcall 调用约定 /Gm- 启用最小重新生成 /GA 为 Windows 应用程序进行优化 /GL- 启用链接时代码生成 /Gf 启用字符串池 /QIfdiv- 启用 Pentium FDIV 修复 /GF 启用只读字符串池 /QI0f- 启用 Pentium

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

12、/Fp 命名预编译头文件 /Fdfile 命名 .PDB 文件 /Frfile 命名源浏览器文件 /Fe 命名可执行文件 /FRfile 命名扩展 .SBR 文件 /Fmfile 命名映射文件 -预处理器- /AI 添加到程序集搜索路径 /Fx 将插入的代码合并到文件 /FU 强制使用程序集/模块 /FI 命名强制包含文件 /C 不抽出注释 /U 移除预定义宏 /D=|# 定义宏 /u 移除所有预定义宏 /E 预处理到 stdout /I 添加到包含搜索路径 /EP 预处理到 stdout,没有 #line /X 忽略“标准位置” /P 预处理到文件 -语言- /Zi 启用调试信息 /Zl 忽

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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

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