1,首先我们打开vc++建立一个Win32 Application,工程名随便,接下来选择“a Typical \"hello World\" application”(因为是范例,所以以hello world为标准)
2,选择编译方式为Win32 - Release. 这时候你编译程序,生成的执行程序是28kb(如果你的机器感染了病毒,体积可能会大一些,如果我的机器感染了病毒,而你的机器正常,你的执行程序可能会小一些...这些全都是废话)
3,选择菜单:Project->Settings(或者按Alt+F7),打开Link属性页。将Object/library modules:下面编辑框中的各种lib全部删除,然后打上MSVCRT.LIB kernel32.lib user32.lib
此后编译程序,生成的执行程序为20kb(此时编译程序会出现警告:LINK : warning LNK4098: default lib \"LIBC\" conflicts with use of other libs; use /NODEFAULTLIB:library不必理会,如果你想去掉警告,就在Ignore all default libraries前打勾)
4,接着上面,在Project->Settings的Link属性页里,在Project Options下面的编辑框里加上一句:/ALIGN:4096 这样做之后指定了程序不是驱动程序
此后编译程序,生成的执行程序为7KB
至此给Win32 Application减肥告一段落,7KB的程序另我满意了,如果你觉得还能减,不妨再做一些别的尝试,等你的好消息:)
减肥总结:选择恰当的编译模式,去掉不必要的库。 二
今天突然想到见过别人用vc写的木马 下载者之类大小都只有 几K (没用过pe压缩程序)
我写个hello world用 release + minimize size 编译都有30++k 于是google寻求解答 搜索了一些相关信息 有效的做个总结如下 #include #pragma comment(lib,\"kernel32.lib\") #pragma comment(lib,\"shell32.lib\") #pragma comment(lib,\"msvcrt.lib\") //自定义函数入口 #pragma comment(linker, \"/ENTRY:EntryPoint\") //自定义对齐方式 #pragma comment (linker, \"/ALIGN:512\") #pragma comment(linker, \"/FILEALIGN:512\") // 优化选项 #pragma comment(linker, \"/opt:nowin98\") #pragma comment(linker, \"/opt:ref\") #pragma comment (linker, \"/OPT:ICF\") // 合并区段 #pragma comment(linker, \"/MERGE:.rdata=.data\") #pragma comment(linker, \"/MERGE:.text=.data\") #pragma comment(linker, \"/MERGE:.reloc=.data\") int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow ) ; void EntryPoint() { ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL)); } ///////////////////////////////////////////////////////////////////////////////////////////////// 写了下段代码编译后1K 用peid查看不是vc6.0 而是First Publisher Graphics format * #include //自定义加载的库 #pragma comment(lib,\"kernel32.lib\") #pragma comment(lib,\"shell32.lib\") #pragma comment(lib,\"msvcrt.lib\") //自定义函数入口 #pragma comment(linker, \"/ENTRY:EntryPoint\") //自定义对齐方式 #pragma comment (linker, \"/ALIGN:512\") #pragma comment(linker, \"/FILEALIGN:512\") // 优化选项 #pragma comment(linker, \"/opt:nowin98\") #pragma comment(linker, \"/opt:ref\") #pragma comment (linker, \"/OPT:ICF\") // 合并区段 #pragma comment(linker, \"/MERGE:.rdata=.data\") #pragma comment(linker, \"/MERGE:.text=.data\") 18#pragma comment(linker, \"/MERGE:.reloc=.data\") int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow ) ; void EntryPoint() { ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL)); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iShowCmd ) 因篇幅问题不能全部显示,请点此查看更多更全内容