Editor's Notes
- 其疾如風、其徐如林、侵掠如火、不動如山、難知如陰、動如雷震
- 簽章 Base :
就是病毒碼偵測,被人工或是電腦偵測後,針對惡意程式做簽章,加入防毒簽名數據庫
靜態分析:
分析結構
動態分析:
將程式執行起來,需要有足夠的input才能產生有價值的資料
沙盒
分離運行的機制
啟發式掃描:
類似行為偵測
熵 (Entropy):
熵和壓縮增進了檔案字元的亂度。熵可用來衡量資料串流位元的統計變異。加殼後的檔案會表現出很高的Entropy值,因此Entropy也可以稍微用在加殼偵測上,而且在還無法辨認加殼特徵時,特別有用。但如果只使用Entropy,可能會因為合法的壓縮檔
- 混淆:
不易閱讀、且改變二進位的hash 簽名
加殼&加密(Crypters):
AV 掃描malware的時候要知道壓縮算法才能解壓縮,因為有加殼所以容易引起分析人員的興趣
殼還有分壓縮殼、加密殼、虛擬機保護殼
與檢測惡意軟件相比,檢測加密、加殼的廠商特徵相對容易,因為他們都必須做某些可疑的東西,如解密加密的PE文件並在memory上執行它。
- 一般在編譯PE文件時,編譯器將主模塊地址設置為0x00400000,而編譯過程中所有的全部地址指針和長跳轉指令地址根據主模塊地址計算,在編譯過程結束時編譯器創建一個重定位表部分 在PE文件中,重定位部分包含取決於映像的基地址的指令的地址,諸如完整地址指針和長跳轉指令。
執行PE檔案時,作業系統會讀取PE擋頭裡面最佳化的位置,當這位置被占用,系統就要讀取這些絕對位置並去重新定址這些位址,稱為Address Layout Randomization。
為了執行PE image 在記憶體上,Crypters 必須Parse PE Header並給他記憶體位置
當我們分析市面上的 Crypters ,可以看到幾乎都有用到 “NtUnmapViewOfSection” and “ZwUnmapViewOfSection” 這兩個系統API ,這兩個取消了程式在記憶體映射的範圍,並接著啟動RUNPE重啟一個乾淨的PE檔案,90%的Crypters都用到這方法。
AV產品不可能只靠偵測這兩個API就來判斷是不是惡意程式,使用函數順序也是很重要的。少數也有自己刻這部分功能的,節省大量的時間,但自己刻這個東西其實很沒什麼用,因為沒有無害的程式會去模仿系統程序loader . 同時會產生大量的entropy,因為加密整個PE文件導致entropy上升,AV偵測大量異常上升的entrpoy會判斷為可疑文件。
通常好點的寫法都不把整個程式加密,只加密重點的shellcode或是.text區段,保持image header、sections
- 啟發式偵測 基於統計與規則的分析機制
用預先定義的code section,幫執行的程式做分數,當高於一定的值就判斷為惡意程式。
許多市面上的AV廠商這方面都屬於高等商業機密,沒有廠商公布他們的文件、原型關於他們的評分機制
- 有些 AV scanners waits until ECX register to be 「0」在進行偵測,
等於你自己解密後我再來分析。
- 反DEBUG:
當我們使用反逆向的功能的時候,在AV的評分會得到很高的危險分數
使用系統API 呼叫偵測Debug 是非常不明智的選擇,容易被偵測到
我們使用PEB Block 裡面的Code來做這件事
當偵測到Debug True 他就重複執行 PUSH EAX,導致程式直接中止
在加入些垃圾Code混淆並且阻止靜態分析查到
Load 假LIB:
正常來說我們讀取一個不存在的dll,會返回NULL
但部分AV產品為了動態偵測評分,他會產生一個True的結果給malware以便進一步分析
睡覺偵測:
利用GetTickCount 獲取當前時間並且睡覺一秒,在抓取
許多防毒為了節省時間會Skip Sleep Function
檢查核心數量
大量使用記憶體後釋放:
比較old Fashion 的方法,因為當程式在大量使用記憶體 為了不影響使用者和減少掃描時間,許多AV會自動停止掃描。
Trap Flag Manipulation:
當追蹤、除錯程式的,我們會把CPU的Trap Flag設置為1,會觸發"SINGLE_STEP",讓我們看成是哪個環節出錯,TF 這些FLAG都是可被操作的
互斥觸發的Winexec:
先去檢測一個假線程存在與否,當然不存在
這時候發生錯誤了,malware再去執行一次,這次我們再去執行真正的惡意程式解碼
大部分AV不會去動態再去分析新的進程或訪問sandbox以外的文件
- 在win vista之後微軟啟用一個叫DEP的機制,用來保證memory的使用正確,並且有效率的使用memory。
意味著不能把隨便一組shellcode、一個dword亂放在其他地方執行他,並須使用windows api 讓它包含著讀、寫、執行的memory region
- 保護機制 :safeguards like stack savers need to be on and striping the symbols