有以下這些簡單的可免殺的編譯方式:
特征修改:一個加載器存在兩個明顯的特征,一個是shellcode和硬編碼字符串。我們需要消除這些特征,比較方便使用一個簡單的異或加密就能消除shellcode的特征。第二個是加載器的關聯特征也需要消除,通過加入無意義的代碼干擾反病毒引擎。
花指令免殺:花指令其實就是一段毫無意義的指令,也可以稱之為垃圾指令。花指令是否存在對程序的執行結果沒有影響,所以它存在的唯一目的就是阻止反匯編程序,或對反匯編設置障礙。
加殼免殺:簡單地說,軟件加殼其實也可以稱為軟件加密(或軟件壓縮),只是加密(或壓縮)的方式與目的不一樣罷了。殼就是軟件所增加的保護,并不會破壞里面的程序結構,當我們運行這個加殼的程序時,系統首先會運行程序里的殼,然后由殼將加密的程序逐步還原到內存中,最后運行程序。當我們運行這個加殼的程序時,系統首先會運行程序的“殼”,然后由殼將加密的程序逐步還原到內存中,最后運行程序。加殼雖然對于特征碼繞過有非常好的效果,加密殼基本上可以把特征碼全部掩蓋,但是缺點也非常的明顯,因為殼自己也有特征,主流的殼如VMP, Themida等等。
內存免殺:shellcode直接加載進內存,避免文件落地,可以繞過文件掃描。但是針對內存的掃描還需對shellcode特征做隱藏處理。對windows來說,新下載的文件和從外部來的文件,都會被windows打上標記,會被優先重點掃描。而無文件落地可以規避這一策略。同時申請內存的時候采用漸進式申請,申請一塊可讀寫內存,再在運行改為可執行。最后,在執行時也要執行分離免殺的策略。
分離免殺:整個shellcode加載器分為兩個部分,分離下載shellcode和執行。通常殺軟只檢測一個進程的行為,所以如果存在兩個惡意進程通過進程間通信就能逃過檢測、達到免殺。分離免殺的方法多種多樣,既可以用windows的管道,也可以用socket通信,這樣就可以做到shellcode不落地。