免殺入門之靜態免殺
本文只是介紹如何對程序進行靜態免殺,以下方法僅供學習交流使用。雖然市面上殺軟的病毒查殺功能越來越完善,靜態免殺仍然是比較經典的免殺思路,通過一次完整的免殺流程我們也可以簡單地了解殺軟查殺的原理。
殺毒軟件工作原理
市面上的殺毒軟件基本由掃描器、病毒特征庫和虛擬機組成,它會把文件放在虛擬機內運行,掃描該文件的特征,包括靜態特征、內存特征、行為特征等,通過和病毒特征庫對比來判斷一個文件是否為惡意文件。安全廠商一直在收集市面上出現的惡意文件添加進他們病毒庫中,所以病毒文件要做到免殺的話就必須清除它本身的特征,殺軟特征庫匹配不上,就會把它當作正常文件,自然也就免殺了。
殺毒軟件查殺原理
殺軟查殺包括以下幾個方面:
- 靜態查殺:查殺靜態的文件,一個病毒文件在編譯生成之后,該文件本身就會有特征,比如文件的某個部分是由特定字符組成,殺軟匹配到特定字符則判斷該文件為惡意文件。
- 內存查殺:病毒文件在運行后會將自身釋放到內存中,釋放后的文件在內存中也會存在特定字符,根據這些特定字符也可查殺。
- 行為查殺:程序的一些特定行為也會被殺軟判定為惡意程序,如自刪除、加入啟動項、釋放文件到特定目錄、調用敏感的dll或程序、獲取主機殺軟運行狀態等。
- 云查殺:相當于所有用戶的機器為Agent,然后有一個服務端,殺軟會把文件自動傳到云沙想使用各種殺毒引擎查殺并同步病毒特征到所有Agent。
靜態查殺
這篇文件主要詳細講靜態免殺,會通過對比源碼來更好展現靜態免殺的原理。靜態免殺的原理便是查殺特征碼,殺軟會把文件分片,然后根據模糊hash獲取所有分片的hash值,然后把這些hash值和病毒特征庫做對比,以此來判斷文件是否為惡意文件。
mimikatz介紹
本次我們嘗試對mimikatz做免殺處理。首先從github下載最新版的mimikatz程序和源碼,mimikatz是一款知名的內網滲透中常用的工具,功能有密碼讀取、hash傳遞等。
該工具已經被市面上殺軟加入病毒特征庫,我們的目標就是修改該程序特征碼并且不能影響其正常使用。
先輸入以下代碼測試mimikatz的功能,發現可以正常使用。
privilege::debug
sekurlsa::logonpasswords

同時也發現會被某殺軟查殺,本文均以該殺軟為例。

VirTest介紹
VirTest是一款shellcode定位工具,可以在殺軟查殺文件是定位文件特征碼。
1、定位原理:
我們可以這樣假設報毒過程,如果檢測文件是PE,如果在CODE位置存在 標志A,在DATA位置存在標志B,在資源位置存在標志C,同時滿足這個3個條件,那么殺軟就會報毒,VIRTEST工作原理就是要找到引起報毒最后一個標志,也就是假設中的標志C。
因此VIRTEST采用2分排除法,測試標志C所在文件中的位置,由于被殺的文件可能存在多個 類似于ABC這樣的連鎖條件,所以我們必須要通過一種排除機制,先要找最靠近文件前部的連鎖條件,排除掉文件尾部數據,當找到第一個連鎖條件后,抹掉引標志C,再恢復尾部數據, 然后繼續測試另外的連鎖條件,直到找到最后一個連鎖條件,抹掉后,整個文件免殺了,則說明特征代碼被定為完畢了,所以VIRTEST絕對可以精確的定位出所有的復合特征。這比文件分塊定位法先進得多,更為科學。
2、使用方法:
1、在無毒環境制作測試文件
2、在有殺軟的環境載入測試文件
3、定位特征代碼,選6秒,定位出來的就是靜態查殺的特征了
定位mimikatz的特征碼
根據上述方法把mimikatz.exe制作成測試文件并加載,接下來等待定位完成就OK了,發現定位到12個特征。

和源碼對比可知其中大部分特征是源碼里的注釋,畢竟每個項目注釋獨特性比較高;還有部分特征是源碼里的自定義字符串和調用敏感文件。

源碼編譯注意事項
此項目是用C語言寫的,使用Visual Studio 2019直接編譯時比較麻煩,需要注意以下幾點。
1、生成-->配置管理器 這里需要設置成release x64

2、項目-->屬性-->常規-->平臺工作集 需要設置為v142

3、項目-->屬性-->C/C++常規-->將錯誤視為警告 這里需要設置為否(WX-),否則編譯會失敗

4、工具-->獲取工具和功能 需要安裝最新的MFC庫,否則報錯MSB8041,編譯失敗

通過修改源碼達到免殺效果
通過觀察特征碼,可以發現特征碼有以下幾個類別組成,注釋、自定義字符串、調用敏感的程序,有的還會有方法名,項目名稱等,下面將對比源碼來分析。
1、注釋
這里很明顯就是注釋。特征碼是注釋里的benjamin@gentilkiwi.com,這是作者郵箱肯定可以當作特征碼


解決辦法:很簡單,直接CTRL Shift H,將注釋替換或者刪除。

替換完成之后編譯,重新測試免殺發現特征碼已經少了很多了。

2、自定義字符串
另外兩處特征碼是without DisableRegistryTools和DisableRegistryTools,DisableRegistryTools是和注冊表相關的代碼。


在項目中通過搜索DisableRegistryTools,找到代碼位置,這里估計是使用regedit.exe執行了注冊表相關操作。感覺注冊表相關操作并不一定需要,這里我們嘗試直接修改為任意字符,如果有問題我們再通過構造代碼來修改這個值。修改完編譯成功的話就說明修改該字符是不影響功能的。


還有其他類似的自定義變量也是特征碼的話,也直接修改就好了,修改完免殺效果如下。

其他自定義字符串特征碼如下圖,為Domain %wZ,但是直接找發現找不到,我們結合上下文代碼,使用上面的代碼Username :來查找才能找到,查看源碼發現Domain %wZ中間空格有好幾個。
在定位源碼中的特征碼的時候經常會有這種情況。




發現特征碼Domain %wZ都在printf里,打印出來的字符當然可以隨便修改了,修改完效果如下,只剩下一個了。

3、調用敏感的程序
最后一個特征如下圖為lsass.exe,還是使用全局搜索,發現一共四處使用了lsass.exe。



lsass.exe這個文件在熟悉不過了,是和windows存儲密碼相關的進程,mimikatz讀取windows是一定要使用lsass.exe的,從任務管理器也可以看到這個進程。
那這里肯定是不能直接修改名字,需要構造代碼在不影響功能的情況下修改。
這里我們使用以下代碼把lsass.exe拼接后使用,代碼如下。
需要留意這里是寬字節,要使用MAX_PATH,否則會影響功能。
wchar_t str[MAX_PATH] = L"lsass";
lstrcatW(str, L".exe");
if (kull_m_process_getProcessIdForName(str, &processId))
修改后代碼如圖所示,注意一共四處都要修改。

修改完成發現特征碼都已經沒了,已經可以繞過某殺軟了,其他殺軟方法類似。


最后測試mimikatz功能也是正常的,至此免殺完成。

總結
靜態免殺其實很多年前就有了,但是現在部分殺軟還能使用修改特征碼來繞過,本篇文章只是講了免殺最簡單的一部分,像內存查殺,行為查殺,云查殺其實都要復雜很多。
有部分殺軟已經做到了特征碼反定位,這種只能重構整個項目源碼比如修改方法類名、去除注釋圖標、重寫方法內容避開殺軟黑名單。或者自己開發工具,畢竟公網上公開的工具已經被加了太多特征了。
源碼
鏈接:https://github.com/q1ya/mimikatz-byPass-Huorong
后續
1、修改版本信息
去微步測了下,發現居然連版本信息都沒改,特征太明顯了

修改項目的mimikatz.rc文件,rc文件是一個資源文件,里面包括了引入的位圖文件,窗口,圖標,光標等等。
