MBR病毒IDA逆向分析与重写内容解读
4042019032 于小涵
运行病毒
运行病毒,直接关机
重启后出现下面的页面
输入任意字符,回车后会清空
可以知道,该病毒破坏了windows的启动过程,要进入系统必须输入正确的口令,该病毒属于MBR病毒的类型
2 基础知识
硬盘的主引导区在0柱面0磁道1扇区,包括硬盘主引导记录MBR(Main Boot Record)、四个分区表DPT(Disk Partition Table)信息和主引导记录有效标志字三部分,如表所示:
0000-0088 Master Boot Record主引导程序 主引导程序 0089-01BD 出错信息数据区 数据区 01BE-01CD 分区项1(16字节) 分区表 01CE-01DD 分区项2(16字节) 01DE-01ED 分区项3(16字节) 01EE-01FD 分区项4(16字节) 01FE 55 结束标志 01FF AA
主引导记录MBR从0000H开始到00D9H结束,共218个字节。MBR的作用就是检查分区表是否正确以及确定哪个分区为引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。MBR是由分区程序(例如DOS 的Fdisk.exe)产生的,在不同的操作系统平台下,这个扇区的内容可能不完全相同。
3 猜解口令
恢复快照到运行病毒前
如果要找到开机口令那应该是非常的容易,将病毒拖入x32dbg,进行字符串搜索就可以锁定这个特殊的字符串,猜测其为口令
4 逆向分析
下面逆向分析病毒原理
首先使用Exeinfo PE查壳,发现无壳
IDA中查看汇编指令,发现并没有很多识别不出来的红色语句,所以并没有花指令,到此可以知道病毒并没有保护
既然涉及到关机,那么在windows系统下一定涉及到关机的API函数,经过查阅资料,可以找到
查找字符串
找到关机API位置
查看其反编译代码
向上找到sub_4456D0
函数
查看函数内容
找到当前进程伪句柄函数GetCurrentProcess
、取得程序访问标记函数OpenProcessToken
、查找进程权限函数LookupPrivilegeValue
、获得关机权限函数AdjustTokenPrivileges
,其作用为为关机做好提权
回到关机函数sub_4455E0
,交叉引用向上查询
在这个函数中我们会发现关机函数的上面有两个一样的函数,其参数不一样
结合之前字符串搜索中发现的本机电脑磁盘标识符,因此可以猜测是完成了MBR的读写操作
在病毒感染前使用winhex查看磁盘的MBR
找到关机函数的地址,在X32dbg调试中设置断点,然后运行
再次查看MBR,发现被修改
5 重写内容分析
粘贴至新文件,导出MBR被重写的数据
将其拖入IDA进行反汇编分析
注意选择no,引导程序为16位
5.1 int 10h中断——屏幕显示
首先 int 10中断,这是BIOS对系统屏幕显示器所提供的服务程序,调用int 10h中断来控制显示器的显示控制显示器的显示
其中ES:BP是字符串地址,即00C2
cx是14h,即串的长度为20字节
因此确定了开始屏幕上显示的**qq-17412666**
AH = 13,功能号,表示显示字符串
BH表示页号
DH DL表示起始行列
5.2 int 16h中断——键盘读入
等待键盘键入字符,其中al代表键盘输入的字符
5.3 第一次int 13h中断——密钥比较
下面是从扇区写入内存的中断操作,我们逐步探讨
首先涉及到字符的比较,8对应的ASCII码是退格,如果检测到退格键则会跳转到loc_46
我们看一下loc_46的内容,属于是清空操作,与退格键的功能对应
第二次比较是与0Dh对应的ASCII码回车的比较,如果用户输入完毕进行了回车的话,那么就会跳转到loc_52
我们看一下loc_52的内容,一个段寄存器的转换,然后清空bx,继续进行下面的操作
若不是退格和回车键的话,就继续存入字符,[bx]存入键盘输入的字符,然后地址+2,cx记录输入字符的个数
下面将注意力集中在回车之后的操作
loc_58这里给si写入了一个很重要的地址
其正好是以下字符串的初始地址
下面就开始字符的比较,al是键盘输入的字符,ah是上面的字符串中的逐个字符,如果不相等的话会跳转到loc_9C进行出错处理;每个字符如果比较完成,就会取下一个字符继续比较,完成循环,loop循环次数由cx决定,即我们输入的字符的数量
再往下是为中断做参数准备
所以,按照上面的分析,我们只要将输入的字符与d8h地址开始的字符逐一比较,这就是口令
5.4 第二次int 13h中断——MBR写回
从内存将MBR写入扇区
6 遇到的问题
输入我们分析的口令之后并没有进入系统,而是出现了下面的情况,卡死在下面的页面,这个问题到现在还没有解决