恶意代码分析实战 — 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是同一个文件