免殺技術有一套(免殺方法大集結)(Anti-AntiVirus)

原文:http://blog.csdn.net/angelxf/article/details/72625301?locationNum=9&fps=1

00. 概述

什麼是免殺?來自百科的註解:

免殺,也就是反病毒(AntiVirus)與反間諜(AntiSpyware)的對立面,英文爲Anti-AntiVirus(簡寫Virus AV),逐字翻譯爲“反-反病毒”,翻譯爲“反殺毒技術”。

有本比較有名的書,想詳細學習的同學可以去看看。《黑客免殺攻防》

其實我大概好像只看過目錄…( ╯□╰ )

下面我介紹的是自己實踐的一些方法,有沒有效果,試試就知道了。

01. 簡介

免殺大概可以分爲兩種情況: 
1. 二進制的免殺(無源碼),只能通過通過修改asm代碼/二進制數據/其他數據來完成免殺。 
2. 有源碼的免殺,可以通過修改源代碼來完成免殺,也可以結合二進制免殺的技術。

免殺也可以分爲這兩種情況: 
1. 靜態文件免殺,被殺毒軟件病毒庫/雲查殺了,也就是文件特徵碼在病毒庫了。免殺方式可能是上面的兩種方式,看情況。 
2. 動態行爲免殺,運行中執行的某些行爲被殺毒軟件攔截報讀。行爲免殺如果沒有源碼就不是很好搞了。

下面就靜態和動態免殺來詳細說說免殺的技術。

02. 靜態免殺

對於靜態免殺,針對的是殺毒軟件的靜態文件掃描,雲查(病毒庫)殺。

殺毒是提取文件一段特徵碼來識別病毒文件。

能識別一個程序是一個病毒的一段不大於64字節的特徵串

那殺毒軟件是怎麼提取文件特徵碼的?

如果我們知道了一個文件是病毒,那麼通過md5肯定可以判斷一個就是這個病毒文件,那如果該病毒文件做了小小變動呢,直接md5肯定是不行了,那殺毒軟件是怎麼做的呢?這裏有個叫做模糊哈希(Fuzzy Hashing算法的東西。

模糊哈希算法又叫基於內容分割的分片分片哈希算法(context triggered piecewise hashing, CTPH),主要用於文件的相似性比較。

大致就可以理解爲,不要把一個文件的所有內容都拿來計算hash,而通過分片,取出部分重要(不易改變)的內容進行hash計算,這樣就能達到通過一個特徵碼找到類似的病毒變種。

關於模糊哈希更加詳細的內容可以查看文章後面的參考文章,這裏不再詳述。

具體殺毒軟件是不是通過這個算法來計算特徵碼的,我也不能完全肯定(純猜測加網上一點點信息),但是根據免殺的經驗可以總結出幾點:

  1. 特徵碼會有多個串組合(減少誤報)
  2. 代碼數據(肯定有)
  3. 會解析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改了之後怎麼還是報呢,反正你可能會折騰很久…

手工查找

這裏說的是針對有源碼的(二進制就別想手工了…),方法非常簡單。

  1. mian中屏蔽所有代碼,編譯,掃描。不報的話繼續2,如果依然報毒,去5。
  2. 放開一層(可以多層、二分也可以)函數,編譯,掃描。不報的話,重複2。直到定位到某個函數或者多個函數,進入3。
  3. 在函數內部屏蔽部分代碼(二分),編譯,掃描。不報,重複2。
  4. 直到定位某段代碼(無自定義內部調用),特徵碼在此。
  5. 是不是有附加數據,或者資源存儲的文件。有,單獨檢查該文件或者數據,方法從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調用,或者邏輯代碼(沒有自定義函數調用)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

此方法,雖然笨,但是定位特徵碼不會很慢,挺準確。

其他

別找了,直接盲免殺吧(後面具體看,有效)

2. 怎麼免殺?

前面已經找到特徵碼了,怎麼免殺呢?

其實前面已經說到了,找到特徵碼之後,只要改變這個特徵碼值得話就免殺成功。如果不需要軟件正常運行,直接填零得了…開玩笑,這怎麼可能。所以修改特徵碼還得保證軟件正常功能。所以也是有講究的。

常用的修改工具有,OD,C32ASM,UE,010Editor等等。

手工修改

非源碼

1. 數據

如果特徵碼定位到數據(通過IDA/OD等確認),其實不好修改,稍微不慎就會導致程序不能運行,或者影響程序運行流程或結果。

  • 字符串,如果不影響程序邏輯,可以替換大小寫;如果無關緊要的數據,隨意替換;等等,看情況而定。
  • 整數,如果不影響結果,替換值,清零等等操作。
  • 地址,基本應該不能修改,具體看情況。
  • PE頭數據,根據PE結構具體來看,無用數據清零或修改,有用數據看情況修改。
  • 最後,終極修改方法,找到訪問數據的代碼,直接修改代碼訪問數據的地址,數據也可以放到其他地址了,其實就如同修改源碼一樣修改,肯定沒有修改源碼那麼容易(見後)。

反正特徵碼定位到數據位置不容易修改(可以再試試後面的盲免殺)。

2. 代碼

如果特徵碼定位到代碼(也通過IDA/OD等確認),在不改變程序功能基礎上,應用各種方法修改。

  • 等價替換匯編代碼,如mov eax,0可以換成xor eax,eax,直接結果相同,二進制代碼不同。
  • 交換代碼順序,在不影響邏輯的情況下。
  • 代碼塊移位,將代碼塊移動不用的內存位置,通過加入jmp addr跳過去執行,addr是新的代碼塊地址。

源碼

在有源碼的情況下,修改的方式就更靈活了,更簡單了。

  • 如果特徵碼是數據,那麼修改數據位置,訪問數據的代碼位置等(思想類比非源碼方式)。

  • 加花指令,這是最有效也是最常用的方式,要點在於如何加話指令。

    1. 加數據計算代碼,加減乘除各類組合。
    2. 加字符串操作代碼,增加、刪除、查找、替換等。
    3. 加多層跳轉,跳轉間加無效指令(不會執行的)。
    4. 加貌似有效的API調用,如LoadLibrary+GetProcAddr+API等。
    5. 等等。

工具免殺(盲免殺)

在沒找到有效的特徵碼,或者不好修改的時候,可以試試這種方式。

資源操作

1. 加資源

使用ResHacker對文件進行資源操作,找來多個正常軟件,將它們的資源加入到自己軟件,如圖片,版本信息,對話框等。

2. 替換資源

使用ResHacker替換無用的資源(Version等)。

3. 加簽名

使用簽名僞造工具,將正常軟件的簽名信息加入到自己軟件中。

幾種方式可以交替重複多次進行組合使用。

PE操作

1. PE優化

使用PE優化工具對文件進行優化,刪除0,PE頭優化,附加數據等。

2. 增加節

增加節數據,隨意加入無效數據。

加殼

可以將加殼簡單理解爲:解密器/解壓器+加密器/壓縮器(原始代碼)。

通過加密器/壓縮器將原始代碼進行加密壓縮,讓其特徵碼變化隱藏,然後組裝上解密器/解壓器到文件中,運行是先運行解密/解壓器,將加密壓縮內容解密解壓,然後繼續運行原始代碼。

1. 加冷門殼

殼也有特徵,知名殼都已經被分析的非常多了,殺軟基本都能查這類殼,或者自動脫殼,然後進行查殺。

所以加冷門殼,殼特徵未被分析,不能自動脫殼,可以更好隱藏原始代碼,得到免殺效果。

2. 加殼改殼

將常用殼進行修改,讓殼特徵變化,也可以是殺軟失效。

比如修改入口,區段信息修改,入口代碼移位。

可以類比爲免殺殼,上面介紹的方法都可以使用。

03. 行爲動態免殺

殺毒軟件現在都會有主防的功能,對惡意行爲進行攔截提示。

比如這些行爲:

  1. 註冊表操作,添加啓動項,添加服務
  2. 文件寫入、讀系統文件、刪除文件,移動文件
  3. 殺進程,創建進程
  4. 注入、劫持等

行爲攔截原理

說白了,惡意行爲都是通過API調用來完成的,可能是一個API,可能是多個APi組合。

殺軟通過技術手段攔截這些API調用,通過策略來判斷是否屬於惡意行爲。

關鍵點: 
1. API 
2. 策略(順序,調用源,參數等等)

所以後面的方法就是針對這兩點做的工作。

如何進行行爲免殺呢?

下面介紹的方式對非源碼、源碼都有效,但是非源碼修改起來非常非常麻煩…

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
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

調用時,不適用1地址,而使用4地址,然後自己函數內部還原跳過幾字節的調用。

__API_MY:
push ebp;
mov ebp, esp;
mov edi, edi;
call 4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

5. 底層api

該方法類似於2和3,殺軟攔截API可能更加高層(語義更清楚),那就可以找更底層API進行調用,繞過攔截,比如使用NT函數。

或者通過DeviceIoControl調用驅動功能來完成API功能。

模擬系統調用。

6. 合理替換調用順序

有時攔截行爲是通過多個API組合來完成的,所以合理替換順序,繞過殺軟攔截策略,也可以繞過改行爲攔截。

比如,先創建服務,再將服務對應文件拷貝過去。

7. 繞過調用源

通過調用其它進行功能來完成API的功能。比較經典的如,通過rundll32.exe來完成dll加載,通過COM來操作文件等等。

總結

方法大概就總結到這,要更好的完成免殺,需要各種方式進行合理靈活組合變化,或者挖掘更多的方法。

注意/技巧

  1. 非源碼修改時,通過OD能夠更好的完成,配合IDA進行觀察,具體參考OD/IDA使用教程。
  2. 源碼免殺加花,要靈活多變,不拘於形式。
  3. 行爲免殺多嘗試,猜出殺軟攔截策略,能夠更有效的找到繞過方式。

道高一尺,魔高一丈

各路大神有更多的技巧和方式,請不吝賜教,相互交流。

我們不做壞事,但是可以瞭解做壞事的手段,更好的破壞防禦這些手段。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章