fuchou-angle 发表于 2009-7-10 07:31:49

一个QQ木马的分析

该文章已发表于《黑客X档案》0906期,后由原创作者友情提交到邪恶八进制信息安全团队,转载请著名原作者和原始出处
  最近Blog人气疯狂下跌,就随便发篇垃圾文过来广告一下Blog,希望大牛们不要B4我.
  就快要高考了,好长时间没上网了。今天好不容易抽出点时间,刚上QQ一个我不认识的小子就说要给我个黄站发布器,我一高兴就要了因为我在网吧,也没多想就直接运行了,结果刚运行文件一下子就没了,过了一会QQ又掉了,我心里一凉啊,哎,又是马啊,那就拿出来逆逆吧!
  直接放到OD里,代码如下: 复制内容到剪贴板
  代码:
0041D987 > 60 pushad
0041D988 E8 09000000 call 0041D996
0041D98D 05 D80100E9 add eax, E90001D8

  用PEID来分析来看看,PEID说是Upack 0.3.9 beta2s -> Dwing的壳,记得这是个很古老的壳了,不管什么壳,看到第一句的pushad大部分就应该可以用ESP定律来脱了。为什么?翻翻以前的杂志,看看ESP定律的原理就行了。
  在OD中按F8跟踪一下,只要看见ESP寄存器的数据变红,然后就执行命令hr esp,然后按F9让它运行起来,接着程序就被断在了这里: 复制内容到剪贴板
  代码:
0041DB9C 61 popad
0041DB9D - E9 8F54FFFF jmp 00413031

  这里的popad和pushad是一对,看到这个popad,基本说明我们成功了,我们跟随这个jmp跳过去就到了程序的OEP了,直接使用OD把它DUMP出来,再用PEID看看,说是Microsoft Visual C++ 6.0 ,已经没壳了。
  我们用OD载入脱壳后的文件,F8跟踪几下后就可以看到如下代码: 复制内容到剪贴板
  代码:
00405086 E8 65EBFFFF call <jmp.&kernel32.OpenMutexA>
0040508B 85C0 test eax, eax
0040508D 75 13 jnz short 004050A2

  刚开始先打开互斥(用来判断程序运行是否唯一),继续往下看: 复制内容到剪贴板
  代码:
004050E9 E8 16EEFFFF call 00403F04
004050EE 8B55 EC mov edx, dword ptr
004050F1 B8 B0764000 mov eax, 004076B0
004050F6 E8 05E0FFFF call 00403100
004050FB A1 B0764000 mov eax, dword ptr
00405100 E8 EFE2FFFF call 004033F4

  这段代码用来得到一个随即字符串作为DLL的文件名
  我们略过这些,直接看关键代码: 复制内容到剪贴板
  代码:
0040188A . 6A 02 push 2 ; /Origin = FILE_END
0040188C . 6A 00 push 0 ; |pOffsetHi = NULL
0040188E . 6A C4 push -3C ; |OffsetLo = FFFFFFC4 (-60.)
00401890 . FFB5 ACFEFFFF push dword ptr ; |hFile
00401896 . FF15 1C304000 call dword ptr [<&KERNEL32.SetFilePoi>; \SetFilePointer

  这里的代码用于调整好文件指针用来读文件,继续往下看: 复制内容到剪贴板
  代码:
0040189C . 8365 EC 00 and dword ptr , 0
004018A0 . 6A 00 push 0 ; /pOverlapped = NULL
004018A2 . 8D45 EC lea eax, dword ptr ; |
004018A5 . 50 push eax ; |pBytesRead
004018A6 . 6A 3C push 3C ; |BytesToRead = 3C (60.)
004018A8 . 8D85 B0FEFFFF lea eax, dword ptr ; |
004018AE . 50 push eax ; |Buffer
004018AF . FFB5 ACFEFFFF push dword ptr ; |hFile
004018B5 . FF15 30304000 call dword ptr [<&KERNEL32.ReadFile>] ; \ReadFile

  开始读文件了,再往下几行我们会看到这里:004018BB . 6A 3C push 3C 复制内容到剪贴板
  代码:
004018BD . 8D85 B0FEFFFF lea eax, dword ptr ; 取加密字符地址
004018C3 . 50 push eax ; 压入加密字符地址
004018C4 . E8 B90A0000 call 00402382 ;

  进行解密这里是解密算法,对加密信息进行解密,我们这里所谓的加密信息就是从文件中读出来的盗号贼的密码什么的,我们按F7跟进这个call,看这里的解密算法代码:
  004023AD > /8B45 F8 mov eax, dword ptr 复制内容到剪贴板
  代码:
004023B0 . |40 inc eax ; eax加1,已经解密到第eax位
004023B1 . |8945 F8 mov dword ptr , eax ; 保存位数
004023B4 > |8B45 F8 mov eax, dword ptr ; 读取位数
004023B7 . |3B45 0C cmp eax, dword ptr ; 是否解密到最后一位
004023BA . |73 16 jnb short 004023D2 ; 解密完成刚跳走
004023BC . |8B45 FC mov eax, dword ptr ; 取加密字符地址到eax
004023BF . |0345 F8 add eax, dword ptr ; 该位的ASCII值与位数进行与运算
004023C2 . |0FB600 movzx eax, byte ptr ; 按位取加密字符
004023C5 . |83F0 12 xor eax, 12 ; 该位的ASCII值与12H进行异或运算
004023C8 . |8B4D FC mov ecx, dword ptr
004023CB . |034D F8 add ecx, dword ptr
004023CE . |8801 mov byte ptr , al ; 保存该位加密后的值
004023D0 .^\EB DB jmp short 004023AD

  再F8往下跟踪几句,会看到这样的代码: 复制内容到剪贴板
  代码:
  004047D3 8D45 E0 lea eax, dword ptr 这里把解密后的明文地址放到eax里,我们执行命令d eax,嘿,看见好东西了,邮箱帐号,密码。到这里我们的分析也算结束了,用刚刚得到的邮箱帐号和密码登录上去,嘿,小样,你的邮箱归我喽,上面有1000+的QQ,这时突然想到这个盗号贼在盗号之前肯定会拿自己的号先测试一下什么的,我一直往前翻,终于在前面找到了这个盗号贼的密码,密码还挺让人郁闷的,“fuckmepahhyyou”,哎,真不知道这人怎么样想的,不管了,登上去看看。
页: [1]
查看完整版本: 一个QQ木马的分析