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