样本在2楼
发现下载要KX...郁闷..没kx的朋友到下面的链接下载吧...不要Kx看着乐呵,给留个言就成.
传送门: 猛击下载 密码和2楼的一样virus
传送门2:http://dl.dbank.com/c0euq3uewf
前言
来看雪有一阵子了,一直在看各位大大的文章,学习了很多知识,感谢看雪!今天也献上病毒分析一篇,很简单,高手直接飘过吧.
第一次发自己写的分析报告,错误肯定不少,请各位雪友指正,共同进步哈.
病毒特征
1.主程序和恶意代码分离,恶意代码以shellcode的形式加密在单独的配置文件中.
2.只能起一次危害作用.程序运行一次后恶意代码被覆盖.
内容摘要
本次分析的主要关注
病毒向explorer.exe注入恶意代码,并且inlinehook CloseHandle 使恶意代码获得执行机会
分析开始
1.整个病毒的整体流程很简单清晰:
加载time.ini,----->解码time.ini----->改写time.ini的内容----->执行time.ini中的恶意代码
流程图如下所示:
下面主要描述 time.ini的解码,以及time.ini恶意代码执行(shellcode)的过程:
1.1 time.ini解码
解码的过程就是加密数据和key1,key2做两次xor, Key2存放在time.ini+0偏移处,也就是开始的几个字符"0x00505372", key1初始为0在每次解码的时候和解码结果做加法变换
具体流程如下图所示:
代码:
代码简单注释如下: ;time.ini的解码 00401926 > /8B4D E8 mov ecx, dword ptr [ebp-18] 00401929 . |83C1 04 add ecx, 4 0040192C . |894D E8 mov dword ptr [ebp-18], ecx 0040192F > |8B55 E8 mov edx, dword ptr [ebp-18] 00401932 . |3B55 E4 cmp edx, dword ptr [ebp-1C] 00401935 . |7D 33 jge short 0040196A ; 解密是否完成 00401937 . |8B45 08 mov eax, dword ptr [ebp+8] 0040193A . |0345 E8 add eax, dword ptr [ebp-18] 0040193D . |8B08 mov ecx, dword ptr [eax] 0040193F . |894D EC mov dword ptr [ebp-14], ecx ; 获取加密数据 00401942 . |8B55 EC mov edx, dword ptr [ebp-14] 00401945 . |3355 F0 xor edx, dword ptr [ebp-10] ; 用加密的数据和key1做xor 00401948 . |8955 EC mov dword ptr [ebp-14], edx 0040194B . |8B45 EC mov eax, dword ptr [ebp-14] 0040194E . |3345 F8 xor eax, dword ptr [ebp-8] ; 用第一步的结果和key2做xor,key2来自time.ini+0处 00401951 . |8945 EC mov dword ptr [ebp-14], eax 00401954 . |8B4D F0 mov ecx, dword ptr [ebp-10] 00401957 . |034D EC add ecx, dword ptr [ebp-14] ; 变换key1,用key1和解密数据做add 0040195A . |894D F0 mov dword ptr [ebp-10], ecx 0040195D . |8B55 08 mov edx, dword ptr [ebp+8] 00401960 . |0355 E8 add edx, dword ptr [ebp-18] 00401963 . |8B45 EC mov eax, dword ptr [ebp-14] 00401966 . |8902 mov dword ptr [edx], eax ; 保存解密后的数据 00401968 .^\EB BC jmp short 00401926
1.2 time.ini恶意代码(shellcode)执行
1.2.1 shellcoede执行的起始位
shellcoede执行的起始位置由 time.ini+0x8处的偏移来计算,计算方法是time.ini+0xc在内存中的位置为基质加上time.ini+0x8的数据为偏移
具体代码以及简单注释如下所示:
代码:
0040150A |. 8B4D 08 mov ecx, dword ptr [ebp+8] 0040150D |. 8B11 mov edx, dword ptr [ecx] 0040150F |. 8955 FC mov dword ptr [ebp-4], edx ; offset 获取shellcode开始执行的偏移 在time.ini+0x8取 00401512 |. 8B45 08 mov eax, dword ptr [ebp+8] 00401515 |. 83C0 04 add eax, 4 ; baseaddress 获取time.ini+c偏移在内存中的位置 00401518 |. 8945 F8 mov dword ptr [ebp-8], eax 0040151B |. 8B4D F8 mov ecx, dword ptr [ebp-8] 0040151E |. 034D FC add ecx, dword ptr [ebp-4] ; shellOEP = baseaddress+offset 通过计算或得shellcode开始执行的位置 00401521 |. 0FBE11 movsx edx, byte ptr [ecx] 00401524 |. 83FA 55 cmp edx, 55 ; 通过特征码验证shellOEP是否正确 00401527 |. 0F85 94000000 jnz 004015C1
按照上面的偏移进入shellcode后的整体流程如下所示:

1.2.2.1 获取kernel32基质:
获取kernel32基质的方式用的是fs:0论坛前辈已经详细讲解过这里不再重复,
1.2.2.2 获取API:
病毒在获取API的时候对断点进行了检查并且对地址做了简单的处理,就是把函数地址-1这样在动态分析的时候看不到函数名字很不方便.没准还能逃避一些主防手段
还原的方式也很简单只要nop掉00C5036F 00C50375 两处的代码即可.
具体代码如下
;断点检测和地址简单处理
代码:
00C5036C 8038 CC cmp byte ptr [eax], 0CC ; 当前获取函数是否被下断点 00C5036F 74 7F je short 00C503F0 00C50371 48 dec eax ; 获取的函数地质-1 00C50372 8038 90 cmp byte ptr [eax], 90 ; 当前指向的位置是否为nop,如果不是还原地质 00C50375 74 01 je short 00C50378 00C50377 40 inc eax
遍历进程寻找explorer.exe的代码很普通不多说了,
1.2.2.4 恶意代码注入explorer.exe 和 对 CloseHandle的inlinehook
找到explorer.exe后通过OpenProcess打开之,然后读取explorer.exe中CloseHandle函数的前五字节并保存,这里explorer.exe中CloseHandle函数地址直接用的自身CloseHandle的地址
因为大部分情况下不同进程kernel32.dll的基质是一样的.这个假设在这里也成立.
有了CloseHandle的位置以后就可以对 explorer.exe 的函数进行Hook了,病毒在进行Hook之前先将hook的目的函数写入了explorer.exe 并计算出了Hook点的代码
代码:
00C5C649 FF10 call dword ptr [eax] ; ReadProcessMemory 00C5C64B 85C0 test eax, eax 00C5C64D 0F84 F3000000 je 00C5C746 00C5C653 8B45 D6 mov eax, dword ptr [ebp-2A] 00C5C656 3D 8BFF558B cmp eax, 8B55FF8B ; 用特征值比对是否读取正确 00C5C65B 0F85 DE000000 jnz 00C5C73F 00C5C661 6A 40 push 40 00C5C663 68 00100000 push 1000 00C5C668 68 14C80000 push 0C814 00C5C66D 6A 00 push 0 00C5C66F FF75 F8 push dword ptr [ebp-8] 00C5C672 E8 04000000 call 00C5C67B ; 读取成功在explorer.exe中申请一块内存 00C5C677 E7 BD out 0BD, eax 00C5C679 0000 add byte ptr [eax], al 00C5C67B 58 pop eax 00C5C67C 2B00 sub eax, dword ptr [eax] 00C5C67E FF10 call dword ptr [eax] 00C5C680 85C0 test eax, eax 00C5C682 0F84 BE000000 je 00C5C746 00C5C688 8945 F4 mov dword ptr [ebp-C], eax ; 保存内存地址 00C5C68B 8D45 D6 lea eax, dword ptr [ebp-2A] 00C5C68E C600 E9 mov byte ptr [eax], 0E9 00C5C691 B9 F4C40000 mov ecx, 0C4F4 ; 注入到explorer.exe部分shellcode开始执行地址偏移是个营编码值 00C5C696 034D F4 add ecx, dword ptr [ebp-C] ; 计算注入到explorer.exe后ShellCode开始执行的 内存地址 00C5C699 2B4D E4 sub ecx, dword ptr [ebp-1C] 00C5C69C 83E9 05 sub ecx, 5 ; 计算JMP指令的值(计算Hook点的代码) 00C5C69F 8948 01 mov dword ptr [eax+1], ecx 00C5C6A2 C745 EC 14C80000 mov dword ptr [ebp-14], 0C814 00C5C6A9 C745 F0 00000000 mov dword ptr [ebp-10], 0 00C5C6B0 C745 E8 00000000 mov dword ptr [ebp-18], 0 00C5C6B7 837D EC 00 cmp dword ptr [ebp-14], 0 00C5C6BB 74 42 je short 00C5C6FF 00C5C6BD 8D45 F0 lea eax, dword ptr [ebp-10] 00C5C6C0 50 push eax 00C5C6C1 FF75 EC push dword ptr [ebp-14] 00C5C6C4 E8 04000000 call 00C5C6CD 00C5C6C9 BD C6000058 mov ebp, 580000C6 00C5C6CE 2B00 sub eax, dword ptr [eax] 00C5C6D0 0345 E8 add eax, dword ptr [ebp-18] 00C5C6D3 50 push eax 00C5C6D4 8B45 F4 mov eax, dword ptr [ebp-C] 00C5C6D7 0345 E8 add eax, dword ptr [ebp-18] 00C5C6DA 50 push eax 00C5C6DB FF75 F8 push dword ptr [ebp-8] 00C5C6DE E8 04000000 call 00C5C6E7 ; 将timt.ini+0xc开始解码后的数据写入explorer.exe进程地址空间
具体代码如下:
代码:
0c0C5C719 FF10 call dword ptr [eax] ; 修改CloseHandle处的内存读写属性 00C5C71B 85C0 test eax, eax 00C5C71D 74 27 je short 00C5C746 00C5C71F 6A 00 push 0 00C5C721 6A 05 push 5 00C5C723 8D45 D6 lea eax, dword ptr [ebp-2A] 00C5C726 50 push eax 00C5C727 FF75 E4 push dword ptr [ebp-1C] 00C5C72A FF75 F8 push dword ptr [ebp-8] 00C5C72D E8 04000000 call 00C5C736 ; 用上一步骤计算好的JMP指令替换CloseHandle的前5字节
经过inlinehook和恶意代码注入两个步骤explorer.exe地址空间内发生了如下图所示的变化
hook前

hook后

如果explorer.exe调用CloseHandle这个API的话如下所示的恶意代码将获得执行的机会 貌似是个下载者,这里不做为重点分析
被写入的恶意shellcode


