算法过程是这样的:
00401A1A E8 6F030000 call <jmp.&MFC42D.#3174> ;这里即为调用GetWindowText
00401A1F 8D4D E8 lea ecx,dword ptr ss:[ebp-18] ;返回到这里
00401A22 51 push ecx
00401A23 8B4D F0 mov ecx,dword ptr ss:[ebp-10]
00401A26 81C1 A0000000 add ecx,0A0
00401A2C E8 5D030000 call <jmp.&MFC42D.#3174> ;这里是获得输入的注册码
00401A31 8D4D EC lea ecx,dword ptr ss:[ebp-14]
00401A34 E8 4F030000 call <jmp.&MFC42D.#880>
00401A39 8BF4 mov esi,esp
00401A3B 50 push eax
00401A3C FF15 30764100 call dword ptr ds:[<&MSVCRTD.atoi>] ; MSVCRTD.atoi
上面是将用户名123456符串转化为数字
00401A42 83C4 04 add esp,4
00401A45 3BF4 cmp esi,esp
00401A47 E8 4E030000 call <jmp.&MSVCRTD._chkesp>
00401A4C 8D9400 712D0100 lea edx,dword ptr ds:[eax+eax+12D71] ;edx=用户名+用户名+0x12d71
00401A53 8955 E4 mov dword ptr ss:[ebp-1C],edx ;[ebp-1c]=edx
00401A56 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
00401A59 E8 2A030000 call <jmp.&MFC42D.#880>
00401A5E 8BF4 mov esi,esp
00401A60 50 push eax
00401A61 FF15 30764100 call dword ptr ds:[<&MSVCRTD.atoi>] ; MSVCRTD.atoi
这里是将输入的注册码输化为数字
00401A67 83C4 04 add esp,4
00401A6A 3BF4 cmp esi,esp
00401A6C E8 29030000 call <jmp.&MSVCRTD._chkesp>
00401A71 99 cdq
00401A72 B9 0A000000 mov ecx,0A
00401A77 F7F9 idiv ecx ;把输入的注册码除以10
00401A79 05 40E20100 add eax,1E240 ;得到的结果再加1E240
00401A7E 8945 E0 mov dword ptr ss:[ebp-20],eax ;将此时得到的结果给[ebp-20]
00401A81 8B55 E4 mov edx,dword ptr ss:[ebp-1C] ;将用用户名计算得到的真实注册码给EDX
00401A84 3B55 E0 cmp edx,dword ptr ss:[ebp-20] ;将我们输入的假注册码计算得到的结果与EDX比较
00401A87 75 10 jnz short 4x.00401A99 ;如果不相等则跳到错误代码处.否则显示注册成功.
至此算法分析完毕.这关的注册码比较为:
用户名+用户名+0x12d71=注册码/10+0x1E240
所以真实的注册算法应该为
(用户名+用户名+0x12d71-0x1E240)*10=真实注册码
这一关的过关要求用户名为123456,所以真实注册码为(123456+123456-+0x12d71-0x1E240)*10==2006250
所以这一关的过关KEY为2006250, 输入后成功进入第五关.
我在我自己的博客上写了详细的过程,也有前面几关的过程,这个游戏总共十关.我会陆续把过程写在自己博客上.有兴趣的话可以去看看.
http://www.duku123.com/upload/?uid-1-action-viewspace-itemid-216