簡單的鍵盤記錄程序分析
**樣本來自《惡意樣本分析》Lab12-2.exe **
Lab12-03.exe和dump出來得payload.exe是同一個
程序不是很複雜很適合用來練手,對於新手很友好🤡
程序的目的是什麼
這是一個鍵盤記錄的惡意程序。
程序是如何隱藏自身的
程序創建了一個svchost的進程來運行
惡意代碼的payload放在那裏
加密保存在資源文件內
程序是如何被保護的
將實際的Payload保存在資源內,通過異或加密保存
字符串是如何把被保護的
字符串在資源文件的payload內,被異或加密保存。
分析
分析母體邏輯
運行程序後,發現閃了一下就沒了,查看ProceExp內的進程信息沒看到運行的進程名,在winlogon外多了一個svchost進程值得被關注
看到這個進程是一個合法的進程就更加奇怪了,因爲svchost進程是在winlogon下的service進程下的一個子進程,但是獨立出來確實很可疑,猜測程序應該創建了一個獨立的svchost進程來隱藏實際的功能,避免被定位和分析。
將程序拖入到ida內分析,來到入口處後看到程序先獲取了當前運行程序的句柄,接着獲取了svchost的在系統下的路徑
執行後就得到了svchost.exe的完整路徑
接着讀取資源文件內的payload
可以看出程序是被加密的,接着讀取完成後會再分配一款內存用來複制讀取到的資源內容
之後調用解密程序,進行解密。
進入到sub_401000
後分析可知,解密方法是將讀取的資源文件和傳入的0x41
進行異或解密
解密後是一個PE文件
此時將payload進行dump保存。解密完成後進入核心功能sub_4010EA
進入sub_4010EA
內分析,首先判斷payload是否是一個PE
文件,因此會先判斷MZ
和PE
都滿足之後調用CreateProcessA
創建C:\Windows\System32\svchost.exe
進程
創建完成進程後會,先獲取創建的進程的線程上下文信息並判斷是否爲空
如果不爲空則調用會調用NtUnmapViewOfSection
將創建的進程的節區釋放掉
緊接着調用VirtualAlloc
函數在進程內分配一塊內存並調用WriteProcessMemeory
函數將之前解密的payload寫入到創建的進程內,之後通過SetThreadContext
設置線程的上下文信息和ResumeThread
再次回覆程序執行
運行時通過WriteProcessMemory
寫入的內信息
寫進進程後就會執行payload的功能。
分析payload
使用ida打開分析,來到入口處發現程序開了一個控制檯窗口並顯示之後,就進入到了Hook流程。
從SetWindowHookExA
的參數idHook=0xD
可知,這是一個鍵盤記錄的惡意程序,核心功能在lpFn
內,如果不清楚SetWindowHookExA
的參數意義,參考
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa
直接進入到lpFn
內,如下
根據SetWindowHookExA
函數的調用可以知道,爲了不影響原始調用,因此這裏會將對應的事件傳給要處理的程序,因此通過CallNextHookExA
函數來傳遞。
進入到keylogger
程序
主要記錄的事件包括了
內存保存在模塊執行的路徑下的practicalmalwareanalysis.log
保存的內容格式爲
[Window: 事件名稱]
執行的操作
#
[Window: 添加到壓縮包]
injBACKSPACE BACKSPACE BACKSPACE infectedinjBACKSPACE BACKSPACE BACKSPACE BACKSPACE BACKSPACE infected
如下保存的鍵盤事件內容
總結
程序爲了隱藏核心功能,將payload保存在了母體的資源文件內,接着運行之後解密payload,創建一個名爲svchost.exe
的進程,這個進程是一個合法的進程,之後將解密的payload寫入合法的進程內執行,通過通過Hook技術完成了鍵盤記錄功能。