2020年3月26日 星期四

Windows Keylogger逆向分析

在惡意程式當中,最常見的行為是木馬/後門,接下來就是鍵盤側錄(Keylogger),因此我們這篇就要來研究它是如何運作的,雖然在技術上並沒有特別困難,不過想要入門惡意程式逆向分析的同學,會是不錯的選擇。

在分析Keylogger之前,我們先了解一下它是利用哪個API來記錄我們的按鍵。

SetWindowsHookEx是Windows提供給開發人員來Hook鍵盤、滑鼠、視窗訊息等等事件,因此Keylogger最常使用這個API,其中第一個參數(idHook)是要Hook哪種事件的行為,第二個參數(lpfn)是觸發此事件需要處理的函式(Callback Function)位址,第三個參數(hmod)是Current Module Handle,第四個參數(dwThreadID)是要Hook的Thread id,如果第四個參數是0,代表全局(桌面上運作的所有程式)Hook。



鍵盤事件有分WH_KEYBOARD(數值為0x2)和WH_KEYBOARD_LL(數值為0xD),WH_KEYBOARD僅Hook視窗程式在調用GetMessage或PeekMessage時,按下鍵盤的按鍵,才會進入處理函式,不過WH_KEYBOARD_LL是在驅動層來過濾按下的按鍵,所以它可以更完整的監控所按下的按鍵。

一、SetWindowsHookEx分析

我們可以在SetWindowsHookEx下中斷點,並且分析它的參數,第一個參數它是使用0xD(WH_KEYBOARD_LL),也就是驅動層鍵盤的Hook,第二個參數是0xB21118,這個位址是處理鍵盤按鍵的函式(Callback Function),接下來才會進一步分析此函式的運作行為,第四個參數是0,代表是桌面上的所有程式都會被監控。



二、Callback Function分析

我們先來了解一下此函式的參數,第一個參數(nCode)是觸發的事件是屬於哪種行為,鍵盤是HC_ACTION(0x0),第二個參數(wParam)是紀錄鍵盤是屬於按下(WM_KEYDOWN)還是彈起(WM_KEYUP),第三個參數(lParam)是存取鍵盤相關的結構資訊(KBDLLHOOKSTRUCT),其中vkCode是按鍵的資訊。





[ebp-10C]是存放lParam的位址,並移動到eax,所以[eax]裡面就是vkCode(按下的按鍵資訊),接下來通常它會一系列的判斷是否有按下Shift或Enter等等的特殊按鍵,不過有時候會在輸出結果(可能利用WriteFile寫入到檔案)下中斷點,直接分析它的輸出結果。



利用GetForegroundWindow和GetWindowTextA來獲取當前按下按鍵的視窗名稱,這樣就能進一步知道它是從哪隻程式按下此按鍵。



三、輸出結果

從輸出結果判斷它會記錄當前按下的按鍵時間、當前視窗名稱和按鍵資訊,如果有使用Enter或其他特殊按鍵會特別標記它([ENTER])。