00. 概述
什么是免殺?來自百科的注解:
免殺,也就是反病毒(AntiVirus)與反間諜(AntiSpyware)的對立面,英文為Anti-AntiVirus(簡寫Virus AV),逐字翻譯為“反-反病毒”,翻譯為“反殺毒技術”。
有本比較有名的書,想詳細學習的同學可以去看看。《黑客免殺攻防》
其實我大概好像只看過目錄…( ╯□╰ )
下面我介紹的是自己實踐的一些方法,有沒有效果,試試就知道了。
01. 簡介
免殺大概可以分為兩種情況:
二進制的免殺(無源碼),只能通過通過修改asm代碼/二進制數據/其他數據來完成免殺。
有源碼的免殺,可以通過修改源代碼來完成免殺,也可以結合二進制免殺的技術。
免殺也可以分為這兩種情況:
靜態文件免殺,被殺毒軟件病毒庫/云查殺了,也就是文件特征碼在病毒庫了。免殺方式可能是上面的兩種方式,看情況。
動態行為免殺,運行中執行的某些行為被殺毒軟件攔截報讀。行為免殺如果沒有源碼就不是很好搞了。
下面就靜態和動態免殺來詳細說說免殺的技術。
02. 靜態免殺
對于靜態免殺,針對的是殺毒軟件的靜態文件掃描,云查(病毒庫)殺。
殺毒是提取文件一段特征碼來識別病毒文件。
能識別一個程序是一個病毒的一段不大于64字節的特征串
那殺毒軟件是怎么提取文件特征碼的?
如果我們知道了一個文件是病毒,那么通過md5肯定可以判斷一個就是這個病毒文件,那如果該病毒文件做了小小變動呢,直接md5肯定是不行了,那殺毒軟件是怎么做的呢?這里有個叫做模糊哈希(Fuzzy Hashing
)算法的東西。
模糊哈希算法又叫基于內容分割的分片分片哈希算法(context triggered piecewise hashing, CTPH),主要用于文件的相似性比較。
大致就可以理解為,不要把一個文件的所有內容都拿來計算hash,而通過分片,取出部分重要(不易改變)的內容進行hash計算,這樣就能達到通過一個特征碼找到類似的病毒變種。
關于模糊哈希更加詳細的內容可以查看文章后面的參考文章,這里不再詳述。
具體殺毒軟件是不是通過這個算法來計算特征碼的,我也不能完全肯定(純猜測加網上一點點信息),但是根據免殺的經驗可以總結出幾點:
特征碼會有多個串組合(減少誤報)
代碼數據(肯定有)
會解析PE,檢查附加文件數據、PE文件的資源等等
1. 怎么找特征碼
工具查找
常見的特征碼定位工具有CCL、MYCCL。工具大致原理就是分割文件,某些分割部分填入數據(0),如果掃描該部分不報警,則特征碼在這個部分。如此反復,直到找到很短的某一段內容。不同工具之前局別是使用的分割算法不同,查找特征碼的效果不同。
目前比較常有名氣的特征碼定位器主要有CCL與MYCCL,他們都采用文件分塊定位的辦法,定位效果帶有運氣成份,且可能每次定位出的位置都不盡相同,這個免殺帶來了困難。
后來出來了一款新的特征碼定位軟件VirTest
。下面是作者自己的介紹:
我們可以這樣假設報毒過程,如果檢測文件是PE,如果在CODE位置存在 標志A,在DATA位置存在標志B,在資源位置存在標志C,同時滿足這個3個條件,那么殺軟就會報毒,VIRTEST工作原理就是要找到引起報毒最后一個標志,也就是假設中的標志C。
因此VIRTEST采用2分排除法,測試標志C所在文件中的位置,由于被殺的文件可能存在多個 類似于ABC這樣的連鎖條件,所以我們必須要通過一種排除機制,先要找最靠近文件前部的連鎖條件,排除掉文件尾部數據,當找到第一個連鎖條件后,抹掉引標志C,再恢復尾部數據。
然后繼續測試另外的連鎖條件,直到找到最后一個連鎖條件,抹掉后,整個文件免殺了,則說明特征代碼被定為完畢了,所以VIRTEST絕對可以精確的定位出所有的復合特征。這比文件分塊定位法先進得多,更為科學。
工具查找肯定是針對二進制文件(有源碼的也編譯后在檢查)。
具體用過MYCCL(使用方法自行查找),確實比手工分割文件定位方便,也可以找到某些文件的特征碼,但是有些時候可能會出現非常多非常多…的被殺文件分割,然后…崩潰了。
后來也用了virtest,感覺作者說的挺有道理,應該挺好用吧。然后試了試,確實感覺比MYCCL高大上多了,也可以定位到特征碼,但是tmd改了之后怎么還是報呢,反正你可能會折騰很久…
手工查找
這里說的是針對有源碼的(二進制就別想手工了…),方法非常簡單。
mian中屏蔽所有代碼,編譯,掃描。不報的話繼續2,如果依然報毒,去5。
放開一層(可以多層、二分也可以)函數,編譯,掃描。不報的話,重復2。直到定位到某個函數或者多個函數,進入3。
在函數內部屏蔽部分代碼(二分),編譯,掃描。不報,重復2。
直到定位某段代碼(無自定義內部調用),特征碼在此。
是不是有附加數據,或者資源存儲的文件。有,單獨檢查該文件或者數據,方法從1開始。如果沒有,那去找找PE頭吧。
大致流程:
1. sub1
2. sub1 sub2
3. sub1 sub2 sub3
4. sub1 sub2 sub3(sub31)
5. sub1 sub2 sub3(sub31 sub32)
6. sub1 sub2 sub3(sub31 sub32(sub321))
...
直到找到某API調用,或者邏輯代碼(沒有自定義函數調用)
此方法,雖然笨,但是定位特征碼不會很慢,挺準確。
其他
別找了,直接盲免殺吧(后面具體看,有效)
2. 怎么免殺?
前面已經找到特征碼了,怎么免殺呢?
其實前面已經說到了,找到特征碼之后,只要改變這個特征碼值得話就免殺成功。如果不需要軟件正常運行,直接填零得了…開玩笑,這怎么可能。所以修改特征碼還得保證軟件正常功能。所以也是有講究的。
常用的修改工具有,OD,C32ASM,UE,010Editor等等。
手工修改
非源碼
1. 數據
如果特征碼定位到數據(通過IDA/OD等確認),其實不好修改,稍微不慎就會導致程序不能運行,或者影響程序運行流程或結果。
字符串,如果不影響程序邏輯,可以替換大小寫;如果無關緊要的數據,隨意替換;等等,看情況而定。
整數,如果不影響結果,替換值,清零等等操作。
地址,基本應該不能修改,具體看情況。
PE頭數據,根據PE結構具體來看,無用數據清零或修改,有用數據看情況修改。
最后,終極修改方法,找到訪問數據的代碼,直接修改代碼訪問數據的地址,數據也可以放到其他地址了,其實就如同修改源碼一樣修改,肯定沒有修改源碼那么容易(見后)。
反正特征碼定位到數據位置不容易修改(可以再試試后面的盲免殺)。
2. 代碼
如果特征碼定位到代碼(也通過IDA/OD等確認),在不改變程序功能基礎上,應用各種方法修改。
源碼
在有源碼的情況下,修改的方式就更靈活了,更簡單了。
加數據計算代碼,加減乘除各類組合。
加字符串操作代碼,增加、刪除、查找、替換等。
加多層跳轉,跳轉間加無效指令(不會執行的)。
加貌似有效的API調用,如LoadLibrary+GetProcAddr+API等。
等等。
工具免殺(盲免殺)
在沒找到有效的特征碼,或者不好修改的時候,可以試試這種方式。
資源操作
1. 加資源
使用ResHacker對文件進行資源操作,找來多個正常軟件,將它們的資源加入到自己軟件,如圖片,版本信息,對話框等。
2. 替換資源
使用ResHacker替換無用的資源(Version等)。
3. 加簽名
使用簽名偽造工具,將正常軟件的簽名信息加入到自己軟件中。
幾種方式可以交替重復多次進行組合使用。
PE操作
1. PE優化
使用PE優化工具對文件進行優化,刪除0,PE頭優化,附加數據等。
2. 增加節
增加節數據,隨意加入無效數據。
加殼
可以將加殼簡單理解為:解密器/解壓器+加密器/壓縮器(原始代碼)。
通過加密器/壓縮器將原始代碼進行加密壓縮,讓其特征碼變化隱藏,然后組裝上解密器/解壓器到文件中,運行是先運行解密/解壓器,將加密壓縮內容解密解壓,然后繼續運行原始代碼。
1. 加冷門殼
殼也有特征,知名殼都已經被分析的非常多了,殺軟基本都能查這類殼,或者自動脫殼,然后進行查殺。
所以加冷門殼,殼特征未被分析,不能自動脫殼,可以更好隱藏原始代碼,得到免殺效果。
2. 加殼改殼
將常用殼進行修改,讓殼特征變化,也可以是殺軟失效。
比如修改入口,區段信息修改,入口代碼移位。
可以類比為免殺殼,上面介紹的方法都可以使用。
03. 行為動態免殺
殺毒軟件現在都會有主防的功能,對惡意行為進行攔截提示。
比如這些行為:
注冊表操作,添加啟動項,添加服務
文件寫入、讀系統文件、刪除文件,移動文件
殺進程,創建進程
注入、劫持等
行為攔截原理
說白了,惡意行為都是通過API調用來完成的,可能是一個API,可能是多個APi組合。微信搜索公眾號:Linux技術迷,回復:linux 領取資料 。
殺軟通過技術手段攔截這些API調用,通過策略來判斷是否屬于惡意行為。
關鍵點:
API
策略(順序,調用源,參數等等)
所以后面的方法就是針對這兩點做的工作。
如何進行行為免殺呢?
下面介紹的方式對非源碼、源碼都有效,但是非源碼修改起來非常非常麻煩…
1. 替換api
使用相同功能的API進行替換,殺軟不可能攔截了所有API,所以這種方式還是有效的。比如MoveFileEx替換MoveFile。
2. 未導出api
尋找相同功能的未導出API進行替換,殺軟攔截一般是導出API,或者底層調用,尋找未導出API有一定效果。
尋找方法,通過分析目標API內部調用,找到內部一個或多個未導出API,來完成相同功能。
3. 重寫api
完全重寫系統API功能(通過逆向),實現自己的對應功能API,對于ring3的行為攔截非常有效。比如實現MoveFile等。
4. api+5
ring3的API攔截通過是掛鉤API頭幾個字節內容,然后進入殺軟自己函數進行參數檢查之類的。
那么如果調用API時,跳過頭部幾字節,就可以避開這種攔截方式。
__API:
1 push ebp;
2 mov ebp, esp;
3 mov edi, edi;
4 ...
調用時,不適用1地址,而使用4地址,然后自己函數內部還原跳過幾字節的調用。
__API_MY:
push ebp;
mov ebp, esp;
mov edi, edi;
call 4
5. 底層api
該方法類似于2和3,殺軟攔截API可能更加高層(語義更清楚),那就可以找更底層API進行調用,繞過攔截,比如使用NT函數。
或者通過DeviceIoControl調用驅動功能來完成API功能。
模擬系統調用。
6. 合理替換調用順序
有時攔截行為是通過多個API組合來完成的,所以合理替換順序,繞過殺軟攔截策略,也可以繞過改行為攔截。
比如,先創建服務,再將服務對應文件拷貝過去。
7. 繞過調用源
通過調用其它進行功能來完成API的功能。比較經典的如,通過rundll32.exe來完成dll加載,通過COM來操作文件等等。
總結
方法大概就總結到這,要更好的完成免殺,需要各種方式進行合理靈活組合變化,或者挖掘更多的方法。
注意/技巧
非源碼修改時,通過OD能夠更好的完成,配合IDA進行觀察,具體參考OD/IDA使用教程。
源碼免殺加花,要靈活多變,不拘于形式。
行為免殺多嘗試,猜出殺軟攔截策略,能夠更有效的找到繞過方式。
道高一尺,魔高一丈
各路大神有更多的技巧和方式,請不吝賜教,相互交流。
我們不做壞事,但是可以了解做壞事的手段,更好的破壞防御這些手段。
該文章在 2023/2/27 17:32:01 編輯過