• 标 题:5-Or-More! v2.0a
  • 作 者:shitman  
  • 时 间:2002/07/12 07:42pm
  • 链 接:http://bbs.pediy.com

菜鸟教程,教你看最简单的注册算法
5-Or-More! v2.0a 这是一个很好玩的小游戏(见附件60k),寓教与乐,来解开它的秘密!!!

运行游戏填入用户名:shitman 假注册码:87654321 ctrl+n 调出trw2000 下bpx hmemcpy, g
回到游戏界面,点确定,被拦下,清断点 bc *  回到游戏 pmodule

0167:0040605F FF154C144100     CALL     `USER32!GetDlgItemTextA`
0167:00406065 6A10             PUSH     BYTE +10
0167:00406067 8D4DF0           LEA      ECX,[EBP-10]
0167:0040606A 51               PUSH     ECX
0167:0040606B 6882000000       PUSH     DWORD 82
0167:00406070 FF7508           PUSH     DWORD [EBP+08]
按F10几下到此*****(1)
0167:00406073 FF154C144100     CALL     `USER32!GetDlgItemTextA` *****(1)获取用户名
0167:00406079 8D4DB0           LEA      ECX,[EBP-50]
0167:0040607C 51               PUSH     ECX                    下 D ECX=shitman
0167:0040607D FF1560134100     CALL     `KERNEL32!lstrlenA`     获取用户名的长度
0167:00406083 85C0             TEST     EAX,EAX
0167:00406085 0F8489000000     JZ       NEAR 00406114        如EAX=0,说明用户名为空就跳去死了!我有用户名,所以不会跳去死^_^
0167:0040608B 8D45F0           LEA      EAX,[EBP-10]        
0167:0040608E 50               PUSH     EAX                 我输入的假注册码 D EAX=87654321
0167:0040608F FF1560134100     CALL     `KERNEL32!lstrlenA`获取注册码长度
0167:00406095 85C0             TEST     EAX,EAX
0167:00406097 747B             JZ       00406114            不为空,不会跳去死,会往下走
0167:00406099 8D45F0           LEA      EAX,[EBP-10]
0167:0040609C 50               PUSH     EAX                 EAX里放着我的假码:87654321
0167:0040609D E84EFEFFFF       CALL     00405EF0   ********(2)这里就是关键处了      
0167:004060A2 83C404           ADD      ESP,BYTE +04
0167:004060A5 85C0             TEST     EAX,EAX
0167:004060A7 746B             JZ       00406114     走到这里就会跳去死了,因为我输入的是不正确的注册码,在*****(2)的call 会验证我的87654321,肯定不通过,跳到下面去死了。所以要去******(2)中的CALL里看看,到目前我们都没看到正确注册码,说明注册码在这个CALL 里做文章。
0167:004060A9 8D45F0           LEA      EAX,[EBP-10]
0167:004060AC 8D4DB0           LEA      ECX,[EBP-50]
0167:004060AF 50               PUSH     EAX
0167:004060B0 51               PUSH     ECX
0167:004060B1 E87FFEFFFF       CALL     00405F35
0167:004060B6 83C408           ADD      ESP,BYTE +08
0167:004060B9 85C0             TEST     EAX,EAX
0167:004060BB 7449             JZ       00406106
0167:004060BD 6A40             PUSH     BYTE +40
0167:004060BF 68ACD34000       PUSH     DWORD 0040D3AC
0167:004060C4 6864D94000       PUSH     DWORD 0040D964
0167:004060C9 FF7508           PUSH     DWORD [EBP+08]
0167:004060CC FF1538144100     CALL     `USER32!MessageBoxA`
0167:004060D2 C705F0E940000100+MOV      DWORD [0040E9F0],01
0167:004060DC A1C4E94000       MOV      EAX,[0040E9C4]
0167:004060E1 50               PUSH     EAX
0167:004060E2 E87DCFFFFF       CALL     00403064
0167:004060E7 83C404           ADD      ESP,BYTE +04
0167:004060EA A1A0FA4000       MOV      EAX,[0040FAA0]
0167:004060EF 6A00             PUSH     BYTE +00
0167:004060F1 68449C0000       PUSH     DWORD 9C44
0167:004060F6 50               PUSH     EAX
0167:004060F7 FF15B0144100     CALL     `USER32!GetMenu`
0167:004060FD 50               PUSH     EAX
0167:004060FE FF15B8144100     CALL     `USER32!DeleteMenu`
0167:00406104 EB23             JMP      SHORT 00406129
0167:00406106 6A30             PUSH     BYTE +30
0167:00406108 68ACD34000       PUSH     DWORD 0040D3AC
0167:0040610D 684CD94000       PUSH     DWORD 0040D94C
0167:00406112 EB0C             JMP      SHORT 00406120
0167:00406114 6A30             PUSH     BYTE +30        **************去死的
0167:00406116 68ACD34000       PUSH     DWORD 0040D3AC
0167:0040611B 6834D94000       PUSH     DWORD 0040D934                地方在这
0167:00406120 FF7508           PUSH     DWORD [EBP+08]
0167:00406123 FF1538144100     CALL     `USER32!MessageBoxA`**********出错的对话框

                                 算法段
0167:0040609D E84EFEFFFF       CALL     00405EF0   ********(2)按F8跟进上面的这个关键对比call里
来到以下代码段:
0167:00405EF0 8B442404         MOV      EAX,[ESP+04]   将87654321假码所在地址给EAX
0167:00405EF4 85C0             TEST     EAX,EAX
0167:00405EF6 743A             JZ       00405F32        测试EAX不为0,不会去死。

以下是比较注册码过程(最最简单的非明码比较)如果不看这里,你是无法得到正确的注册码!!!!!

0167:00405EF8 803831           CMP      BYTE [EAX],31     比较第一位注册码是否是31即  1
0167:00405EFB 7535             JNZ      00405F32          到这里就不要往下按F10了,否则你去死了
0167:00405EFD 80780136         CMP      BYTE [EAX+01],36 比较第二位注册码是否是36即  6
0167:00405F01 752F             JNZ      00405F32
0167:00405F03 80780231         CMP      BYTE [EAX+02],31                              1
0167:00405F07 7529             JNZ      00405F32
0167:00405F09 80780333         CMP      BYTE [EAX+03],33                              3
0167:00405F0D 7523             JNZ      00405F32  
0167:00405F0F 80780435         CMP      BYTE [EAX+04],35                              5
0167:00405F13 751D             JNZ      00405F32
0167:00405F15 80780535         CMP      BYTE [EAX+05],35                              5
0167:00405F19 7517             JNZ      00405F32
0167:00405F1B 80780631         CMP      BYTE [EAX+06],31                              1
0167:00405F1F 7511             JNZ      00405F32
0167:00405F21 80780730         CMP      BYTE [EAX+07],30                              0
0167:00405F25 750B             JNZ      00405F32
0167:00405F27 80780800         CMP      BYTE [EAX+08],00   第九位没了就完成任务
0167:00405F2B B801000000       MOV      EAX,01              置EAX=1
0167:00405F30 7402             JZ       00405F34           跳到返回ret成功了!!!!!
0167:00405F32 33C0             XOR      EAX,EAX   *******EAX=0上面的任意一个jnz 跳到这,你就完蛋
0167:00405F34 c3               Ret

考,注册信息不在注册表里,而在windows/5ormore.ini 里,我在注册表里找了半天。
[Settings]
Options=03C223C2430303C2630303C21313
MoreOptions=73C203C203C203
SN=1363133353531303
Name=5D5C1D9ABC9C
Time=64279602A457C6021323021313A33313A313130223030323A0

来看看sn 注册码的格式吧:从后往前 30 31 35 35 33 31 36 31 这是在跟踪时
的对比码16进制的,对应的字符为:01553161,既是注册码的反向16135510。
注册名:name 对应的是十六进制码 把这些信息删除,就成未注册版了^_^^_^。
总结:跟用户名无关,固定的注册码:16135510
这是本人第一次写教程,很菜,不过写这点东西也把我累坏了,恳请高手指教。
                               
请保留文章完整,谢谢。shitman 2002,7.