在试注册时,我们发现是重启验证型的,并且保存在注册表里:
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