2020年3月12日 星期四

DLL逆向分析技巧

DLL(Dynamic-Link Library)是動態連結函式庫,主要是將程式碼模組化,並提供外部函式給主程式使用,不過惡意程式往往也有可能是透過DLL來與駭客中繼站通訊。資安工程師在分析惡意程式有時可能只有DLL本身,原來的中介程式已經找不到了,接下來的篇章是介紹去運行單獨一個DLL檔案,然後分析它。

由於DLL不能直接執行它,需要透過rundll32.exe程式來運行我們的DLL,不過rundll32.exe不是GUI(Graphical User Interface)的工具,使用它還需要知道它的參數格式,非常不方便,因此我們會透過Cheat Engine來幫助運行我們的DLL。

Cheat Engine
https://www.cheatengine.org/

DLL檔案(testDll.dll)
https://drive.google.com/file/d/1lEo3RC_A7GWIjZRDdRs3Y__p13KuJ18s/view?usp=sharing

DLL程式碼
https://drive.google.com/file/d/1Qx2kbqqPZLVKdyFQKn-KGp1tKsi6w9xp/view?usp=sharing


一、x64dbg Attach cmd.exe

我們已經知道DLL它必須在執行檔之下運行程式,因此我們要利用cmd.exe(也可以利用其它執行檔)來運行我們的DLL。

開啟cmd.exe,開啟x32dbg.exe(如果是64位元要使用x64dbg.exe),x32dbg.exe->File->Attach->選擇cmd.exe。



二、設定DLL Entry中斷點

在運行到cmd.exe時,我們必須在x32dbg.exe裡面設定載入DLL時,讓程式中斷下來。

x32dbg.exe->Options->Preferences->Events->將DLL Entry打勾。



三、注入DLL

接下來是主要的重點,我們會利用Cheat Engine來注入DLL,並分析它。

開啟Cheat Engine->Attach cmd.exe。



Memory View->Tools->Inject DLL->選擇要分析的DLL(testDLL.dll)。



選取要分析的外部函式(雖然範例只有一個外部函式,不過在真實情境的DLL,可能會有多個外部函式)。



在注入DLL時,會中斷到標準DLL,像是kernel32.dll,所以要在10秒內運行到我們的DLL。



如果沒有在10秒內運行到被注入的DLL,Cheat Engine會注入失敗,cmd.exe會觸發例外(Exception),造成程式當掉。



我們需要按F9運行到我們的DLL模組(testDll),然後按F8或F7進入主程式。



我們在進入DLL(testdll)的EntryPoint後,它會進行一系列的初始化,但是我們又不想要單步執行程式碼到我們要分析的外部函式,所以可以搜尋此函式的字串或Pattern來定位到此函式的位址,然後再下中斷點,這樣就簡單快速的找到此函式的運行位址。