Malware Analyse 2 --- mpsvc

恶意程序样本:

利用签名程序微软Microsoft Malware Protection的DLL劫持

mpsvc.dll分析

IDA分析

导出函数有DllMainServiceCrtMain
DllMain有些垃圾代码

实际上就是

1
return 1

ServiceCrtMain:
一段反调试代码

检查MsMpEng.exe模块地址+0xE730处的值是否为0x4cbeh,只有当前进程为MsMpEng.exe才能继续执行

动态调试

使用OllyDBG的call explort功能直接对DLL调试

把反调试部分改为nop

进入之后,首先获取shellcode:读取当前目录下的mpsvc.ui文件。从开始到偏移0x217是一个字符串,\0之后是shellcode开始
使用strlen计算字符串的长度,返回shellcode起始地址

进入shellcode

很多花指令,遇到call一律F7

call $+5,取EIP

一路经过很多call之后,最后终于call到shellcode末尾,开始寻找kernel32.dll以及所需的函数,搜索了VirtualAlloc,VirtualFree,VirtualProtect,RtlDecompressBuffer,memcpy

搜索函数之后,解密了一段长度为0x10的代码,解密的起始地址是调用当前函数的call指令的下一条指令

转换成C语言

1
2
3
4
5
6
7
8
9
10
DWORD x = *(DWORD*)begin;
DWORD a,b,c,d = x;
for(int i=0;i<16;i++)
{
a = a + (a >> 3) - 1448498774;
b = b + (b >> 5) - 909522486;
c = -127 * c + 1465341783;
d = -511 * d - 1987475063;
begin[i] = (a + b + c + d) ^ *((char *)begin + i);
}

解密的4个字节,第1个再加0x10是第一次调用VirtualAlloc时的大小,第2个是第二次调用VirtualAlloc时的大小
第一次调用VirtualAlloc

之后是同样的解密算法,解密同样的起始地址,解密长度为第1个VirtualAlloc的大小

第二次VirtualAlloc后,调用RtlDecompressBuffer解压,起始地址为之前解密地址+0x10

接下来就比较有意思了,实际上解压后已经是一个PE文件了,附近已经能够看到.text,.rdata字样
结合代码也可以看出这里开始就是PE加载的过程

PE加载过程就不仔细看了
最后可以把PE文件提取出来,修复PE头。大概看了一下,是个自带提权功能的DLL木马