小哈龙 发表于 2017-7-4 11:16

[新手]MBR病毒样本分析

本帖最后由 小哈龙 于 2017-8-4 14:03 编辑

1MBR病毒样本分析
1.1基本信息
样本类型:MBR感染样本
大小:36864 字节 36KB
MD5:955b66c722ca993dd11fbe56bbf92525
壳种类:无壳
编译器信息:VC++6.0
简介:该样本是一个修改MBR的病毒。


感染症状:感染该病毒后,刚开始并不会发现有什么异常情况,但是当你重启电脑后,你就会发现电脑启动停留在一个黑色界面,带着恶意文字,在WIN7虚拟机中运行过后重启系统的结果,感染后重启电脑如图4-1所示

                         图4-1感染病毒效果图
文件变化:无
注册表变化:无
网络行为:无
1.2详细分析
(1)首先总体看一下病毒程序布局
将病毒文件载入IDA,首先观察IDA 的Functions window 界面,如图4-2所示:

图4-2 IDA FunctionWindow图


因为该病毒文件是采用VC++6.0编译的,看到main函数,就试着点开看一下,双击main函数后,在IDA中看到如下汇编代码,该段介绍的是该病毒程序的主函数,包含两个子模块:
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的字符权限名称,一般用在进程提权中使用,然后看下面三句汇编代码:
push    1            ; int
push    offset aSedebugprivile ; "SeDebugPrivilege"
call    sub_4010002.

首先将两个值压栈,其中一个值还与进程提权有关,下面一个call,指向了另一个位置,想到这里,这个call里面的操作估计与进程提权相关,在IDA中双击call跟进,查看call的内容,为了直观这里切换到IDA 的Graph view,双击call出现的内容,如图4-3:



图4-3 IDA callsub_401000 Graph View图


进入这个界面,该从哪里才下手呢,刚才分析,这个call所做的操作与进程提权相关,要想提升一个进程的权限,那么首先要做的第一步是得到当前进程的句柄,查看call进来的汇编代码发现一个API GetCurrentProcess,这个API是获取当前进程的句柄的,这就正确了,设想是正确的,就从这里下手,如下汇编代码,主要介绍两个进程提权的API函数GetCurrentProcess和OpenProcessToken
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中右下角那一个模块中,下边看一下汇编代码,主要功能修改进程权限
loc_401028:
mov   ecx,
mov   eax,
neg   ecx
lea   edx,
mov   , esi
sbb   ecx, ecx
push    edx             ; lpLuid
and   ecx, 2
push    eax             ; lpName
push    0               ; lpSystemName
mov   , ecx
call    ds:LookupPrivilegeValueA
mov   edx,
push    0               ; ReturnLength
push    0               ; PreviousState
lea   ecx,
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中第二个关键点:
add   esp, 8
jmp   sub_401090
在第一个call    sub_401000这个子模块中,一共两个参数压栈
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函数
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,
push    3               ; dwShareMode             参数3
push    0C0000000h      ; dwDesiredAccess         参数2
rep movsd
push    offset FileName ; \\\\.\\PHYSICALDRIVE0   参数1
mov   , 55h
mov   , 0AAh
call    ds:CreateFileA            

调用函数55h 0AAh 这个对磁盘主引导区比较熟悉的应该知道,这是磁盘主引导扇区(MBR)的结束表示,一般是第一扇区的511和512字节处,就像PE文件头的标识00004550一样,以上汇编代码中,其实只是实现了一个功能就是在磁盘下创建文件,从参数7到参数1是CreateFileA函数的7个参数,顺序也按照调用顺序进行排列,具体参数就不再细说了,调用CreateFileA函数取得设备句柄(这个设备句柄后面会用到),通过对返回值进行检测,判断函数是否成功,成功的话进行进一步操作,如下汇编代码:
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的字符数据已经可以在内存中查到,如下代码:
mov   ecx, 0Ch
mov   esi, offset unk_406030
lea   edi,


观察上边代码,这个地址开始的数据后来被检测到包含MBR引导扇区的结束标志55H AAH,如下代码:
mov   , 55h
mov   , 0AAh

因此在内存中转到406030这个位置,查看数据,如图4-8所示。此时再把视线回归到IDA中如图4-3所示,既然程序跳转到loc_4010F4处,下面具来分析一下loc_4010F4处的代码,来了解病毒程序下面如何操作,上面通过CreateFile取得文件设备句柄,并将设备句柄存取到ESI中,然后进一步操作,如下代码:
lea   ecx,
push    0               ; lpOverlapped
push    ecx             ; lpNumberOfBytesWritten
lea   edx,
push    200h            ; nNumberOfBytesToWrite      写入数据位512字节
push    edx             ; lpBuffer
push    esi             ; hFile
call    ds:WriteFile

调用WriteFile函数,将512字节的 数据写入hFile(即CreateFile创建的文件中)中,下面利用DeviceIoControl与设备进行I/O,上面已经创建好的设备句柄保存在ESI中,详细如下代码:
lea   eax,    ;数据所在位置
push    0               ; lpOverlappedpush    eax             ; lpBytesReturned驱动程序实际返回给应用程序的数据字节数地址
push    0               ; nOutBufferSize
push    0               ; lpOutBuffer
push    0               ; nInBufferSize
push    0               ; lpInBuffer
push    9001Ch          ; dwIoControlCodeI/O和文件系统数据缓冲区进行数据传递的方式
push    esi             ; hDevice          设备句柄
call    edi ; DeviceIoControl   
push    esi             ; hObject
call    ds:CloseHandle ;表示数据所在位置,上面参数有相关解释,通过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发的一篇分析文章后决定自己尝试一下,因为个人技术太少,刚涉足此方向,新手上路,望各位大大给予指点




aini2008ha 发表于 2017-7-12 08:50

说道MBR的话可以尝试手工修复一下,如果没有破坏dbr和ebr。或者备份留下哪怕一个也可以算出来。简单的计算看看书一个小厮差不多可以掌握,推荐刘伟写的《数据恢复技术深度揭秘》

小哈龙 发表于 2017-7-5 22:08

swx5201314 发表于 2017-7-5 20:52
楼主都是新手的话我不知道自己该怎么定位了

我是做开发的,刚涉足这个方向,完全是新手{:1_936:}

A-_虚伪_! 发表于 2017-7-4 11:28

大神好厉害,谢谢分享。{:1_918:}

我是萌萌哒提莫 发表于 2017-7-4 11:34

{:301_997:}虽然看不懂,但是我还是看了

小哈龙 发表于 2017-7-4 11:43

第一次发这种帖子,有违规或者不合适的请大家指出,图片上传很麻烦,后续分析没上传

Cctv_Missx 发表于 2017-7-4 13:28

新手就要一起进步,加油

gongzi 发表于 2017-7-4 22:29

631到此一游,写的不错,学习了

穆里尼奥 发表于 2017-7-5 08:26


谢谢分享   学习一下。

lxrhome 发表于 2017-7-5 09:09

直接重置MBR分区表是否可以?

guo_qun_ 发表于 2017-7-5 12:51

谢谢分享   学习一下。

泳坤 发表于 2017-7-5 14:18

打得不错 入口切入可以学习
页: [1] 2 3 4
查看完整版本: [新手]MBR病毒样本分析