# 0x04. Dynamic Analysis [TOC] ## 簡介 如果靜態分析無法達成的任務,就得交給動態分析來達成了,動態分析方法不外乎兩種 沙箱執行以及手動執行,本章將介紹兩種方法以及工具 <br> ## Sandbox: pros and cons Sandbox執行,顧名思義就是把樣本放入一個環境內,給定一段執行時間並且觀看結果 常見的工具像是[Cuckoo Sandbox](https://cuckoosandbox.org/)以及 [Any.Run](https://app.any.run/)都是很好用而且相當廣泛使用的工具 更多工具可以參考[Github repo](https://github.com/rshipp/awesome-malware-analysis#online-scanners-and-sandboxes) 利用Sandbox進行分析,好處是很方便,只需要上傳檔案觀看結果就好,而且很有效率並且監測的範圍非常全面 <br> 但是也有其壞處,如果不進行靜態分析直接丟進Sandbox執行,很容易會忽略掉一些反沙箱手法 這邊提供一些簡單的思路 (更多細節會在Advanced topic - Anti-Debug / Anti-Analysis提到) 1. 讓Malware延遲一定的時間再執行,一般的Sandbox頂多花十分鐘在一個樣本上 2. 利用常見的Windows API來偵測所處環境是否為Sandbox 在利用Sandbox之前,最好還是能分析一下樣本確保能夠順利在Sandbox內執行並且得到想要的結果 <br> ## Intro to handle/thread/process 在真正開始動態分析之前,來説説手動分析的目的為何 不外乎就是搞懂程式在幹嘛,能夠在程式執行到一半時停在我想停的地方 尋找被加密的可疑資料,要達到這樣的目的,不外乎需要debugger 在Linux可以使用GDB+[peda](https://github.com/longld/peda)的組合來動態分析,Windows環境裡也有許多的debugger,本篇選用x64dbg --- ### Process VS Thread Process: Process像是一個Container,裡面裝了很多資訊 Thread: 存在在Process真正在執行程式的實體 一個Process可能會有多個Thread,如果一個Process中沒有Thread,那就是個空殼 在MultiThread的Process之中,每個Thread都有自己的Stack以及Registers ![](https://i.imgur.com/UPiivHa.png =40%x) --- ### Handle 類似一個指向物件的指標(有點像令牌的概念),而這個物件是可以對各種資源進行存取讀寫 檔案 / Registry Key / Process / Thread 都算是物件的一種... Kernel會透過Handle這個令牌來訪問各個 檔案 / Registry / Process / Thread 等資源 Process裡面有Private Handle Table來儲存各個Handle,在需要時拿出來給Kernel就可以獲得存取權限 ![](https://i.imgur.com/6QWoso3.png) <br> ## x64dbg: Debugger UI, memory, bp, step in/out, dump process x64dbg是一款支援32位元64位元的動態分析神器,搭配上許多的外掛讓這款debugger相當好用 [x64dbg github](https://github.com/x64dbg/x64dbg) 他其實有兩個主要檔案:x32dbg.exe / x64dbg.exe,單純看你要分析的檔案是32位元還是64位元 這款debugger已經是內建在Flare VM之內,不過有個plugin滿推薦安裝的:[ScyllaHide](https://github.com/x64dbg/ScyllaHide) 他厲害的地方在於,他可以幫你繞過大大小小Anti-Debug/Anti-Analysis的招式 可以照著他附的PDF安裝到x32/64dbg並啟用 <br> 我知道有些人可能會問 ![](https://i.imgur.com/2ZOv2zb.png) ..... <br> 真的跟你有切身相關,別7pupu 我知道第三篇的時候建議你拍SnapShot,現在再一個SnapShot也無妨,多多益善 <br> 如果你不裝,只要遇上一些常見的Anti-Debug/Anti-Analysis的招式就會像這樣~掰哺 ![](https://i.imgur.com/ZeQIXHs.png =60%x) <br> --- 到這我假設您已經裝好了並且準備好了 來介紹一些常用的功能,打開x64dbg把calc.exe拖移進去(UAC逼逼叫就Say Yes) 或是 File > Open >選擇你要的檔案 之後應該會長的像下列圖片 左上是 instruction 右上是 register 中左是一些提示幫助debug 中右是在call function時幫你看清arguments(參數) 左下是Memory區塊 右下是Stack 最下面的Command提供直接輸入指令,像是breakpoint ![](https://i.imgur.com/VnJdRMv.png) --- ### Debug 接下來介紹一下Debug常用的功能 Run(F9): 無腦直接開始跑,跑到程式終止或是遇到breakspoint/exception 單步執行有兩種 Step into(F7) VS Step over(F8) 如果遇到某個call instruction,F7會進入call function內部,F8直接執行完call function 使用F8時,確保你了解這個call不會直接跳到end而不return回來,遇到也沒關係 Ctrl+F2重開設定breakpoint再一次即可 Execute till return: 開始執行到任何breakpoint或ret instruction Run to user code: 執行到user mode的時候停止,如果你執行到Windows API想回到本來的instruction,Run to user mode會很實用 ![](https://i.imgur.com/s5UN2cj.png =40%x) --- ### Breakpoints software breakpoint: 選擇Instruction F2 or bp <WinAPI> 具體做法是利用複寫選擇的Instruction變成INT 3 (opcode 0xCC) ![](https://i.imgur.com/pzun1hO.png =50%x) <br> hardware breakpoint: 在Memory區域設下斷點,當程式嘗試取用時會暫停執行 ![](https://i.imgur.com/eC8nrK4.png =70%x) <br> 可以透過breakpoints來查看現在設定的breakpoints列表 ![](https://i.imgur.com/M40vO02.png) --- ### 其他常用的資訊 首先是**Call stack** 當程式執行到一半,你想知道他是歷經了幾層的function call才來到這時 可以利用call stack來查看,通常會略過kernel32這種系統DLL,因為通常跟惡意程式本身沒關係 ![](https://i.imgur.com/wAQqPKo.png) <br> **memory map** 惡意程式常常有一些花招 使用VirtualAlloc / VirtualProtect這種Windows API來申請新的memory區塊並改寫存取權限為 可讀可寫可執行 **RWX** 目的就是要把真正的惡意程式放到這新的區塊,並進行跳轉去執行 這時可以透過memory map,搭配 breakpoint來監視是否有新的memory區塊被寫入 ![](https://i.imgur.com/syp2Slg.png) <br> 如果發現有新的memory區塊,可以dump出來拿去IDA分析 ![](https://i.imgur.com/FRS7xvS.png =60%x) <br> **Follow in Dump** 假設今天在分析加密function,你已經知道某個參數是明文的指標,你想知道加密前的資料(假設儲存在某個Stack上) 你可以選擇Stack按右鍵 > Follow in Dump ,對instruction/register也適用 指標指向的Data就會出現在左下方的Memory區塊內,x64dbg支援同時間看五個memory區塊 ![](https://i.imgur.com/m6jMeJq.png =80%x) <br> x64dbg介紹到這,最後提供官網的 [feature list](https://x64dbg.com/#features) <br> ## Process Hacker/Explorer 在分析惡意程式時,同時會需要monitor惡意程式是否創建新的process出現 或是創建新的process,想要把process dump下來,這時可以使用Process Hacker/Explorer這兩款軟體 圖中顯示了Process Explorer可以選 View > Show Lower Pane 來觀看Process Handle Process Hacker 也可以選擇process > 右鍵 > property > Handle來觀看 兩者功能差不多,都是很好的工具 ![](https://i.imgur.com/dIVUaEf.png) <br> ## Process Monitor Process Monitor是一款針對Windows API紀錄的軟體,相當簡單明瞭 可以透過Filter來過濾不需要的訊息或是想查找的Process ![](https://i.imgur.com/ZVEeU4f.png) <br> 使用filter過濾 Fiddler.exe,可以過濾掉很多不必要的資訊 ![](https://i.imgur.com/BaKtNDZ.png =90%x) <br> ## RegShot 另一個很好用的工具是RegShot 在惡意程式分析中,如果要檢查哪些Registry Key被改動或新增可以使用此軟體 使用方法為:執行惡意程式前先保存第一份Registry快照,程式執行完後再保存第二份Registry快照 之後將兩個比對後即可知道哪些可能是被改過的 比對之後很容易發現惡意程式時常使用下列Registry來達成Persistence (開機時執行惡意程式,確保不會因為重開機而流失一名顧客) ``` HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce ``` <br> ## Network Simulation 針對網路模擬,會需要比較多的工具 在介紹工具之前,先了解模擬網路的原因 1. 避免重複分析產生的Traffic一直回到駭客的Server,讓駭客察覺這邊有人在分析 2. 能夠擷取所有的網路封包並且利用工具加以分析(TLS或是特殊Encode/Encrypt的traffic) --- 再來介紹一下常用工具 ### [ApateDNS](https://fireeye.market/apps/211380) 惡意軟體常常會透過URL的方式(ex:hackerdomain.com)來傳送資料 透過ApateDNS,可以將應該通往hackerdomain.com的資料重新導向到自己設定的IP(可能是127.0.0.1/REMnux....) 再透過其他工具來擷取網路封包 ![](https://i.imgur.com/nqLjTrA.png =70%x) <br> 輕鬆轉移request ![](https://i.imgur.com/FkugmXV.png) --- ### InetSim 成功轉移request後,要Setup一個假的Web Server InetSim是一款能模擬多種Protocol的已經內建在REMnux裡面了,如下圖可以看到支援多種Server ``` remnux@remnux:~/Downloads$ accept-all-ips start OK, iptables will accept and redirect connections to all IPs on ens33. Remember to set the client system’s default gateway to IP of this REMnux host. remnux@remnux:~/Downloads$ inetsim INetSim 1.3.2 (2020-05-19) by Matthias Eckert & Thomas Hungenberg Using log directory: /var/log/inetsim/ Using data directory: /var/lib/inetsim/ Using report directory: /var/log/inetsim/report/ Using configuration file: /etc/inetsim/inetsim.conf Parsing configuration file. Configuration file parsed successfully. === INetSim main process started (PID 34483) === Session ID: 34483 Listening on: 192.168.23.136 Real Date/Time: 2020-09-02 11:18:36 Fake Date/Time: 2020-09-02 11:18:36 (Delta: 0 seconds) Forking services... * https_443_tcp - started (PID 34487) * http_80_tcp - started (PID 34486) * ftp_21_tcp - started (PID 34492) * smtps_465_tcp - started (PID 34489) * smtp_25_tcp - started (PID 34488) * pop3_110_tcp - started (PID 34490) * pop3s_995_tcp - started (PID 34491) * ftps_990_tcp - started (PID 34493) done. Simulation running. ``` --- ### netsh 嚴格來說這不算一款工具,他的功用偏向iptable 如果今天惡意軟體不是用hackerdomain.com這種URL來傳遞訊息,而是透過IP(1.3.3.7),這時ApateDNS這樣的工具就無法使用,netsh可以解決這樣的問題 <br> 在Windows中,用Admin權限打開cmd.exe並輸入 ``` netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport ``` [netsh的更多資訊](http://woshub.com/port-forwarding-in-windows/) --- ### [Fiddler](https://www.telerik.com/download/fiddler) 一款能夠動態觀測所有HTTP requests的好工具,而且支援TLS (就算惡意程式用TLS加密也沒用,照樣看得到原文) ![](https://i.imgur.com/gYvozq1.png) --- ### Wireshark 經典工具,會紀錄下所有protocol的封包,相當完整 網路很多教學,這邊就不多介紹了 <br> ## [dnSpy](https://github.com/0xd4d/dnSpy/releases) 針對.NET的Debugger,同時也能看到Source Code,是一款結合靜態與動態分析的好工具 .NET的惡意程式常常會出現混淆(Obfuscation),得透過動態分析來搞懂 [寫得很好的教學](https://www.itread01.com/content/1546233302.html) <br> ## Dynamic Analysis Tips 1. 做好SnapShot,確保環境的安全,開始用debugger執行程式之前確保breakpoint設定好 2. 不建議對樣本一無所知的情況下直接無腦執行 3. Windows PE類型建議設定breakpoint在Windows API,取決於你想分析的部分(網路/檔案/Registry..)以及常見的VirtualAlloc/VirtualProtect等針對Memory的API 4. 再進入call function之前,檢查一下argument,execute till return後對照一下memory的差異 5. 善用Step In/Out,不要過度糾結於instruction,搞懂大方向在做什麼,同時搭配IDA使用 <br> [-0xbc](https://hackmd.io/@0xbc000) ###### tags: `Malware Analysis` `Reverse Engineering` `tutorials`