恶意代码分析实战 — Lab 07-03

Lab 07-04

1、Strings&导入表初步静态分析

String exe发现kernel32.dll(字母l)和kerne132.dll(数字1),可能会有混淆,以及一串warning提示字符,system32系统路径

Strings dll 发现疑似命令 exec,sleep,hello等,还有一个保留ip地址

Exe程序 kernel32.dll有关于文件创建、遍历、拷贝等操作

Dll文件,kernel32.dll有创建、打开互斥量等操作

Ws2_32.dll关于网络的大部分操作

2、Idapro载入dll

DLLMain函数比较复杂

选择View — Open subviews — Function Calls查看函数调用情况

浏览程序,可以看到首先创建互斥量,互斥量的名字是SADFHUHF

然后调用socket

然后connect连接,地址就是strings分析得到的保留地址127.26.152.13,端口为80

Connect之后有个send操作,类似于发送 Hello 消息来与接收方确认连接,或者说提醒接收方接下来要进行连接后控制操作

之后有个recv接收操作,命令放在buf中

对接收来的消息进行strncmp比较执行不同命令

如果消息为5个字符长度的sleep,则sleep(60s)

如果接受命令是4个字符长度的exec

CreateProcessA创建进程,其中lpCommandLine参数保存的应该是需要执行的命令参数。

最后执行结束,继续回到send Hello处,等待执行下一轮操作

综上:dll实现的是个疑似后门功能,等待接收控制端的命令分别执行不同操作

3、Idapro载入exe程序分析

首先会有个argc的参数比较 cmp eax,2,至少要有两个参数

然后argv参数会跟一个warning字符串进行比较,意味着程序需要将这一串字符作为参数以保证程序正常执行

然后经过CreateFileA / CreateFileMappingA/MapViewOfFile等一系列操作将system/kernel32.dll映射到内存中

然后同样的调用CreateFileA/CreateFileMappingA/MapViewOfFile等操作将Lab 07-03.dll这个后门dll也映射到内存

然后多次调用sub_401040这个函数,先不去深入分析这个函数实现的功能,只需了解这应该是内存映射之后的一系列操作

在经过一些其他操作,先CloseHandle关闭之前的两个dll映射操作,然后调用CopyFileA将Lab07-03.dll复制为system32/kerne132.dll(数字1),以混淆原有的kernel32.dll(字母l)

然后调用call sub_4011E0,注意参数为C:\\*表示 C盘下所有目录及文件,进入call

首先寻找C盘目录下第一个文件FindFirstFileA,

然后malloc分配Size大小,然后进行stricmp比较

比较的是什么?看call 之前的push参数

比较的就是C盘根目录下获取的文件是否是exe文件

然后FindNextFileA来寻找下一个文件,实现文件遍历

大致理清了程序思路,然后对文件如何处理呢?在stricmp比较之后 进入call sub_4010A0

首先还是先将文件映射到内存

然后查看exe程序是否有权限访问内存

然后来到另一个stricmp函数处,比较的是str1和kernel32.dll(字母l)

如果exe中有kernel32.dll,就执行如下操作

repne scasb == stelen 求长度

rep movsd == memcpy 复制

其中rep movsd操作将esi内容覆盖edi中,数据流向为  edi <– ebx <– Str1    esi <–  dword_403010

再加上memcpy,也就说将dword_403010中的内容覆盖到Str2,即kernel32.dll中

以上程序可以翻译为:

Str1 = dword_403010

Str2 = “kernel32.dll”

memcpy(Str2 , Str1)

根据程序给出的伪代码也能看出数据走向

主要功能就是要实现 kerne132.dll(数字1)来替换kernel32.dll(字母l)

查看dword内容,内容可读性很差

按下A键,提示是否转化为String

Yes之后就可以看到转义后的字符为 kerne132.dll(数字1)

Str2的字符为kernel32.dll(字母l),这样结合起来看就很好理解了

返回后也代码也已经转成可读性更强的kerne132.dll(数字1)

之后执行一个循环,判断下一个exe文件是否调用kernel32.dll(字母l)

结论:

           这个恶意软件会遍历C盘下的所有加载kernel32.dll(字母l)的exe文件,并将动态链接库修改为kerne132.dll(数字1),这个恶意dll是从Lab07-03.dll拷贝到system32目录下的,这样当有调用kernel32.dll(字母l)的exe程序运行时,就会触发恶意dll从而开启后门

3、运行验证

首先PM设置Filter,监听exe程序行为

感染前的程序Strings.exe是加载kernel32.dll的

使用命令行来使Lab07-03.exe运行,程序执行非常慢,毕竟要遍历整个C盘目录

此时再查看strings.exe动态链接库,发现已经变成了kerne132.dll(数字1),并且在其下调用了kernel32.dll(字母l),因为是大写,看起来比较直观

恶意代码执行时可以看到C盘遍历的过程

并且kerne132.dll(数字1)的export为灰色,真实的kernel32.dll(字母l)为青色

使用md5可以看到system32\kerne132.dll和执行的Lab07-03.dll是同一个文件

您可能还喜欢...