让vc编译出的程序 减小体积.doc_第1页
让vc编译出的程序 减小体积.doc_第2页
让vc编译出的程序 减小体积.doc_第3页
让vc编译出的程序 减小体积.doc_第4页
让vc编译出的程序 减小体积.doc_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

让vc编译出的程序 减小体积转自邪恶八进制-人们都说vc做出的东西可以小点,现在你打开vc编译一个HelloWorld出来!点属性看下,咦!我没走眼吧,就一HelloWorld就160kb真是要人命啊!呵呵!上面的情况是笔者所遭遇的情况.不过后来了解vc可以通过设置参数来自定义编译方式.为什么文件那么大!主要是编译器加入了很多没必要的代码(这里是对我们而言,不过有些代码还是有利于安全的).好了我们就手动改下编译器的参数来看看能到多大!我们主要用到的技巧有:一,使用release版而不用debug版编译使用debug版编译会生成许多垃圾信息.我们先使用默认的设置进行一下编译.可以看到编译后生成的文件有152k之巨.使用release版编译具体方法是:在build(编译)-Configuration(配置)中将Win32debug移去,然后再次编译可以发现文件已经小了很多,才24k.但离我们的目标还很远呢.二,设置自己的入口点函数C或C+程序默认的入口函数是main()或WinMain(),但我们现在不用什么Main,WinMain.因为这些都不是直接的入口点,编译器在产生exe文件的时候,将为我们生成真正的入口点.下面我们来定义自己的入口函数,具体是把main或WinMain改成其它的名字(如MyFun),打开Project(工程)-settings(设置)选项,选中link选项卡,在Category(分类)下拉列表中选output,在Entry-Pointsymbol(输入项-点符号)中输入我们刚才定义的入口函数(MyFun),在源程序中也要做相应修改,然后再编译.现在是16k了:)三,更改编译对齐方式通常VC在编译的时候,采用的对齐方式是0x1000,即4096bytes,我们现在将他改成0x200,即512bytes.在刚才打开的link选项卡,在下面的Projectoptions(工程选项)中添加:/align:512(还可以将512设置的更小如16,32.).注意两个参数之间有个空格.3k了_用32试试1.84k好用161.79k天哪!再把程序的数据段和代码段放在一起,添加:/merge.data=.text/merge:.rdata=.text1.76kgoon!另外,如果要是用到MFC函数的程序,可在Project(工程)-settings(设置)里面的通用(General)选项卡中在MicrosoftFoundationClasses中选择使用一个MFC的dll(UseMFCinaShareDll)也会使文件大小缩小很多.现在我们的超小后门编译好了,试下能用否.ok没问题哦大家注意到程序运行时会产生一个cmd窗口,要让他没有就好了.这也好办.回到VC+中,在Project(工程)-settings(设置)选项,选中link选项卡,在下面的Projectoptions(工程选项)有/subsystem:console选项,表示程序是控制台程序,双击运行是会有一个cmd窗口,把console改为windows就没有窗口了.:),运行一下没有窗口哦但有进程连接一下试试ok没问题这样我们的超小1.76ktelnet小后门就成功了不被查杀哦_/编译器cl.exe(VisualC+6.0)/没有做任何优化情况下,编译大小为:16K/编译优化后:1K(用16进制编辑器把尾部的0x00去掉:712bytes)#includewindows.h#pragmacomment(lib,kernel32.lib)/作用:指定节对齐为512字节#pragmacomment(linker,/align:512)/作用:合并节/将.data节和.rdata节合并到.text节(代码节)#pragmacomment(linker,/merge:.data=.text)#pragmacomment(linker,/merge:.rdata=.text)/作用:指定子系统为windows(和优化无关)/vc编译器默认是console,会有个黑糊糊的CMD窗口,不好看.用windows就好了#pragmacomment(linker,/subsystem:windows)/作用:指定入口函数/子系统为windows的默认入口点WinMain和console的默认入口点main,都会引入#pragmacomment(linker,/ENTRY:main)/intWinMain(HINSTANCEcurrent,HINSTANCEprev,LPSTRcmdline,int/showcmd)/作用:去掉函数的栈帧代码,纯属吹毛求疵:-)/即函数开头的pushebp/movebp,esp和结尾的popebp/retn_declspec(naked)voidmain()/调用wmp.这是按套路出牌的方法./typedefVOID(_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()退出自身,就不用去考虑平衡了.ExitProcess(0);微软C/C+编译器选项-优化-/O1最小化空间/Op-改善浮点数一致性/O2最大化速度/Os优选代码空间/Oa假设没有别名/Ot优选代码速度/Obn内联展开(默认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为PPro、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-启用PentiumFDIV修复/GF启用只读字符串池/QI0f-启用Pentium0x0f修复/Gy分隔链接器函数/QIfist-使用FIST而不是ftol()/GZ启用堆栈检查(/RTCs)/RTC1启用快速检查(/RTCsu)/Ge对所有函数强制堆栈检查/RTCc转换为较小的类型检查/Gsnum控制堆栈检查调用/RTCs堆栈帧运行时检查/GS启用安全检查/RTCu未初始化的本地用法检查/Gh启用_penter函数调用/clr:noAssembly为公共语言运行时库编译noAssembly-不产生程序集-输出文件-/Fafile命名程序集列表文件/Fofile命名对象文件/FAsc配置程序集列表/Fpfile命名预编译头文件/Fdfile命名.PDB文件/Frfile命名源浏览器文件/Fefile命名可执行文件/FRfile命名扩展.SBR文件/Fmfile命名映射文件-预处理器-/AIdir添加到程序集搜索路径/Fx将插入的代码合并到文件/FUfile强制使用程序集/模块/FIfile命名强制包含文件/C不抽出注释/Uname移除预定义宏/Dname=|#text定义宏/u移除所有预定义宏/E预处理到stdout/Idir添加到包含搜索路径/EP预处理到stdout,没有#line/X忽略标准位置/P预处理到文件-语言-/Zi启用调试信息/Zl忽略.OBJ中的默认库名/ZI启用编辑并继续调试信息/Zg生成函数原型/Z7启用旧式调试信息/Zs只进行语法检查/Zd仅有行号调试信息/vd0|1禁用/启用vtordisp/Zpn在n字节边界上包装结构/vmx指向成员的指针类型/Za禁用扩展(暗指/Op)/noBool禁用bool关键字/Ze启用扩展(默认)/Zc:arg1,arg2C+语言一致性,这里的参数可以是:forScope-对范围规则强制使用标准C+;wchar_t-wchar_t是本机类型,不是typedef-杂项-file选项响应文件/won发出一次警告n/?,/help打印此帮助消息/wln为n设置警告等级1-4/c只编译,不链接/Wn设置警告等级(默认n=1)/Hnum最大外部名称长度/Wall启用所有警告/J默认char类型是unsigned/Wp64启用64位端口定位警告/nologo取消显示版权消息/WX将警告视为错误/showIncludes显示包含文件名/WL启用单行诊断/Tcsourcefile将文件编译为.c/Ycfile创建.PCH文件/Tpsourcefile将文件编译为.cpp/Yd将调试信息放在每个.OBJ中/TC将所有文件编译为.c/Ylsym为调试库插入.PCH引用/TP将所有文件编译为.cpp/Yufile使用.PCH文件/Vstring设置版本字符串/YXfile自动.PCH/w禁用所有警告/Y-禁用所有PCH选项/wdn禁用警告n/Zmn最大内存分配(默认为%)/wen将警告n视为错误-链接-/MD与MSVCRT.LIB链接/MDd与MSVCRTD.LIB调试库链接/ML与LIBC.LIB链接/MLd与LIBCD.LIB调试库链接/MT与LIBCMT.LIB链接/MTd与LIBCMTD.LIB调试库链接/LD创建.DLL/Fnum设置堆栈大小/LDd创建.DLL调试库/link链接器选项和库附录二(更详细信息,可查阅MSDN)VisualC#.NET编译器选项-输出文件-/out:文件输出文件名(默认值:包含主类的文件或第一个文件的基名称)/target:exe生成控制台可执行文件(默认)(缩写:/t:exe)/target:winexe生成Windows可执行文件(缩写:/t:winexe)/target:library生成库(缩写:/t:library)/target:module生成能添加到其他程序集的模块(缩写:/t:module)/define:符号列表定义条件编译符号(缩写:/d)/doc:文件要生成的XML文档文件-输入文件-/recurse:通配符根据通配符规范,包括当前目录和子目录下的所有文件/reference:文件列表从指定的程序集文件引用元数据(缩写:/r)/addmodule:文件列表将指定的模块链接到此程序集中-资源-/win32res:文件指定Win32资源文件(.res)/win32icon:文件使用该图标输出/resource:资源信息嵌入指定的资源(缩写:/res)/linkresource:资源信息将指定的资源链接到此程序集中(缩写:/linkres)-代码生成-/debug+|-发出调试信息/debug:full|pdbonly指定调试类型(full是默认类型,可以将调试程序附加到正在运行的程序)/optimize+|-启用优化(缩写:/o)/incremental+|-启用增量编译(缩写:/incr)-错误和警告-/warnaserror+|-将警告视为错误/warn:n设置警告等级(0-4)(缩写:/w)/nowarn:警告列表禁用特定的警告消息-语言-/checked+|-生成溢出检查/unsafe+|-允许不安全代码-杂项-文件读取响应文件以获得更多选项/help显示此用法信息(缩写:/?)/nologo取消编译器版权信息/nocon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论