-
-
[原创]恶意代码分析笔记4(上)
-
发表于:
2015-7-13 22:43
6803
-
继承前辈们的成果,他在前辈们的肩膀上进行登高眺远,本人技术有限,如有差错,还望不喷,敬请原谅,先在此谢过!!
本次病毒分析,想改一下方式,重点,首先使用IDA对目标文件进行分析。然后有必要的时候再用其他工具进行验证分析。
基本信息 :msgina32.dll ,Lab11_01.exe
报告名称 :msgina32.dll,Lab11_01.exe分析
作者 :精灵(^_^)/淘气鬼
报告更新日期 :2015.7.13
样本发现日期 :……
样本类型 :.dll,.exe
样本文件大小 :Lab11_01.exe(52.0 KB), msgina32.dll(6.50 KB )
被感染文件变化长度 :
样本文件的MD5校验值 :Lab11_01.exe(A9C55BB87A7C5C3C923C4FA12940E719)
msgina32.dll(7CE4F799946F0FA44E5B2B5E6A702F27)
样本的SHA1校验值 :
Lab11_01.exe(D971656C6C605A6E2130AB83A38420E655428F94)
msgina32.dll(951FB5B80702D02E5C327B56CC709EE3AD5523D2)
壳信息 :无
可能受威胁的系统 :
先关漏洞 :无
一只检测名称 :无
简介 :这两个可执行文件
被感染的网络症状 :Lab11_01.exe可执行文件,调用msgina32.dll创建一个服务
系统文件变化 :额外运行一个服务
注册文件变化 :无
网络症状 :无
详细分析/功能介绍
对Lab11_01.exe文件进行分析
1.查看目标文件的导入表,了解导入相关的API函数,大体分析出目标函数的实现功能。得到的比较有价值的函数有如下:
地址 函数名 所属模块
0000000000407004 RegCreateKeyExA ADVAPI32
0000000000407000 RegSetValueExA ADVAPI32
0000000000407014 LoadResource KERNEL32
0000000000407044 WriteFile KERNEL32
00000000004070A4 CreateFileA KERNEL32
00000000004070C0 ReadFile KERNEL32
以上API主要分为3类:
1)创建注册表
2)载入资源
3)创建文件
由这三类API表明,目标文件会分为三步走:
1)创建注册表类,也就是表明这个目标程序是想长期驻留在系统中。但至于创建的注册表名是什么?在注册表的哪个地方存放?想要实现的详细目的是什么?得接下来对创建注册表API进行详细分析。
2)载入资源类,也就是表明这样在如某个资源。但是载入什么资源文件呢?会不会是载入的是接下来创建文件API调用时创建的文件呢?
3)创建文件类,也就是说要进行创建文件。但创建的是什么文件名?什么文件类型?在何处创建文件?写入的是什么数据?是运行后用资源段释放出来还是从目标文件中的数据段释放出来呢?
还有一个问题,三类API到底是先执行哪一类先呢?
2.详细解析API函数,一下详细API函数解析可到微软官方文档查阅(https://social.msdn.microsoft.com/search/en-us/windows?query=RegCreateKeyExA&Refinement=183)
RegCreateKeyExA :来到调用RegCreateKeyExA 函数的地址看到调用该函数前压入的参数如下:
eax, [ebp+phkResult]
push eax ; phkResult
push 0 ; lpSecurityAttributes
push 0F003Fh ; samDesired
push 0 ; dwOptions
push 0 ; lpClass
push 0 ; Reserved
push offset SubKey ; "SOFTWARE\\Microsoft\\Windows NT\\Curren"...
push 80000002h ; hKey 表示用户权限
call ds:RegCreateKeyExA
1)由上面的第二个参数SubKey可先解答注册表在哪创建的问题,来到存储SubKey的数据段处可知,存储的路径是:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon;2)而存放在这个路径的主要有什么特点,熟悉注册表和系统的基友和大牛们由“Winlogon”便可。简单地说这是用于存放用户登录程序即要调用程序,管理用户的登录和退出,也就是具备有自启动的特性。这也就解答了目标程序创建注册标的一个目标就是实现自身具备自启动的起码功能,只是起码功能但还不知道他的真实目的,不可妄下结论,但肯定不是为了具备自启动那么简单,因为这涉及到用户的登录退出有关,或许正是盯上这个特性(获取用户登录信息)。
RegSetValueExA :调用此函数是用于创建键值。同样来到调用此函数的地方,得到如下函数参数:
mov ecx, [ebp+cbData]
push ecx ; cbData
mov edx, [ebp+lpData]
push edx ; lpData
push 1 ; dwType
push 0 ; Reserved
push offset ValueName ; "GinaDLL" //键名
mov eax, [ebp+phkResult]
push eax ; hKey
call ds:RegSetValueExA
3)由上面的参数可知创建的键值(名)为:GinaDLL
来到调用LoadResource函数处,再往下看找到文件打开的API函数“_fopen”,调用的参数,即可知道需要载入的相关资源文件为"msgina32.dll"
push offset aWb ; "wb"
push offset aMsgina32_dll ; "msgina32.dll"
call _fopen ;打开文件
4)要载入的源文件名是找到了,但还不清楚源文件是在何处,根据子键名"msgina32.dll"(没有出现节点)来看是存放在和目标文件相同目录里面,但现在确实还没有msgina32.dll文件。因此可以确定这是在目标程序运行时才生成释放的文件。
但现存文件最有可疑的就是资源区段里边。现在可以使用Resource Hacker工具查看资源节里面是否存在一个pe文件。结果却是存在,如下所示:
0000B070 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ悤晻晻晻晻晻
0000B080 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 笗晻晻晻@晻晻晻?
0000B090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 晻晻晻晻晻晻晻晻
0000B0A0 00 00 00 00 00 00 00 00 00 00 00 00 D8 00 00 00 晻晻晻晻晻晻貢晻
0000B0B0 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 晻簳暣曂!笗L?Th
0000B0C0 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
0000B0D0 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
原资源存储已经确定位置,但现在还没确定是何时调用资源生成资源文件名。
5) CreateFileA:一下是CreateFileA函数的参数,但在IDA中并没有查到相关的文件名(问出文件名的地址未写入如数据),所以需要OD动态调试的时候在CreateFileA下断点,查看,相关的参数。
push 0
push esi ; dwFlagsAndAttributes
push [ebp+dwCreationDisposition] ; dwCreationDisposition
lea eax, [ebp+SecurityAttributes]
push eax ; lpSecurityAttributes
push [ebp+dwShareMode] ; dwShareMode
push [ebp+dwDesiredAccess] ; dwDesiredAccess
push [ebp+lpFileName] ; lpFileName
call ds:CreateFileA
使用OD调试查看站里面的数据得出CreateFileA的参数如下:
栈地址 地址 值
0012FD84 00404EA4 /CALL 到 CreateFileA 来自 Lab11-01.00404E9E
0012FD88 00408090 |FileName = "msgina32.dll"
0012FD8C 40000000 |Access = GENERIC_WRITE
0012FD90 00000003 |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012FD94 0012FDB0 |pSecurity = 0012FDB0
0012FD98 00000002 |Mode = CREATE_ALWAYS
0012FD9C 00000080 |Attributes = NORMAL
0012FDA0 00000000 \hTemplateFile = NULL
上面的文件名参数msgina32.dll 正是载入资源时载入的文件。
6)至于写的内容是什么?想要了解很简单,就是运行目标文件后就会生成msgina32.dll 文件然后再用IDA分析 msgina32.dll。
几个重要函数已经分析了。现在还差确定,它们的整个流程是怎么走的?
7)来到main函数处,看到如下的汇编代码:
push ebp
mov ebp, esp
sub esp, 11Ch
push ebx
push esi
push edi
mov [ebp+var_4], 0
push 0 ; lpModuleName
call ds:GetModuleHandleA ; .获取模块句柄
…………
mov eax, [ebp+hModule]
push eax ; hModule
call FindSource ; 1. 查找相应模块资源
add esp, 4
mov [ebp+var_4], eax
push 10Eh ; nSize
lea ecx, [ebp+Filename]
push ecx ; lpFilename
push 0 ; hModule
call ds:GetModuleFileNameA ; 2. 获取模块文件名
…………
mov edi, offset aMsgina32_dll_0 ; "\\msgina32.dll"
…………
lea eax, [ebp+Filename]
push eax ; lpData
call CreateRegit ; 3.创建注册表
…………
retn
小结:已经标记有,主要分为三步走:
1获取模块句柄,查找相应资源(包含释放资源),生成msgina32.dll文件;
2获取文件模块名,包含设置调用相关函数资源;
3创建注册表,创建SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinlogonGinaDLL,
。
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!