一个木马查杀工具的注册算法分析

在试注册时,我们发现是重启验证型的,并且保存在注册表里:


00731D89     68 70AB4E00          push TrojanDo.004EAB70              ; UNICODE "RegValue"
00731D8E     68 54AB4E00          push TrojanDo.004EAB54              ; UNICODE "WingKavReg"
00731D93     68 E0A54E00          push TrojanDo.004EA5E0              ; UNICODE "Wing"

于是我们搜索UNICODE字符:RegValue
将找到的几个地方都下断。
重新载入,中断在:


007155E2    .  B8 04000280        mov eax,80020004
007155E7    .  68 70AB4E00        push TrojanDo.004EAB70              ;  regvalue
007155EC    .  890A               mov dword ptr ds:[edx],ecx
007155EE    .  8B4D 8C            mov ecx,dword ptr ss:[ebp-74]
007155F1    .  8945 90            mov dword ptr ss:[ebp-70],eax
007155F4    .  68 54AB4E00        push TrojanDo.004EAB54              ;  wingkavreg
007155F9    .  894A 04            mov dword ptr ds:[edx+4],ecx
007155FC    .  68 E0A54E00        push TrojanDo.004EA5E0              ;  wing

我们单步跟踪:
//===================================================
首先取出保存在注册表里的注册码


00715604    .  8B45 94            mov eax,dword ptr ss:[ebp-6C]
00715607    .  8942 0C            mov dword ptr ds:[edx+C],eax
0071560A    .  FF15 90114000      call dword ptr ds:[<&MSVBVM60.#689>>;  MSVBVM60.rtcGetSetting
00715610    .  8BD0               mov edx,eax  
      //此时Eax里的值就是我们输入的注册,然后复制一份到Ebx

将取出的注册码转成小写:


00715629    .  C745 88 08400000   mov dword ptr ss:[ebp-78],4008
00715630    .  FF15 3C104000      call dword ptr ds:[<&MSVBVM60.#518>>;  MSVBVM60.rtcLowerCaseVar

计算出机器码:


00715636    .  E8 65F90100        call TrojanDo.00734FA0
0071563B    .  8BD0               mov edx,eax
        //此时Eax里的值就是机器码,同样复制一份到Ebx

  
对机器码进行操作,其操作方法是就是将我们的机器码转成10进制数,然后再加上519,然后再次转换成字符串:


0071564D    .  DC05 48124000      fadd qword ptr ds:[401248]
      //注意此时的浮点寄存器,以及提示窗口
00715653    .  83EC 08            sub esp,8
00715656    .  DFE0               fstsw ax
00715658    .  A8 0D              test al,0D
0071565A    .  0F85 B6010000      jnz TrojanDo.00715816
00715660    .  DD1C24             fstp qword ptr ss:[esp]
00715663    .  FF15 F8104000      call dword ptr ds:[<&MSVBVM60.__vba>;  MSVBVM60.__vbaStrR8
00715669    .  8BD0               mov edx,eax

对上面得到字符串进行MD5加密:


00715677    .  51                 push ecx
00715678    .  E8 C3D80100        call TrojanDo.00732F40

结合我们PEid的算法分析插件得到的结果:


MD5 :: 00333CE2 :: 00733CE2    
  The reference is above.

以及此CALL(call TrojanDo.00732F40)返回的结果,

将MD5加密得到的字符串转小字格式:


00715686    .  52                 push edx
00715687    .  50                 push eax
00715688    .  C745 B8 08000000   mov dword ptr ss:[ebp-48],8
0071568F    .  FF15 3C104000      call dword ptr ds:[<&MSVBVM60.#518>>;  MSVBVM60.rtcLowerCaseVar

接下来,马上就进行了比较了,然后赋值标志位:


00715695    .  8D4D C8            lea ecx,dword ptr ss:[ebp-38]
00715698    .  8D55 A8            lea edx,dword ptr ss:[ebp-58]
0071569B    .  51                 push ecx
0071569C       52                 push edx
0071569D    .  FF15 C8104000      call dword ptr ds:[<&MSVBVM60.__vba>;  MSVBVM60.__vbaVarTstEq
007156A3    .  66:8985 70FFFFFF   mov word ptr ss:[ebp-90],ax
…………  …………  …………    
007156CE    .  83C4 1C            add esp,1C
007156D1    .  66:83BD 70FFFFFF 0>cmp word ptr ss:[ebp-90],0
007156D9    .  0F84 C3000000      je TrojanDo.007157A2

呵呵,简单的分析也就完了,算法也非常清晰的出来了:
MD5(机器码的10进制值+519),如图([color=#FF0000]负的机器码计算方法一样[/color]):

软件下载地址与简介见:http://bbs.7softs.com/read.php?tid=32139

发表评论