• 标 题:桌面撞球
  • 作 者: ShenGe
  • 时 间:2003/03/20 03:04pm
  • 链 接:http://bbs.pediy.com

破解软件:ball.exe
破解工具:TRW1.22,WDASM黄金版
破解目的:技术研究,如大家有更好的想法,请指正
破解难度易
☆软件简介:
很好玩的小游戏,在各大下载站点都有不错的成绩。游戏的玩法很有创意,你需要用鼠标押住你控制的小球,尽量打向对方的球门,还要堵截对方打向你的球门的球,虽然界面简单,但很有挑战性,对手的AI(人工智能)也很出色,并可随意设置,让人百玩不厌。而这个游戏仅仅才75k,真的是十分出色。可别玩上瘾哦!建议最大化来进行游戏,能取得最好的效果。
游戏如果没有注册成功每次启动都会跳出请你注册的提示。真是烦人!Let's go!(本人初学破解,还请高手多多指点帮助!)
先用WDASM反汇编了一下,在输入函数中发现有GETDLGITEMTEXT,运行程序,出现提示注册窗口,下bpx getdlgitemtext,F5,按确定,OK!程序被拦下,按F12跳出,来到如下代码:
2237:8529 CMP BYTE [2E30],00          
2237:852E JZ 8558
2237:8530 CALL 845C                   <---关键的Call
2237:8533 OR AX,AX                    <---判断标志位的值是否为1
2237:8535 JNZ 8558
2237:8537 PUSH SI
2237:8538 PUSH DS
2237:8539 PUSH WORD 0808
2237:853C PUSH AX
2237:853D PUSH AX
2237:853E PUSH AX
2237:853F CALL USER!MESSAGEBOX        <---显示出错信息
2237:8544 MOV BYTE [2E30],00
很显然,CALL 845C就是对我们输入的注册码进行处理判断,跟进这个CALL来到如下代码:
2237:845C ENTER 22,00
2237:8460 PUSH DI
2237:8461 PUSH SI
2237:8462 XOR DX,DX
2237:8464 MOV [BP-02],DX
2237:8467 MOV SI,2E30
2237:846A CMP [SI],DL                 <---判断是否输入
2237:846C JZ 8494
2237:846E LEA DI,[BP-22]
2237:8471 LEA AX,[BP-02]
2237:8474 CMP DI,AX                   <---判断我们输入的数是否大于16位
2237:8476 JNC 8494
2237:8478 MOV AL,[SI]                 <---取我们输入的第一个数        ---
2237:847A CBW                                                           |
2237:847B MOV BX,AX                                                     |
2237:847D TEST BYTE [BX+08FD],04      <---不清楚干什么的,有谁能告诉我?  |
2237:8482 JZ 848E                                                       |
2237:8484 CBW                                                           |
2237:8485 SUB AX,30                   <--- 转换成10进                   |
2237:8488 MOV [DI],AX                                                   |
2237:848A ADD DI,BYTE +02                                               |
2237:848D INC DX                                                        |
2237:848E INC SI                                                        |
2237:848F CMP BYTE [SI],00            <---判断是否取完                  |
2237:8492 JNZ 8471                                                      |
2237:8494 CMP DX,BYTE +10            <---判断我们输入的数是否小于16位 ---
2237:8497 JL 84E1
2237:8499 MOV AX,[BP-20]        <---从这以后开始取转换后的数进行运算,取第2位数
2237:849C IMUL WORD [BP-16]     <---取第7位数
2237:849F IMUL WORD [BP-0C]     <---取第12位数
2237:84A2 IMUL WORD [BP-0A]     <---取第13位数
2237:84A5 MOV CX,AX
2237:84A7 MOV AX,[BP-1C]        <---取第4位数
2237:84AA IMUL WORD [BP-1A]     <---取第5位数
2237:84AD IMUL WORD [BP-0E]     <---取第11位数
2237:84B0 IMUL WORD [BP-08]     <---取第14位数
2237:84B3 ADD CX,AX
2237:84B5 MOV AX,[BP-14]        <---取第8位数
2237:84B8 IMUL WORD [BP-12]     <---取第9位数
2237:84BB IMUL WORD [BP-10]     <---取第10位数
2237:84BE IMUL WORD [BP-04]     <---取第16位数
2237:84C1 ADD CX,AX
2237:84C3 MOV AX,[BP-1E]        <---取第3位数
2237:84C6 IMUL WORD [BP-18]     <---取第6位数
2237:84C9 IMUL WORD [BP-06]     <---取第15位数
2237:84CC IMUL WORD [BP-22]     <---取第1位数
2237:84CF ADD AX,CX
2237:84D1 MOV CX,01F4
2237:84D4 CWD
2237:84D5 IDIV CX
2237:84D7 CMP DX,BYTE +7F       <---关键判断
2237:84DA JNZ 84E1
2237:84DC MOV WORD [BP-02],01
2237:84E1 MOV AX,[BP-02]        <---置AX的置为1,走到这就成功了!
2237:84E4 POP SI
2237:84E5 POP DI
2237:84E6 LEAVE
2237:84E7 RET
现在我们基本上已清楚了算法,即分别取第1、3 、6、15位数相乘,第2、7 、12、13位数相乘,第4、5 、11、14位数相乘,第8、9 、10、16位数相乘,然后将它们的和除以01F4,余数为7F就满足要求(16进制运算)。用Windows自带的计算器即可搞定!我得到的注册码为:2373535393225523。
我尝试用TC用穷举法写了个注册机,发现不是很理想,还请高手指点,有没有更好的反算算法。
该软件注册成功后将注册信息保存在C:\WINDOWS\WSLAM.INI中。