我是菜鸟,前来献丑了。
00452D95 E86EFCFAFF call 00402A08 取输入的注册码长度
00452D9A C6862503000000 mov byte ptr [esi+$0325], $00
00452DA1 8A9614030000 mov dl, byte ptr [esi+$0314]
00452DA7 84D2 test dl, dl
00452DA9 763A jbe 00452DE5
00452DAB B001 mov al, $01
00452DAD 8BF8 mov edi, eax
00452DAF 81E7FF000000 and edi, $000000FF
00452DB5 8A8C3E14030000 mov cl, byte ptr [esi+edi+$0314] 这一部分是把注册码中的数字部分提取出来
00452DBC 80C1D0 add cl, $D0 提取出来的数字部分还存放在原来的注册码位置
00452DBF 80E90A sub cl, $0A
00452DC2 731C jnb 00452DE0
00452DC4 FE8625030000 inc byte ptr [esi+$0325]
00452DCA 8A8C3E14030000 mov cl, byte ptr [esi+edi+$0314]
00452DD1 33DB xor ebx, ebx
00452DD3 8A9E25030000 mov bl, byte ptr [esi+$0325]
00452DD9 888C1E14030000 mov [esi+ebx+$0314], cl
00452DE0 40 inc eax
00452DE1 FECA dec dl
00452DE3 75C8 jnz 00452DAD
00452DE5 33C0 xor eax, eax
00452DE7 8A8614030000 mov al, byte ptr [esi+$0314]
00452DED 8A840614030000 mov al, byte ptr [esi+eax+$0314]
00452DF4 2C58 sub al, $58
00452DF6 7404 jz 00452DFC
00452DF8 2C20 sub al, $20
00452DFA 7509 jnz 00452E05
00452DFC C686260300000A mov byte ptr [esi+$0326], $0A
00452E03 EB17 jmp 00452E1C
00452E05 33C0 xor eax, eax
00452E07 8A8625030000 mov al, byte ptr [esi+$0325] 取最后一个数字
00452E0D 8A840614030000 mov al, byte ptr [esi+eax+$0314]
00452E14 2C30 sub al, $30 其ASCII码减去$30为其数字值,保存在结果1中
00452E16 888626030000 mov [esi+$0326], al
00452E1C 8A8625030000 mov al, byte ptr [esi+$0325] 取注册码中数字的个数
00452E22 888614030000 mov [esi+$0314], al 将注册码按照这个长度重新设置
00452E28 C6862703000000 mov byte ptr [esi+$0327], $00
00452E2F 8A9625030000 mov dl, byte ptr [esi+$0325] 再取注册码中数字的个数
00452E35 4A dec edx
00452E36 84D2 test dl, dl
00452E38 761F jbe 00452E59 如果小于或者等于1,则跳转结束
00452E3A B001 mov al, $01 下面这段比较好理解
00452E3C 33C9 xor ecx, ecx 写成DELPHI语言就是Result:=Result+Num(i)*i
00452E3E 8AC8 mov cl, al 其中Num(i)为注册码中的第i个数字值
00452E40 8A8C0E14030000 mov cl, byte ptr [esi+ecx+$0314] 结果保存在结果2中
00452E47 80E930 sub cl, $30 i只循环到最大长度减1,也就是最后一个数字不参与运算。
00452E4A 660FAFC8 imul cx, ax
00452E4E 008E27030000 add [esi+$0327], cl
00452E54 40 inc eax
00452E55 FECA dec dl
00452E57 75E3 jnz 00452E3C
00452E59 33C0 xor eax, eax
00452E5B 8A8627030000 mov al, byte ptr [esi+$0327] 结果2除以$3E7取余数,结果保存在edx中
00452E61 B9E7030000 mov ecx, $000003E7
00452E66 33D2 xor edx, edx
00452E68 F7F1 div ecx
00452E6A 33C0 xor eax, eax
00452E6C 8A8626030000 mov al, byte ptr [esi+$0326]
00452E72 3BD0 cmp edx, eax edx的值和结果1(也就是最后一个数字值)比较,相等则注册成功。
00452E74 750F jnz 00452E85
00452E76 B201 mov dl, $01
因此,注册码就很容易写了,先写前面几位:
比如111,第4位就是1+1*2+1*3=6,注册码为1116。
前几位是1023,1+0*2+2*3+3*4=19,第5位没法写了,这个注册不成功!
数字之间随便写其它的字母,比如sds1sfhj1dff3和113都能注册成功。
至于用户名,压根就是个摆设。