現在我們已經對 IDA 的介面有了基本的認識,今天我們就要來實際使用 IDA Pro 分析惡意程式!
IDA Pro 中的許多視窗都與反組譯視窗互相連結,因此在瀏覽的時候可以互相跳來跳去,例如,在 Imports Window 或 Strings Window 中對某個項目點兩下,IDA Pro 就會直接帶你前往該項目所在的位置。
另一種在 IDA Pro 中進行導覽的方法,是使用反組譯視窗裡面的連結,例如下圖顯示的這些連結。

對其中任何一個連結 ❶ 點兩下,都會讓 IDA Pro 在反組譯視窗中顯示該連結所指向的目標位置。以下是幾種常見的連結類型:
printf 和 sub_4010A0
loc_40107E 和 loc_401097。Cross-references(交叉參照,Xrefs,在程式碼列表的 ❷ 處顯示)可以讓你快速將目前顯示的位置跳轉到「引用該項目的程式碼位置」。在這個例子中,引用的位置是 0x401075。

在 IDA Pro 裡面可以像瀏覽網頁一樣往回看或往後看,每次瀏覽到新的地方就會加入歷史。
假設我們今天拿到一支程式,跑起來以後看到想要查詢的關鍵字,就可以利用搜尋功能去找到他的位置

以上圖為例,我們看到了程式的回應 Bad key,所以就可以拿來搜尋看看能不能找到能成功的輸入

接著注意到 Bad key 在位址 0x401104 ❶ 被使用,因此我們在搜尋視窗中點兩下,他會直接跳到反組譯視窗中的這個位置。

查看這段程式碼後,我們發現在 "Bad key\n" 之前,位址 0x4010F1 有一個比較操作,它會檢查 strcmp 的執行結果,而傳入 strcmp 的其中一個參數是字串 $mab,所以字串很可能就是密碼。

重新執行後輸入 $mab 就可以發現成功觸發結果。
Cross-reference(交叉參照)在 IDA Pro 中通常稱為 xref,它可以告訴我們某個函式是在哪些地方被呼叫的,或某個字串是在哪些地方被使用的。如果我們找到了一個值得注意的函式,並且想知道這個函式被呼叫時傳入了哪些參數,就可以利用 Cross-reference 快速跳到呼叫該函式的位置,查看那些參數被放入 Stack 的地方。DA Pro 也可以根據 Cross-references 產生一些很有用的圖形以協助進行程式分析。


上圖 在 ❶ 的位置顯示了一個 Code Cross-reference,它顯示了這個函式 sub_401000 是從 main 函式內部被呼叫的,而且呼叫位置位於 main 函式起始位置之後偏移 0x3 的地方。
❷ 處的 Jump 所對應的 Code Cross-reference,則告訴我們是哪一個 Jump 會跳到目前這個位置。在這個例子中,它所對應的就是 ❸ 所標示的位置。我們之所以知道這一點,是因為在 sub_401000 函式起始位置之後偏移 0x19 的地方,有一條位於記憶體位址 0x401019 的 jmp 指令。
在預設情況下,即使一個函式實際上可能在很多地方被呼叫,IDA Pro 對於任何一個指定的函式通常只會顯示其中幾個 Cross-references。如果想查看某個函式的所有 Cross-references,可以點選該函式名稱,然後按下鍵盤上的 X。接著彈出的視窗會列出所有呼叫這個函式的位置。

在上圖底部,可以看到 sub_408980 的 Cross-references 列表。從畫面上的「Line 1 of 64」可以知道,這個函式總共被呼叫了 64 次。在 Xrefs Window 中隊任何一個項目點兩下,就可以直接前往反組譯視窗中對應的 Reference 位置。
資料交叉參照是用來追蹤資料在二進位檔案中是如何被存取的,只要某個資料位元組在程式碼中透過記憶體參照被使用,就可以和 Data Reference 建立關聯,如下圖所示。

如上圖,我們可以在 ❶ 的位置看到一個指向 DWORD 0x7F000001 的 Data Cross-reference。對應的 Cross-reference 告訴我們,這筆資料是在位於 0x401020 的函式中被使用。
下一行則顯示了一個針對字串 <Hostname> <Port> 的 Data Cross-reference,如果我們在分析的時候看到一個有趣的字串,可以使用 IDA Pro 的 Cross-reference 功能,查看這個字串在程式碼中的確切使用位置,以及它究竟是如何被使用的。
因為篇幅的關係今天先做比較基本的分析!使用教材提供的 Lan05-01.dll 檔案載入後拿來分析。
DllMain 的位址
題目要求我們找到 DllMain 的位址,所以我們首先在 Functions 視窗找到它

接著按照昨天的教學 按空白鍵切換到文字視窗就可以看到 DllMain 的位址是 0x1000D02E。
gethostbyname 的位址在 Imports 視窗中使用搜尋功能就可以找到 gethostbyname

接著對他點兩下就可以看到他在 .idata 段落的 0x100163CC

gethostbyname在 gethostbyname 的地方按 X 就可以看到他被誰呼叫

在上圖中可以看到他寫 18 次,不過相同位址會有 r 跟 p 的類型所以其實是同一個呼叫,總共是 9 次,然後被 5 個不同的函式呼叫。
0x10001757 對 gethostbyname 的呼叫找出會發生的 DNS 請求首先對 0x10001757 的那個呼叫點兩下

接著把尋找和 DNS 有關的資訊

首先找到 gethostbyname 的位置
.text:10001757 call ds:gethostbyname
因為他的功能就是把 hostname 解析成 IP 位址,所以看到它,就知道這裡會進行名稱解析,通常會導致 DNS 查詢。接著看 gethostbyname 的參數
.text:10001756 push eax ; name
因此 eax 此時指向的字串,就是要解析的 hostname,接著再往上看到
.text:1000174E mov eax, off_10019040 ; "[This is RD0]pics.practicalmalwareanalys"...
因此可以還原成
gethostbyname("pics.practicalmalwareanalys...");
然後再對他點兩下就可以看到完整的 DNS 請求是對 pics.practicalmalwareanalys.com
今天對於如何使用 IDA Pro 分析惡意程式又有進一步的認識,本日介紹了使用的方式與交叉參照,並且利用 Lab 5-1 來做示範,明天會再繼續介紹 IDA 對於函式分析的方法以及如何使用圖形功能來看等等,並且繼續使用 Lab 5-1 做示範!
