在文件一开始就是一个CALL,跟踪发现的确是取文件的创建时间,系统时间等,这很可能是VC2005的某个特征,亦或是作者故意这么做来迷惑大家的么,还是用于反调试的某个手段,这不得而知,如有高手知晓,还望直言。
中午又仔细分析了一下,已经得到算法:在关键算法处并没有发现取文件创建时间的部分,可能是你记成另外一个CM了吧。以下是个人的分析,请大侠们批评指正,本人虚心接受。
现公布算法一部分如下:
004018F6 |. E8 95FEFFFF call 00401790 ; x=MAC地址前8位。如,MAC地址为 00-16-EC-B4-01-A9,则 x=B4EC1600
004018FB |. 8BF8 mov edi, eax
004018FD |. E8 0EFDFFFF call 00401610 ; y=CPUID(eax=1)时edx的值
00401902 |. 8BF0 mov esi, eax
00401904 |. E8 B7FDFFFF call 004016C0 ; z=C盘序列号
00401909 |. 56 push esi ; y
0040190A |. 57 push edi ; x
0040190B |. 8BD0 mov edx, eax ; edx=z
0040190D |. E8 2EFFFFFF call 00401840 ; x,y按位相加取其补码
00401912 |. 83C4 08 add esp, 8
00401915 |. 52 push edx ; z
00401916 |. 56 push esi ; y
00401917 |. 8BF8 mov edi, eax ; 将x变换结果设为m保存到edi
00401919 |. E8 22FFFFFF call 00401840 ; 对z进行同样的变换设为n
0040191E |. 83C4 08 add esp, 8
00401921 |. 50 push eax ; n
00401922 |. 57 push edi ; m
00401923 |. E8 58FFFFFF call 00401880 ; t= (0xff | m) | n,则t就是最后的结果
先来分析一下call 00401880 :
00401880 /$ 0FB70D 3A2A44>movzx ecx, word ptr [442A3A] ; 0xFF
00401887 |. 0FB705 4C2A44>movzx eax, word ptr [442A4C] ; 0x65
0040188E |. 0FB715 522A44>movzx edx, word ptr [442A52] ; 0xFF
00401895 |. 0BC1 or eax, ecx ; EAX |=ECX=0xFF
00401897 |. 0FB70D 382A44>movzx ecx, word ptr [442A38] ; ECX=0x75
0040189E |. 0BC2 or eax, edx
004018A0 |. 0BC1 or eax, ecx
004018A2 |. 0B4424 04 or eax, dword ptr [esp+4] ; EAX=0xFF | 参数1
004018A6 |. 0B4424 08 or eax, dword ptr [esp+8] ; EAX=EAX | 参数2
004018AA \. C3 retn
分析结果就是结果 EAX = (0XFF | 参数1) | 参数2;
再来看其中最关键CALL
call 00401840 //这个CALL对上面的MAC地址,CPUID信息以及C盘序列号进行相应的计算,统计1下,被调用了2次:(设x为参数1,y为参数2)
00401840 /$ 8B4424 04 mov eax, dword ptr [esp+4] ; x
00401844 |. 8B4C24 08 mov ecx, dword ptr [esp+8] ; y
00401848 |. 894424 04 mov dword ptr [esp+4], eax
0040184C |. 006C24 05 add byte ptr [esp+5], ch ; [ESP+5]=x的低16位的高8位=y的低16位中的高8位+x的低16位的高8位
00401850 |. 02C1 add al, cl ; al=x低16位的低8位+y低16位低8位
00401852 |. 8A4C24 0B mov cl, byte ptr [esp+B] ; CL=y的高8位
00401856 |. 004C24 07 add byte ptr [esp+7], cl ; [esp+7]=x的高8位+=CL
0040185A |. 884424 04 mov byte ptr [esp+4], al ; [ESP+4]=x的低8位=AL
0040185E |. 8A4424 0A mov al, byte ptr [esp+A] ; al=y高16位中的低8位
00401862 |. 004424 06 add byte ptr [esp+6], al ; [ESP+6]=x高16位中的低8位+=al
00401866 |. 8B4424 04 mov eax, dword ptr [esp+4] ; eax=经过变换的x
0040186A |. F7D0 not eax
0040186C |. 83C0 01 add eax, 1 ; eax=x的补码
0040186F |. A3 0C564400 mov dword ptr [44560C], eax ; 保存结果
00401874 \. C3 retn
分析此CALL,发现是1个按位相加的运算,图示如下:
设参数1为X, 参数2为Y
X:aaaaaaaa bbbbbbbb cccccccc dddddddd (每个字母代表1个数位)
Y:AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD (每个字母代表1个数位)
那么,经过此CALL变换相加以后,X就为:
X: (aaaaaaaa+AAAAAAAA) (bbbbbbbb+BBBBBBBB) (cccccccc+CCCCCCCC)(dddddddd+DDDDDDDD)
说白了,“按位相加,去掉进位!最后再求补!”
从这里,我们不难得到其注册算法,并制造注册机来。