# 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  --- ### Handle 類似一個指向物件的指標(有點像令牌的概念),而這個物件是可以對各種資源進行存取讀寫 檔案 / Registry Key / Process / Thread 都算是物件的一種... Kernel會透過Handle這個令牌來訪問各個 檔案 / Registry / Process / Thread 等資源 Process裡面有Private Handle Table來儲存各個Handle,在需要時拿出來給Kernel就可以獲得存取權限  <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> 我知道有些人可能會問  ..... <br> 真的跟你有切身相關,別7pupu 我知道第三篇的時候建議你拍SnapShot,現在再一個SnapShot也無妨,多多益善 <br> 如果你不裝,只要遇上一些常見的Anti-Debug/Anti-Analysis的招式就會像這樣~掰哺  <br> --- 到這我假設您已經裝好了並且準備好了 來介紹一些常用的功能,打開x64dbg把calc.exe拖移進去(UAC逼逼叫就Say Yes) 或是 File > Open >選擇你要的檔案 之後應該會長的像下列圖片 左上是 instruction 右上是 register 中左是一些提示幫助debug 中右是在call function時幫你看清arguments(參數) 左下是Memory區塊 右下是Stack 最下面的Command提供直接輸入指令,像是breakpoint  --- ### 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會很實用  --- ### Breakpoints software breakpoint: 選擇Instruction F2 or bp <WinAPI> 具體做法是利用複寫選擇的Instruction變成INT 3 (opcode 0xCC)  <br> hardware breakpoint: 在Memory區域設下斷點,當程式嘗試取用時會暫停執行  <br> 可以透過breakpoints來查看現在設定的breakpoints列表  --- ### 其他常用的資訊 首先是**Call stack** 當程式執行到一半,你想知道他是歷經了幾層的function call才來到這時 可以利用call stack來查看,通常會略過kernel32這種系統DLL,因為通常跟惡意程式本身沒關係  <br> **memory map** 惡意程式常常有一些花招 使用VirtualAlloc / VirtualProtect這種Windows API來申請新的memory區塊並改寫存取權限為 可讀可寫可執行 **RWX** 目的就是要把真正的惡意程式放到這新的區塊,並進行跳轉去執行 這時可以透過memory map,搭配 breakpoint來監視是否有新的memory區塊被寫入  <br> 如果發現有新的memory區塊,可以dump出來拿去IDA分析  <br> **Follow in Dump** 假設今天在分析加密function,你已經知道某個參數是明文的指標,你想知道加密前的資料(假設儲存在某個Stack上) 你可以選擇Stack按右鍵 > Follow in Dump ,對instruction/register也適用 指標指向的Data就會出現在左下方的Memory區塊內,x64dbg支援同時間看五個memory區塊  <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來觀看 兩者功能差不多,都是很好的工具  <br> ## Process Monitor Process Monitor是一款針對Windows API紀錄的軟體,相當簡單明瞭 可以透過Filter來過濾不需要的訊息或是想查找的Process  <br> 使用filter過濾 Fiddler.exe,可以過濾掉很多不必要的資訊  <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....) 再透過其他工具來擷取網路封包  <br> 輕鬆轉移request  --- ### 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加密也沒用,照樣看得到原文)  --- ### 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`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.