恶意代码分析实战 IDA分析 lab 7-3 一个通过感染主机exe 修改kernel.dll为恶意dll的后门程序 要做清理的话 是很难的!
winxp运行该后门后:
win7下:
运行前:
运行后还是一样,即便是用cmd管理员运行。看来该病毒只是适合在xp下运行。
静态分析strings + IDA pro
查看字符串
exe
kerne`132`.dll
kernel32.dll
C:\windows\system32\kerne`132`.dll
C:\Windows\System32\Kernel32.dll
WARNING_THIS_WILL_DESTROY_YOUR_MACHINE
本书专制
dll
exec、sleep、hello
127.26.15.13 恶意代码可能访问该IP地址
SADFHUHF
导入函数
exe重点看kernel32.dll下大量和文件相关的函数
CreateFileA
、 CreateFileMappingA
以及MapViewOfFile
表明该程序可能打开一个文件,并将其映射到内存中。这个 FindFirstFileA
和FindNextFileA函数组合,可能会搜索文件,并使用CopyFileA
对找到的文件进行复制操作。该程序没有导入Lab 07-03.dll
(DLL中的函数)、LoadLibrary
或者GetProcAddress
,暗示它可能没有在运行时加载那个DLL。
dll文件的导入函数
重点看kernel32.dll
GetProcessA
函数,可能会创建另一个进程。
分析EXE
.text:00401440 mov eax, [esp+argc]
.text:00401444 sub esp, 44h
.text:00401447 cmp eax, 2#①
.text:0040144A push ebx
.text:0040144B push ebp
.text:0040144C push esi
.text:0040144D push edi
.text:0040144E jnz loc_401813#②
.text:00401454 mov eax, [esp+54h+argv]
.text:00401458 mov esi, offset aWarning_this_w ; "WARNING_THIS_WILL_DESTROY_YOUR_MACHINE"
.text:0040145D mov eax, [eax+4]#③
.text:00401460
.text:00401460 loc_401460: ; CODE XREF: _main+42j
.text:00401460 mov dl, [eax]#④
.text:00401462 mov bl, [esi]
.text:00401464 mov cl, dl
.text:00401466 cmp dl, bl
.text:00401468 jnz short loc_401488
.text:0040146A test cl, cl
.text:0040146C jz short loc_401484
.text:0040146E mov dl, [eax+1]
.text:00401471 mov bl, [esi+1]
.text:00401474 mov cl, dl
.text:00401476 cmp dl, bl
.text:00401478 jnz short loc_401488
.text:0040147A add eax, 2
.text:0040147D add esi, 2
.text:00401480 test cl, cl
.text:00401482 jnz short loc_401460#⑤
.text:00401484
.text:00401484 loc_401484: ; CODE XREF: _main+2Cj
.text:00401484 xor eax, eax
.text:00401486 jmp short loc_40148D
①:cmp eax, 2
检查参数个数是否为2,如果不是,跳转另一节,直接退出。在③处mov eax, [eax+4]
移动argv[1]
到EAX,以及将字符串"WARNING_THIS_WILL_DESTROY_YOUR_MACHINE
"移动到ESI寄存器。在④和⑤之间的循环,会对EAX和ESI中的值进行比较,如果不相同,则跳转,并从这个函数返回,不执行其他操作。
所以该程序的正确用法是
Lab 07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE
在字符串C:*处
sub_4011E0函数
FindFirstFileA
用于检索C盘驱动器
比较用一个字符串和.exe进行检查,调用sub_4010A0
函数,查看是否匹配
sub_4010A0
为了节省时间,只查看函数调用。CreateFileA
、CreateFileMappingA
以及MapViewOfFile
表明该程序打开文件,并将其映射到内存中。
出现了大量的IsBadReadPtr
.text:0040116E push offset Str2 ; ②"kernel32.dll"
.text:00401173 ⑥push ebx ; Str1
.text:00401174 ①call ds:_stricmp
.text:0040117A add esp, 8
.text:0040117D test eax, eax
.text:0040117F jnz short loc_4011A7
.text:00401181 mov edi, ebx
.text:00401183 or ecx, 0FFFFFFFFh
.text:00401186 ③repne scasb
.text:00401188 not ecx
.text:0040118A mov eax, ecx
.text:0040118C mov esi, offset dword_403010
.text:00401191 ⑤mov edi, ebx
.text:00401193 shr ecx, 2
.text:00401196 ④rep movsd
.text:00401198 mov ecx, eax
.text:0040119A and ecx, 3
.text:0040119D rep movsb
在②处检查是否为kernel32.dll
。③处调用repne scasb
,④处调用rep movsd
,在功能上等价于strlen
和memcpy
函数。memcpy
调用写入的地址在EDI中,首先需要知道EBX。EBX在⑥处压入栈传给strcmp
函数,意味着函数如果找到字符串kernel32.dll
,这段代码将用某些东西替换该字符串。什么东西呢?转到rep movsb
,查看源头在dword_403010
处
检查这个程序如何修改kernel32.dll
以及Lab07-03.dll
。使用md5检查
发现运行Lab07-03.exe
程序后Lab07-03.dll
名称修改为kerne132.dll
,并且有导出函数,该导出函数是kernel32.dll
中的导出函数,并且作了重定向,所有功能还是kernel32.dll
中的功能。
所有在main方法中访问kernel32.dll以及Lab07-03.dll的代码是在解析kernel32.dll的导出节,并在Lab07-03.dll中创建一个导出节,来导出同样函数并创建到kernel32.dll的转发。好绕啊
分析DLL
__alloca_probe:在空间分配栈
OpenMutexA、CreateMutexA 互斥量
远程socket建立建立连接
使用了固定ip地址127.26.152.13。端口0x50,为80端口,常用于Web流量。
数据如何传输?
send
recv
判断回复的内容:
strncmp检查是否字符串是否为"sleep",并检查返回值是否为0,如果是休眠60秒。
检查该缓冲区是否以"exec"开始。如果是strncmp返回0,然后顺序执行到jnz处,调用CreateProcessA函数。
该函数的一个重要参数是CommandLine,告知被创建的进程。未发现写过程。
对应的值在0xFFB处。
1.这个程序如何完成持久化驻留,来确保在计算机被重启后它能继续运行?
通过DLL到C:\windows\system32\
,并修改系统上每一个导入它的.exe文件,达到持久化驻留。
2.这个恶意代码的两个明显的基于主机特征是什么?
硬编码使用文件名kerne132
.dll
硬编码使用一个的互斥量SADFHUHF
3.这个程序的目的是什么?
创建后门程序来接远程主机,且难以被删除。两个命令分别用于执行和休眠
4.一旦这个恶意代码被安装,你如何移除它?
难以删除,因为感染了系统上每一个使用kerne132.dll的exe文件。
最好的方法是从备份系统中恢复或者留下这个恶意kerne132.dll文件并修改它,或者复制kernel32.dll为kerne132.dll进行替换,取消对所有PE文件的修改
参考
1.斯科尔斯基, 哈尼克. 恶意代码分析实战[M]. 电子工业出版社, 2014.