= 36、魔法门外传(1) =========================================================== 最近无聊,把大补帖拿出来玩,赫然发现有「魔法门外传(1).... 星云之谜」,这下我可爽了,因为我只玩过二代,所以赶紧玩他一下 ,到了一半,跟二代一样,会出现密码,结果输入三次,竟然跳回DOS, 让我不得不佩服这块补帖的烂,这一块真的是世界上最烂的,因为连游 戏目录都没有,你说这是什么世界? 其实,我这一次要介绍他的破解过程,就是因为最近都是讨论WINDOWS 的CRACK,但是说实话,虽然我WINDOW破解不太行,不过比较起来,我 可以肯定,WINDOW破解绝对比DOS简单,为什么? 因为函示就固定那几个 ,而且WINDOW也不允许程式擅自乱搞,所以花样就少了,破解自然也变成 公式化的东西。 载入S-ice,出现密码就切入视窗,然後什么CALL的啦,RET啦, 都先胡乱追踪一通,事实上,一个程式那么长,尤其又是用高阶 语言写成的,所以你根本不可能知道那些程式码在干什么,尤其 当你「找错副程式」,结果在里面乱追一通,还不是浪费时间而已, 我本身用ASM写成的程式,反组译後自己也看不太懂,何况看别人 的程式?这点心理建设应该要有吧! 所以才说靠经验啦。 这一次的破解点很好找,不过这不是重点,找到点你还拿他没辄? 29B0:8A58 9A4109DE25 CALL 25DE:0941 29B0:8A5D 83C406 ADD SP,+06 29B0:8A60 8946FE MOV [BP-02],AX 29B0:8A63 50 PUSH AX 29B0:8A64 56 PUSH SI 29B0:8A65 9A83471509 CALL 0915:4783 29B0:8A6A 83C404 ADD SP,+04 29B0:8A6D 8946F4 MOV [BP-0C],AX 29B0:8A70 837EF400 CMP WORD PTR [BP-0C],+00 29B0:8A74 7413 JZ 8A89 ;竟然就是这里,改成JMP不就好了?! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 29B0:8A76 47 INC DI ;所以把机器码抄下,等等用PC TOOL改 29B0:8A77 83FF03 CMP DI,+03 ;判断是否输入三次了? 29B0:8A7A 7403 JZ 8A7F ;三次错误就跳回DOS 29B0:8A7C E924FF JMP 89A3 ;89a3 的地方,是密码起始处 29B0:8A7F 0E PUSH CS 29B0:8A80 E825AF CALL 39A8 29B0:8A83 E91DFF JMP 89A3 29B0:8A86 E91AFF JMP 89A3 ;你看,很多判断点都是要回到密码的地方 29B0:8A89 6A DB 6A ;因为里面有一判断点,会让你跳回DOS 29B0:8A8A 0B9A8901 OR BX,[BP+SI+0189] 29B0:8A8E 0F DB 0F 29B0:8A8F 15595F ADC AX,5F59 29B0:8A92 5E POP SI 29B0:8A93 C9 DB C9 29B0:8A94 CB RETF ;若能从这里返回,游戏就正常啦! 好了,真高兴,嗯,XEEN.EXE 先用UNP解压缩,结果果然是被压缩过的, 终於解开了,开始修改,咦? 怎么找不到上面的机器码,明明已经解压 缩了啊?! 天啊,这怎么办? 对了,以前的GAME TOOLS 有附一个小程 式,可以执行时改机器码,所以根本不用担心,可是我手边刚好没有耶! 只好另想办法。 思考了三秒钟,我发现这些程式码一定事後来载入的,也就是从别的档案 载入,因为你在XEEN.EXE找不到,那一定是在别处了嘛!好的,继续追踪, 看看到底是谁写入这段程式码?所以锁定记忆体∶ BPM 29B0:8A74 然後在进入游戏,等等就可以看到是谁载入的, 过了一会, 就自动产生中断,结果我们看到如下画面∶ 64AC:0000 FD STD ;这是一个解码副程式,由XEEN.DAT 64AC:0001 8CDB MOV BX,DS ;载入的资料,竟然还要解码?! 64AC:0003 53 PUSH BX ;可见XEEN.DAT是事先被编码了。 64AC:0004 83C339 ADD BX,+39 64AC:0007 03DA ADD BX,DX 64AC:0009 8CCD MOV BP,CS 64AC:000B 8BC2 MOV AX,DX 64AC:000D 80E40F AND AH,0F 64AC:0010 B104 MOV CL,04 64AC:0012 8BF2 MOV SI,DX 64AC:0014 D3E6 SHL SI,CL 64AC:0016 D3EA SHR DX,CL 64AC:0018 FEC6 INC DH 64AC:001A 8BCE MOV CX,SI 64AC:001C D1E9 SHR CX,1 64AC:001E 4E DEC SI 64AC:001F 4E DEC SI 64AC:0020 8BFE MOV DI,SI 64AC:0022 2BE8 SUB BP,AX 64AC:0024 2BD8 SUB BX,AX 64AC:0026 8EC5 MOV ES,BP 64AC:0028 8EDB MOV DS,BX 64AC:002A F3 REPZ 64AC:002B A5 MOVSW 64AC:002C B80010 MOV AX,1000 64AC:002F B580 MOV CH,80 64AC:0031 FECE DEC DH 64AC:0033 75ED JNZ 0022 64AC:0035 FC CLD 64AC:0036 8EDD MOV DS,BP 64AC:0038 07 POP ES 64AC:0039 06 PUSH ES 64AC:003A BF0001 MOV DI,0100 64AC:003D 33F6 XOR SI,SI 64AC:003F AD LODSW 64AC:007C AC LODSB ;资料由DS∶SI载入AL 64AC:007D 32C2 XOR AL,DL ;这一行就是解码程式,跟DL互斥 64AC:007F AA STOSB ;中断在此产生,资料由AL写入74H=(JZ) 64AC:0080 D1ED SHR BP,1 64AC:0082 4A DEC DX ;看到了没,DX可是会改变的,所以解 64AC:0083 74F1 JZ 0076 ;码变化性大了许多。 64AC:0085 73F5 JNB 007C 64AC:0087 33C9 XOR CX,CX 64AC:0089 33DB XOR BX,BX 64AC:008B D1ED SHR BP,1 64AC:008D 4A DEC DX 64AC:008E 74B6 JZ 0046 64AC:0090 D1D3 RCL BX,1 64AC:0092 D1ED SHR BP,1 64AC:0094 4A DEC DX 64AC:0095 74B5 JZ 004C 64AC:0097 D1D3 RCL BX,1 64AC:0099 80FB02 CMP BL,02 好了,实不相瞒,他的解码程序至少有三种,刚刚看的的只是最简单的一种, 不信你自己看看上面的其他片段。 这里要解说一下∶ 当中断产生时(BPM 29B0∶8A74)那时候的DL是2,AL为76H,所以解码後 xor al,dl =>xor 76h,2 =74h 即JZ的机械码 那我现在要输入一个数,使他解码後变成EB(JMP的机器码) 我该如何? 好的,那就用EB再反解码一次∶ xor eb,2 => e9 将同一个数互斥两次,结果不变∶ 所以∶ xor e9,2 =>eb 哈哈,还不一样。 所以我们只要将76改成E9就可以啦,解码後会变成EB也就是JMP 好了,刚刚产生中断时,我们跑到DS∶SI抄了一些机器码,准备到 XEEN.DAT修改。 找 ∶ 85 7b f0 03 76 改成∶ E9 终於破解完成 PS∶ 若你见到 REP MOVEB ES∶ 表示由 ES∶SI=>ES∶DI ,哈,我没用过这种写法。 补充一下,事实上,假如我们看到的DS∶SI的资料,又是被编码过的, 我们岂不干死? 还好,他没这么做,不过我说过,上面至少有三组 解码程序,其中有一组是以DS∶SI的值运算後减去SI,然後再由ES∶SI 输入正确程式码,你说烦不烦人啊? 本来我要将密码画面改不见, 偏偏刚好那几码碰到的解码程序就是那一组最「硬斗」的, 我当然不鸟他 啦,还要考期末考耶!哪来那么多时间啊? 其实,我花时间写了这么一大篇,无异是要告诉你,破解就某方面而言, 绝对是要技巧的,绝不是靠运气找一个JZ改成JMP就没事,这样你的功力 当然就受限了,因为有一点变化,你就没辄了。最好是当你找到判断点 後,浏览一下附近的程式或副程式,不过当然你的组合语言功力要好一点, 何谓才叫好? 不一定,不过熟记指令是不二法门,你该不会说你只懂一个 MOV,一个JMP吧,那你看到XOR或RCL 等等指令怎么办?这些都是编码解码 的必备要素耶!好了,有空再说。 事实上,我根本很少玩破解,也没那个兴趣,我大多是向别人问破解码, 因为这样比较方便,所以你要找我请教,我没办法,因为我经验太少, 那为什么WIN的破解较公式化,举个例子∶每一个注册画面都是由一个对话 盒来负责,事实上这个对话盒只是由程式呼叫,实际个控制全完全在WINDOW 手中,包括键盘的输入,资料的处理,最後再交给程式,所以你可以看到, 最近的破解,几乎都是拦截「HMEMCPY」这个函示,原因无他,WINDOW就是固 定用这个函示拷贝对话盒资料,事实上,你输入的资料,都先存放於系统的 记忆体区间,然後再拷贝给你的程式,过程就是这样。所以要多留意一些比 较共通的部份,比方HMEMCPY,还有呢?产生对话盒的程式,就固定几个而已 ,比方MessageBox函示,可以的话,就下中断点啦。 我只是要将有兴趣的引入门,当然也要给你一些观念,因为现在教别人破解的 即使有引出过程,她们也很少会跟你说,这里为什么要这样,那里为什么要 那样,这样你还是没学到什么。