• 标 题:简单算法之贪吃豆豆龙
  • 作 者:loveboom
  • 时 间:2003年8月22日 09:21
  • 链 接:http://bbs.pediy.com

软件大小:  152 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 益智游戏
应用平台:  Win9x/NT/2000/XP
界面预览:  无
下载地址:http://www.skycn.net/soft/13584.html
软件简介:
贪吃豆豆龙是一款值得珍藏的经典游戏,它是传统贪吃蛇游戏的全新升级,并支持乐趣无穷的双人对战!本次发行的2.0版本较上一版本有了大幅度的改进.1.全新的游戏界面 2.增加排行榜功能 3.更加科学的计分方式 4.级别分数实时显示 5.菜单设置游戏速度 6.可改变地图尺寸 7.豆豆龙的颜色可由玩家自己选择 8.输入注册码自动注册。
工具:0llydbg1.09d汉化版,peid 0.9(因为跟踪时比较简单所以也就不用w32dasm)
假码:77585201314
机器码:84940800
用peid0.9发现它是用c写的。
开始下断点getdlgitemtexta,有两处调用,正确的是在第一个下断,好了,断下来到这里
00403AE6   . FF15 34B14000   CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>; GetDlgItemTextA
00403AEC   . 68 98E94000     PUSH DDL.0040E998                        ;  ASCII "77585201314"
00403AF1   . E8 9AF7FFFF     CALL DDL.00403290
00403AF6   . 83C4 04         ADD ESP,4
00403AF9   . E8 02F8FFFF     CALL DDL.00403300  '这里就是传说中的关键处按F8切入
00403AFE   . 803D 7CEF4000 0>CMP BYTE PTR DS:[40EF7C],1
00403B05   . 75 44           JNZ SHORT DDL.00403B4B '这里一跳就 Game over,改成JZ 00403B4B就暴破
00403B07   . E8 14FFFFFF     CALL DDL.00403A20
00403B0C   . A1 B8E74000     MOV EAX,DWORD PTR DS:[40E7B8]
上面那个call 进入后就到了这里:
00403300  /$ 83EC 2C         SUB ESP,2C
00403303  |. A0 80EF4000     MOV AL,BYTE PTR DS:[40EF80]
00403308  |. 57              PUSH EDI
00403309  |. 884424 10       MOV BYTE PTR SS:[ESP+10],AL
0040330D  |. B9 07000000     MOV ECX,7
00403312  |. 33C0            XOR EAX,EAX
00403314  |. 8D7C24 11       LEA EDI,DWORD PTR SS:[ESP+11]
00403318  |. F3:AB           REP STOS DWORD PTR ES:[EDI]
0040331A  |. 8D4C24 04       LEA ECX,DWORD PTR SS:[ESP+4]
0040331E  |. C74424 04 00000>MOV DWORD PTR SS:[ESP+4],0
00403326  |. 51              PUSH ECX                                 ; /pHandle
00403327  |. 68 D4C44000     PUSH DDL.0040C4D4                        ; |Subkey = "SoftwareDdl"
0040332C  |. 68 01000080     PUSH 80000001                            ; |hKey = HKEY_CURRENT_USER
00403331  |. C74424 18 1E000>MOV DWORD PTR SS:[ESP+18],1E             ; |
00403339  |. AA              STOS BYTE PTR ES:[EDI]                   ; |
0040333A  |. FF15 08B04000   CALL DWORD PTR DS:[<&ADVAPI32.RegCreateK>; RegCreateKeyA
00403340  |. 85C0            TEST EAX,EAX
00403342  |. 5F              POP EDI
00403343  |. 75 79           JNZ SHORT DDL.004033BE
00403345  |. 8B4C24 00       MOV ECX,DWORD PTR SS:[ESP]
00403349  |. 8D5424 08       LEA EDX,DWORD PTR SS:[ESP+8]
0040334D  |. 8D4424 0C       LEA EAX,DWORD PTR SS:[ESP+C]
00403351  |. 52              PUSH EDX                                 ; /pBufSize
00403352  |. 50              PUSH EAX                                 ; |Buffer
00403353  |. 6A 00           PUSH 0                                   ; |pValueType = NULL
00403355  |. 6A 00           PUSH 0                                   ; |Reserved = NULL
00403357  |. 68 CCC44000     PUSH DDL.0040C4CC                        ; |ValueName = "RegID"
0040335C  |. 51              PUSH ECX                                 ; |hKey
0040335D  |. FF15 00B04000   CALL DWORD PTR DS:[<&ADVAPI32.RegQueryVa>; RegQueryValueExA
00403363  |. 85C0            TEST EAX,EAX
00403365  |. 75 57           JNZ SHORT DDL.004033BE
00403367  |. 8B5424 00       MOV EDX,DWORD PTR SS:[ESP]
0040336B  |. 52              PUSH EDX                                 ; /hKey
0040336C  |. FF15 04B04000   CALL DWORD PTR DS:[<&ADVAPI32.RegCloseKe>; RegCloseKey
00403372  |. 6A 0A           PUSH 0A                                  ; /pFileSystemNameSize = 0000000A
00403374  |. 6A 00           PUSH 0                                   ; |pFileSystemNameBuffer = NULL
00403376  |. 6A 00           PUSH 0                                   ; |pFileSystemFlags = NULL
00403378  |. 8D4424 10       LEA EAX,DWORD PTR SS:[ESP+10]            ; |
0040337C  |. 6A 00           PUSH 0                                   ; |pMaxFilenameLength = NULL
0040337E  |. 50              PUSH EAX                                 ; |pVolumeSerialNumber
0040337F  |. 6A 0C           PUSH 0C                                  ; |MaxVolumeNameSize = C (12.)
00403381  |. 6A 00           PUSH 0                                   ; |VolumeNameBuffer = NULL
00403383  |. 68 E4C44000     PUSH DDL.0040C4E4                        ; |RootPathName = "c:"
00403388  |. FF15 A4B04000   CALL DWORD PTR DS:[<&KERNEL32.GetVolumeI>; GetVolumeInformationA '看到了这里就有希望了,离成功不远了,取c盘的序列号
我的是492576481也就是十六进制的1D5C1EE1
0040338E  |. 8B4C24 04       MOV ECX,DWORD PTR SS:[ESP+4] '这里就是把1D5C1EE1入ECX
00403392  |. 8D5424 0C       LEA EDX,DWORD PTR SS:[ESP+C] '假注册码77585201314将会到EDX中
00403396  |. 81E1 10789207   AND ECX,7927810 '这里用序列号1D5C1EE1加上7927810
0040339C  |. 52              PUSH EDX'假注册码入栈
0040339D  |. 81F1 92078107   XOR ECX,7810792 '这里ECX=1D5C1EE1+7927810=05101800
004033A3  |. 894C24 08       MOV DWORD PTR SS:[ESP+8],ECX '这里ecx=05101800 xor 7810792=02911f92
004033A7  |. E8 28140000     CALL DDL.004047D4
004033AC  |. 8B4C24 08       MOV ECX,DWORD PTR SS:[ESP+8]
004033B0  |. 83C4 04         ADD ESP,4
004033B3  |. 3BC1            CMP EAX,ECX '这里用假注册码和0291f92比较如果相等就注册成功
004033B5  |. 75 07           JNZ SHORT DDL.004033BE '这里也是暴破点
004033B7  |. C605 7CEF4000 0>MOV BYTE PTR DS:[40EF7C],1
004033BE  |> 33C0            XOR EAX,EAX
004033C0  |. 83C4 2C         ADD ESP,2C
004033C3  . C3              RETN
最后得出正确的注册码就是0291f92的十进制43065234
总结:它那个机器码是用于作者得到你的c盘序列号,我们可以不用管它.
算法:注册码=(c盘序列号+7927810)xor 7810792