|
==================================================================================== 004A8060 push ebp 004A8061 mov ebp, esp 004A8063 sub esp, 8 004A8066 push offset loc_404806 004A806B mov eax, large fs0 004A8071 push eax 004A8072 mov large fs0, esp 004A8079 sub esp, 34h 004A807C push ebx 004A807D push esi 004A807E push edi 004A807F mov [ebp+var_8], esp 004A8082 mov [ebp+var_4], offset dword_403928 004A8089 mov ecx, [ebp+arg_0] ;A1 004A808C xor eax, eax 004A808E mov [ebp+var_2C], eax 004A8091 mov [ebp+var_40], eax 004A8094 mov [ebp+var_1C], eax 004A8097 mov eax, dword_4D1030 ;R1 004A809C push eax ;R1 004A809D push ecx ;A1 004A809E call sub_4A83F0 ; 004A80A3 mov edx, dword_4D1044 ;R2 004A80A9 mov [ebp+arg_0], eax ;M1 = invoke sub_4A83F0 ,A1,R1 004A80AC mov eax, [ebp+arg_4] ;A2 004A80AF push edx ;R2 004A80B0 push eax ;A2 004A80B1 call sub_4A83F0 ; 004A80B6 mov ecx, [ebp+arg_0] ;M1 004A80B9 mov edx, [ebp+arg_8] ;N1 004A80BC add edx, ecx ;M1+N1 004A80BE add ecx, ecx ;M1+M1 004A80C0 cmp ecx, edx ;M1+N1 =? M1+M1 等效为N1 =? M1 004A80C2 mov [ebp+arg_4], eax ;M2 = invoke sub_4A83F0 ,A2,R2 004A80C5 jnz short loc_4A80E6 004A80C7 mov edx, [ebp+arg_C] ;N2 004A80CA lea ecx, [eax+edx] ;M2+N2 004A80CD lea edx, [eax+eax] ;M2+M2 004A80D0 cmp ecx, edx ;M2+N2 =? M2+M2 等效为N2 =? M2 004A80D2 jnz short loc_4A80E6 004A80D4 mov [ebp+var_1C], 0FFFFFFFFh ;到这里置注册成功标志
=========================sub_4A8290====================================== 004A8290 push ebp 004A8291 mov ebp, esp 004A8293 sub esp, 8 004A8296 push offset loc_404806 004A829B mov eax, large fs0 004A82A1 push eax 004A82A2 mov large fs0, esp 004A82A9 sub esp, 70h 004A82AC push ebx 004A82AD push esi 004A82AE push edi 004A82AF mov [ebp+var_8], esp 004A82B2 mov [ebp+var_4], offset dword_403938 004A82B9 mov edx, [ebp+arg_0] ;5位的str,(都是WideChar) 004A82BC xor esi, esi 004A82BE lea ecx, [ebp+var_18] 004A82C1 mov [ebp+var_18], esi 004A82C4 mov [ebp+var_28], esi 004A82C7 mov [ebp+var_38], esi 004A82CA mov [ebp+var_48], esi 004A82CD mov [ebp+var_58], esi 004A82D0 call __vbaStrCopy 004A82D6 mov edi, 1 004A82DB mov [ebp+var_24], esi 004A82DE mov ebx, edi 004A82E0 mov esi, edi ;第n位WideChar 004A82E2 loc_4A82E2: 004A82E2 mov eax, 5 ;循环5次 004A82E7 cmp esi, eax 004A82E9 jg loc_4A839D 004A82EF lea ecx, [ebp+var_38] 004A82F2 push ecx 004A82F3 lea eax, [ebp+var_18] 004A82F6 push edi 004A82F7 lea edx, [ebp+var_58] 004A82FA mov [ebp+var_50], eax 004A82FD push edx 004A82FE lea eax, [ebp+var_48] 004A8301 push eax 004A8302 mov [ebp+var_30], 1 004A8309 mov [ebp+var_38], 2 004A8310 mov [ebp+var_58], 4008h 004A8317 call rtcMidCharVar 004A831D lea ecx, [ebp+var_48] ;取出一位WideChar 004A8320 push ecx 004A8321 lea edx, [ebp+var_28] 004A8324 push edx 004A8325 call __vbaStrVarVal 004A832B push eax 004A832C call rtcBytevalueBstr ; 004A8332 mov byte ptr [ebp+var_6C], al ;只保留WideChar的低字节 004A8335 mov eax, 5 004A833A sub eax, esi 004A833C mov [ebp+var_7C], eax ;5-n 004A833F fild [ebp+var_7C] 004A8342 sub esp, 8 004A8345 fstp [esp] 004A8348 push 40240000h ;浮点数10 004A834D push 0 004A834F call __vbaPowerR8 ;10^(5-n) 004A8355 mov eax, [ebp+var_6C] ;每位WideChar的低字节 004A8358 and eax, 0FFh 004A835D cdq 004A835E mov ecx, 0Ah 004A8363 idiv ecx 004A8365 mov [ebp+var_80], edx ;r = 每位WideChar的低字节mod 10 004A8368 fild [ebp+var_80] 004A836B fmulp st(1), st ;r*10^(5-n) 004A836D fiadd [ebp+var_24] ;循环相加 004A8370 call __vbaFpI4 004A8376 lea ecx, [ebp+var_28] 004A8379 mov [ebp+var_24], eax ;经5次循环后,H = r1*10^4+r2*10^3+r3*10^2+r4*10+r5 004A837C call __vbaFreeStr 004A8382 lea edx, [ebp+var_48] 004A8385 push edx 004A8386 lea eax, [ebp+var_38] 004A8389 push eax 004A838A push 2 004A838C call __vbaFreeVarList 004A8392 add esp, 0Ch 004A8395 inc edi 004A8396 add esi, ebx 004A8398 jmp loc_4A82E2 004A839D loc_4A839D: 004A839D waIT 004A839E push offset loc_4A83CC 004A83A3 jmp short loc_4A83C2 004A83A5 lea ecx, [ebp-28h] 004A83A8 call __vbaFreeStr 004A83AE lea ecx, [ebp-48h] 004A83B1 push ecx 004A83B2 lea edx, [ebp-38h] 004A83B5 push edx 004A83B6 push 2 004A83B8 call __vbaFreeVarList 004A83BE add esp, 0Ch 004A83C1 retn 004A83C2 loc_4A83C2: 004A83C2 lea ecx, [ebp+var_18] 004A83C5 call __vbaFreeStr 004A83CB retn 004A83CC loc_4A83CC: 004A83CC mov ecx, [ebp-10h] 004A83CF mov eax, [ebp-24h] ;返回值H 004A83D2 pop edi 004A83D3 pop esi 004A83D4 mov large fs0, ecx 004A83DB pop ebx 004A83DC mov esp, ebp 004A83DE pop ebp 004A83DF sub_4A8290 endp
=========================sub_4A83F0====================================== 004A83F0 sub_4A83F0 proc near 004A83F0 arg_0 = dword ptr 4 004A83F0 arg_4 = dword ptr 8 004A83F0 mov ecx, [esp+arg_0] 004A83F4 xor ecx, [esp+arg_4] 004A83F8 cmp ecx, 1869Fh ;99999 004A83FE jle short loc_4A8413 004A8400 mov eax, 66666667h 004A8405 imul ecx 004A8407 mov ecx, edx 004A8409 sar ecx, 2 004A840C mov eax, ecx 004A840E shr eax, 1Fh 004A8411 add ecx, eax 004A8413 loc_4A8413: 004A8413 cmp ecx, 2710h 004A8419 jge short loc_4A8421 004A841B add ecx, 2710h ;10000 004A8421 loc_4A8421: 004A8421 mov eax, ecx ;返回一个10000到99999之间的10进制5位数 004A8423 retn 8 004A8423 sub_4A83F0 endp ======================================================================================================
把上面过程可以整理成如下四个步骤:
====步骤1:========================================================================================== H1 = invoke sub_4A8290 ,str1 X1 = invoke sub_4A83F0 ,H1,9DB7h A1 = invoke sub_4A83F0 ,X1,[esi+48h] M1 = invoke sub_4A83F0 ,A1,R1 ====================================================================================================
====步骤2:========================================================================================== B1 = invoke sub_4A83F0 ,Y1,[esi+48h] N1 = invoke sub_4A83F0 ,B1,R1 ====================================================================================================
====步骤3:========================================================================================== H2 = invoke sub_4A8290 ,str2 X2 = invoke sub_4A83F0 ,H2,10A7Bh A2 = invoke sub_4A83F0 ,X2,[esi+4Ch] M2 = invoke sub_4A83F0 ,A2,R2 ====================================================================================================
====步骤4:========================================================================================== B2 = invoke sub_4A83F0 ,Y2,[esi+4Ch] N2 = invoke sub_4A83F0 ,B2,R2 ==================================================================================================== 注册成功的条件是:M1=N1,M2=N2 从而只要满足充分条件: (1)Y1=X1=invoke sub_4A83F0 ,H1,9DB7h 其中H1=invoke sub_4A8290 ,str1 str1=机器码第4到8位
(2)Y2=X2=invoke sub_4A83F0 ,H2,10A7Bh 其中H2=invoke sub_4A8290 ,str2 str2=(机器码的右3位+注册名)的右5位 =================================================================================================== 将Y1转换成10进制得到注册码的前5位 将Y2转换成10进制得到注册码的后5位 ===================================================================================================
总结:本注册算法并不复杂,只是VB的程序有些烦人,尤其是unicode字符看起来很不习惯 注册机比较容易做,由于我未曾编过WideChar的程序,开始时在WideChar的处理上遇到一点障碍, 无法注册中文用户名,经反复调试修改现已克服。 上一页 [1] [2] |