一、Debug 和 Release 編譯方式的區別:

Debug 通常稱為調試版本,它包含調試信息,並且不作任何優化,便於程序員調試程序。Release

 

 


Debug 和 Release編譯方式在木馬製作方面的應用是:調試完成以後,使用Release模式編譯,這樣生成的木馬體積可以減小很多

二、編譯器選項:

#pragma主要包含一些預處理命令,比如共享內存,修改內存屬性等等
//自定義對齊方式
#pragma comment(linker, "/FILEALIGN:16")
#pragma comment(linker, "/ALIGN:16")//定義最小節的大小,數值越小程序體積越小 
//http://msdn.microsoft.com/zh-cn/wf5kss02.aspx
通過這個編譯器選項能夠去掉代碼中由於對齊而產生的多餘代碼
這兩個必須同時使用,否則編譯出來的程序不能運行
使用了這個編譯器選項之後一般不能再對文件加殼
#pragma comment(linker, "/OPT:REF")
#pragma comment(linker, "/OPT:ICF")
#pragma comment(linker, "/OPT:NOWIN98") // 使用老VC編繹器的512大小為一節
//自定義加載的庫
#pragma comment(lib,"kernel32.lib")//表示鏈接kernel32_32.lib這個庫
#pragma comment(lib,"shell32.lib")
#pragma comment(lib,"msvcrt.lib") //使用VC6.0動態鏈接庫
//自定義函數入口
#pragma comment(linker, "/ENTRY:EntryPoint")
//更改默認的入口函數,之後就要用ExitProcess(0);才能正常退出;

 

//設置子系統類型
#pragma comment(linker,"/subsystem:windows") //這樣雙擊運行程序的時候就不會出現cmd窗口了
http://blog.csdn.net/lostangels/archive/2008/01/06/2027642.aspx

 

// 優化選項
#pragma comment(linker, "/opt:nowin98")
//http://support.microsoft.com/kb/235956/zh-cn
#pragma comment(linker, "/opt:ref")
#pragma comment (linker, "/OPT:ICF")


// 合併區段
#pragma comment(linker, "/MERGE:.rdata=.data")//把rdata區段合併到data區段裏
#pragma comment(linker, "/MERGE:.text=.data")//把text區段合併到data區段裏
#pragma comment(linker, "/MERGE:.reloc=.data")//把reloc區段合併到data區段裏


//設置區段屬性
#pragma comment(linker, "/section:.data,RWE")
在LodePe裏看到的就是E0000040,其中RWE是可讀、可寫、可執行的意思
R:readable
W:Writable
E:executable

 

#pragma optimize("gsy", on)
http://msdn.microsoft.com/zh-cn/library/chh3fb0k(en-us).aspx

 

#pragma code_seg("PAGE")    //其中PAGE是區段的名稱
//這個是免殺中最有用的一個編譯器選項,它可以把cpp文件裏的代碼放到一個單獨的區段裏,這樣在對付殺毒軟件的代碼查殺的時候,給我們帶來了非常大的方便

#pragma comment(linker,"/entry:mainCRTStartup")
//設置入口函數為main

三、過nod32啓發的代碼:

 

這個代碼主要用於對付nod32的啓發查殺,對普通特徵碼查殺無效

總結:

●讓木馬體積變小的方法有以下幾點:

①用Release模式編譯

②自定義程序入口

③合併區段

④自定義最小節的大小

 

●編譯器選項在代碼免殺中的應用:

①區段合併讓代碼發生非常大的改變

②代碼單獨存放在一個區段裏

③通過其他改變從而使代碼發生變化