• 标 题:NS-TOWER 2.5
  • 作 者:ShenGe
  • 时 间:2003/05/18 03:19pm
  • 链 接:http://bbs.pediy.com

软件名称 NS-TOWER 
软件版本 2.5 
软件类别 娱乐游戏 
应用平台 WIN9X/WINNT/WIN2K/WINXP 
授权形式 共享 
软件评级 ★★★★☆  
下载次数 660  
汉化作者 seeker  
上传日期 2003-5-12  

破解工具:OllyDbg1.09
破解难度:易
作者声明:初学破解,欢迎交流!

软件下载:http://www.hanzify.org/download.asp?SOFT_ID=7168&SITE=1
软件说明:
“是高手就上到100层”英文名为:NS-TOWER。是和“是高手就下100层”相对的很有意思的小游戏。游戏的目的是爬上城堡。按住空格键或鼠标左键来蓄力,松开就会跳起来。你按住的越久就跳的越高,但是不要按住太久,那样力量会恢复到零。前五名的玩家名字将被记录下来。

任意填入用户名ShenGe和注册码1234567,用断点GetDlgItemTextA下断,很快可看到如下代码:

00402FDB   CALL    DWORD PTR DS:[<&USER32.GetDlgIte>; \GetDlgItemTextA
                  <---取输入的假码
00402FE1   LEA     EAX, DWORD PTR SS:[EBP-204]
00402FE7   PUSH    EAX
                  <---EAX="abcdefg"
00402FE8   CALL    NSTOWER.004031AD
                  <---关键的验证Call,跟进!
00402FED   ADD     ESP, 4
00402FF0  TEST    EAX, EAX
00402FF2  JNZ     NSTOWER.0040302F
00402FF8  PUSH    100                              ; /Count = 100 (256.)
00402FFD  LEA     EAX, DWORD PTR SS:[EBP-104]      ; |
00403003  PUSH    EAX                              ; |Buffer = 00000001
00403004  PUSH    4                                ; |RsrcID = STRING "注册码"
00403006  MOV     EAX, DWORD PTR DS:[40D298]       ; |
0040300B  PUSH    EAX                              ; |hInst = 00000001
0040300C  CALL    DWORD PTR DS:[<&USER32.LoadStrin>; \LoadStringA
00403012  PUSH    10                               ; /style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00403014  PUSH    NSTOWER.0040C26C                 ; |Title = "NS-TOWER"
00403019  LEA     EAX, DWORD PTR SS:[EBP-104]      ; |
0040301F  PUSH    EAX                              ; |Text = 00000001 ???
00403020  MOV     EAX, DWORD PTR SS:[EBP+8]        ; |
00403023  PUSH    EAX                              ; |hOwner = 00000001
00403024  CALL    DWORD PTR DS:[<&USER32.MessageBo>; \MessageBoxA
                 <---出错对话框
0040302A  JMP     NSTOWER.00403070
0040302F  PUSH    100                                      ; /Count = 100 (256.)
00403034  MOV     EAX, DWORD PTR SS:[EBP-4]                ; |
00403037  ADD     EAX, 10                                  ; |
0040303A  PUSH    EAX                                      ; |Buffer = 00000001
0040303B  PUSH    3EA                                      ; |ControlID = 3EA (1002.)
00403040  MOV     EAX, DWORD PTR SS:[EBP+8]                ; |
00403043  PUSH    EAX                                      ; |hWnd = 00000001
跟进关键的验证Call:
004031AD  PUSH    EBP
004031AE  MOV     EBP, ESP
004031B0  SUB     ESP, 4
004031B3  PUSH    EBX
004031B4  PUSH    ESI
004031B5  PUSH    EDI
004031B6  MOV     EAX, DWORD PTR SS:[EBP+8]
004031B9  XOR     ECX, ECX
004031BB  MOV     CL, BYTE PTR DS:[EAX+7]
                 <---取注册码第8位.其实这段是判断注册码是否为7位,
                     若不为7位则Game Over!
004031BE  TEST    ECX, ECX
                 <---关键比较1
004031C0  JE      NSTOWER.004031CD
004031C6  XOR     EAX, EAX
004031C8  JMP     NSTOWER.00403312
                 <---走到这就完了
004031CD  MOV     DWORD PTR SS:[EBP-4], 0
                 <---[EBP-4]=0
004031D4  JMP     NSTOWER.004031DC
004031D9  INC     DWORD PTR SS:[EBP-4]
                 <---[EBP-4]作循环控制计数器
004031DC  CMP     DWORD PTR SS:[EBP-4], 7
004031E0  JGE     NSTOWER.00403211
004031E6  MOV     EAX, DWORD PTR SS:[EBP-4]
                 <---EAX=0
004031E9  MOV     ECX, DWORD PTR SS:[EBP+8]
                 <---ECX="abcdefg"
004031EC  MOV     AL, BYTE PTR DS:[EAX+ECX]
                 <---取注册码第1位,61
004031EF  PUSH    EAX
004031F0  CALL    NSTOWER.00403317
                 <---此Call对数进行转换,跟进看看
004031F5  ADD     ESP, 4
004031F8  XOR     ECX, ECX
004031FA  MOV     CL, AL
                 <---CL=A
004031FC  CMP     ECX, 24
                 <---判断输入的是否合法字符
004031FF  JLE     NSTOWER.0040320C
00403205  XOR     EAX, EAX
                 <---置标志位EAX=0
00403207  JMP     NSTOWER.00403312
                 <---可别走到这儿!
0040320C  JMP     NSTOWER.004031D9
00403211  MOV     EAX, DWORD PTR SS:[EBP+8]
00403214  MOV     AL, BYTE PTR DS:[EAX+5]
                 <---取注册码第6位
00403217  PUSH    EAX
00403218  CALL    NSTOWER.00403317
                 <---AL=6
0040321D  ADD     ESP, 4
00403220  XOR     EBX, EBX
00403222  MOV     BL, AL  <---BL=6
00403224  MOV     EAX, DWORD PTR SS:[EBP+8]
00403227  MOV     AL, BYTE PTR DS:[EAX+2]
                 <---取注册码第3位
0040322A  PUSH    EAX
0040322B  CALL    NSTOWER.00403317
                 <---AL=3
00403230  ADD     ESP, 4
00403233  XOR     ECX, ECX <---ECX清0
00403235  MOV     CL, AL   <---CL=3
00403237  MOV     ESI, 24
0040323C  LEA     EAX, DWORD PTR DS:[ECX+EBX*2+1C]
                 <---EBX、ECX分别为注册码第6、3位转换后的值
00403240  CDQ     EAX=3+6*2+1C=2B
00403241  IDIV    ESI   <---ESI=24
00403243  MOV     EBX, EDX
                 <---EDX中为余数值7
00403245  MOV     EAX, DWORD PTR SS:[EBP+8]
00403248  MOV     AL, BYTE PTR DS:[EAX]
                 <---取注册码第1位
0040324A  PUSH    EAX
0040324B  CALL    NSTOWER.00403317
                 <---AL=1
00403250  ADD     ESP, 4
00403253  XOR     ECX, ECX
00403255  MOV     CL, AL  <--CL=1
00403257  CMP     EBX, ECX
                 <---关键比较2,由此可得注册码第1位应为7,后面按此值运算
00403259  JNZ     NSTOWER.0040330B <--千万别跳
0040325F  MOV     EAX, DWORD PTR SS:[EBP+8]
00403262  MOV     AL, BYTE PTR DS:[EAX+4]
                 <---取注册码第5位
00403265  PUSH    EAX
00403266  CALL    NSTOWER.00403317
                 <---AL=5
0040326B  ADD     ESP, 4
0040326E  XOR     EBX, EBX
00403270  MOV     BL, AL  <---BL=5
00403272  MOV     EAX, DWORD PTR SS:[EBP+8]
00403275  MOV     AL, BYTE PTR DS:[EAX+1]
                 <---取注册码第2位
00403278  PUSH    EAX
00403279  CALL    NSTOWER.00403317
                 <---AL=2
0040327E  ADD     ESP, 4
00403281  XOR     ECX, ECX
00403283  MOV     CL, AL  <---CL=2
00403285  MOV     ESI, 24
                 <---ESI=24
0040328A  LEA     EAX, DWORD PTR DS:[ECX+EBX*2+1C]
                 <---ECX、EBX分别为注册码第2、5位转换后的值
0040328E  CDQ         EAX=2+5*2+1C=28  
0040328F  IDIV    ESI
00403291  MOV     EBX, EDX
                 <---EDX中为余数值4
00403293  MOV     EAX, DWORD PTR SS:[EBP+8]
00403296  MOV     AL, BYTE PTR DS:[EAX+6]
                 <---取注册码第7位
00403299  PUSH    EAX
0040329A  CALL    NSTOWER.00403317
                 <---AL=7
0040329F  ADD     ESP, 4
004032A2  XOR     ECX, ECX
004032A4  MOV     CL, AL  <---CL=7
004032A6  CMP     EBX, ECX
                 <---关键判断3,由此可得注册码第7位为4,后面依此值运算
004032A8  JNZ     NSTOWER.0040330B
004032AE  MOV     EAX, DWORD PTR SS:[EBP+8]
004032B1  MOV     AL, BYTE PTR DS:[EAX+6]
                 <---取注册码第7位
004032B4  PUSH    EAX
004032B5  CALL    NSTOWER.00403317
                 <---AL=4
004032BA  ADD     ESP, 4
004032BD  XOR     EBX, EBX
004032BF  MOV     BL, AL   <---BL=4
004032C1  MOV     EAX, DWORD PTR SS:[EBP+8]
004032C4  MOV     AL, BYTE PTR DS:[EAX]
                 <---取注册码第1位
004032C6  PUSH    EAX
004032C7  CALL    NSTOWER.00403317
                 <---AL=7
004032CC  ADD     ESP, 4
004032CF  XOR     ECX, ECX
004032D1  MOV     CL, AL  <---CL=7
004032D3  MOV     ESI, 24
004032D8  LEA     EAX, DWORD PTR DS:[ECX+EBX*2+1C]
                 <---ECX、EBX分别为注册码第1、7位转换后的值
004032DC  CDQ          EAX=7+4*2+1C=2B
004032DD  IDIV    ESI
004032DF  MOV     EBX, EDX
                 <---EDX中为余数值7
004032E1  MOV     EAX, DWORD PTR SS:[EBP+8]
004032E4  MOV     AL, BYTE PTR DS:[EAX+3]
                 <---取注册码第4位
004032E7  PUSH    EAX
004032E8  CALL    NSTOWER.00403317
                 <---AL=4
004032ED  ADD     ESP, 4
004032F0  XOR     ECX, ECX
004032F2  MOV     CL, AL  <---CL=4
004032F4  CMP     EBX, ECX
                 <---关键比较4,由此得到注册码的第4位应为7
004032F6  JNZ     NSTOWER.0040330B
004032FC  MOV     EAX, 1
                 <---置标志位EAX的值为1,到此可得到完整的注册码7237564
00403301  JMP     NSTOWER.00403312
00403306  JMP     NSTOWER.00403312
0040330B  XOR     EAX, EAX    <---置标志位EAX为0
0040330D  JMP     NSTOWER.00403312
00403312  POP     EDI                              
00403313  POP     ESI                              
00403314  POP     EBX                              
00403315  LEAVE
跟进那个对字符进行处理的Call:
00403317  PUSH    EBP
00403318  MOV     EBP, ESP
0040331A  PUSH    EBX
0040331B  PUSH    ESI
0040331C  PUSH    EDI
0040331D  XOR     EAX, EAX
0040331F  MOV     AL, BYTE PTR SS:[EBP+8]
00403322  CMP     EAX, 61
                 <---比较是否小于"a"
00403325  JL      NSTOWER.00403336
0040332B  XOR     EAX, EAX
0040332D  MOV     AL, BYTE PTR SS:[EBP+8]
00403330  SUB     EAX, 20
                 <---EAX=EAX-20,小写转大写
00403333  MOV     BYTE PTR SS:[EBP+8], AL
00403336  XOR     EAX, EAX
00403338  MOV     AL, BYTE PTR SS:[EBP+8]
0040333B  CMP     EAX, 41
                 <---是否小于A
0040333E  JL      NSTOWER.0040334F
00403344  XOR     EAX, EAX
00403346  MOV     AL, BYTE PTR SS:[EBP+8]
00403349  SUB     EAX, 7
                 <---EAX=EAX-7,去掉"A"和"9"之间的特殊字符
0040334C  MOV     BYTE PTR SS:[EBP+8], AL
0040334F  XOR     EAX, EAX
00403351  MOV     AL, BYTE PTR SS:[EBP+8]
00403354  SUB     EAX, 30
                 <---对于数字的处理,EAX=EAX-30
00403357  JMP     NSTOWER.0040335C
0040335C  POP     EDI                              
0040335D  POP     ESI                              
0040335E  POP     EBX                              
0040335F  LEAVE
对字符处理具体如下:对于大于a的,则对其Hex值减57H,对于(a,A]之间的所有字符,
对其Hex值减37H,对于所有小于A的字符,对其Hex值减30H。

总结:注册码与用户名无关,必须为7位,且须满足以下条件,设注册码为abcdefg
,为便于说明,设我们输入的为0---9之间的数,则须满足以下条件:
(1)............a=c+f*2+1C            
(2)............g=b+e*2+1C
(3)............d=a+g*2+1C
当然注册码也可由字符组成,只要每位转换后的值满足上述条件即可.
软件注册成功后将注册信息保存在
C:\WINDOWS\nstower.ini中
[Registration]
Name=ShenGe
ID=7237564