精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>汇编语言>>各种教程>>解密教程>>解秘教程6

主题:解秘教程6
发信人: shangbings()
整理人: cobe(2001-08-06 13:03:58), 站内信件
第六章 某种超级锁
6-1 四川省某文件 
-R
AX=0000 BX=0000 CX=786E DX=0000 SP=01FE BP=0000 SI=0000 DI=0000
DS=4B37 ES=4B37 SS=5267 CS=5267 IP=05B1  NV UP EI PL NZ NA PO NC
-U CS:05B1 CS:05EB
5267:05B1 5D       POP  BP      ┐
5267:05B2 8C46CF     MOV  [BP-31],ES  ┃ 将程序码从头加至尾
5267:05B5 8746CD     XCHG  AX,[BP-33]  ┃
5267:05B8 59       POP  CX      ┃ 因为任何的单步执行
5267:05B9 03467F     ADD  AX,[BP+7F]  ┃ 都会更改程序码[CC]
5267:05BC 45       INC  BP      ┃ 加完正确值是 F6E2h
5267:05BD E2FA      LOOP  05B9     ┘ 将之放到 AX 暂存器
5267:05BF FA       CLI         ┐
5267:05C0 5C       POP  SP      ┃ 从 SS:216-20A 抓数据替换
5267:05C1 1F       POP  DS      ┃ INT0-3的数据 ,如途中有单
5267:05C2 59       POP  CX      ┃ 步执行 ,就更改其SS:20A值
5267:05C3 5B       POP  BX      ┃ 这是因为当 INT0 被改后 ,
5267:05C4 8CCA      MOV  DX,CS    ┃ 任何单步执行一旦用到INT3
5267:05C6 870F      XCHG  CX,[BX]   ┃ 同时也会动到 INT0 ,跟著
5267:05C8 875702     XCHG  DX,[BX+02]  ┃ 利用此将SS:20C的0C改掉 ,
5267:05CB 52       PUSH  DX      ┃ 造成无限循环 ,正常绕三圈
5267:05CC 51       PUSH  CX      ┃ 后会跳到 INT3 那行
5267:05CD 83EC04     SUB  SP,+04    ┃
5267:05D0 83FB0C     CMP  BX,+0C    ┃
5267:05D3 75ED      JNZ  05C2     ┘
5267:05D5 CC       INT  3      ━ 直接用将AX与自己数据解码
5267:05D6 FC       CLD             ┐
5267:05D7 8FF7      POP  DI          ┃
5267:05D9 71B4      JNO  058F         ┃ 保护检查程序
5267:05DB 8103142A    ADD  Word Ptr [BP+DI],2A14┃
5267:05DF E6EC      OUT  EC,AL        ┃ (不用 INT13h 而
5267:05E1 52       PUSH  DX          ┃ 直接使用自己的
5267:05E2 0830      OR   [BX+SI],DH      ┃ 磁盘 I/O )
5267:05E4 031A      ADD  BX,[BP+SI]      ┃
5267:05E6 BAB467     MOV  DX,67B4       ┃
5267:05E9 9F       LAHF            ┃
5267:05EA 5A       POP  DX          ↓
5267:05EB F4       HLT
-D SS:220
5267:0200 40 04 10 02 00 02 00 00-00 01 98 05 0C 00 16 02 @...............
5267:0210 00 00 03 04 04 00 A0 11-48 11 21 C1 1C 30 9A 6B ...... .H.!A.0.k
5267:0220 5C E4 6D 8C D7 F0 EF FF-A3 6D AA B3 24 58 53 45 \dm.Wpo.#m*3$XSE
5267:0230 3F E2 C4 DD 56 ED C1 74-4A 7A D8 8B 77 50 6D 18 ?bD]VmAtJzX.wPm.
5267:0240 1F 1F 54 08 3D B3 48 CC-56 31 F9 85 20 2B AF 9A ..T.=3HLV1y. +/.
5267:0250 DC C2 5A CB F4 95 E1 E4-07 AC 66 8F 8C 4B 98 8F \BZKt.ad.,f..K..
5267:0260 30 64 19 1A 0C 82 18 C0-33 9F 25 43 42 9F 8D DC 0d.....@3.%CB..\
5267:0270 00 CC 93 8B DA C7 24 42-C1 88 3F 7C F3 B4 41 9E .L..ZG$BA.?|s4A.
 说明 : 该程序一开始就计算程序码 ,如果您使用了单步执行的话 ,程序就会被
     夹上[CC]码 ,造成计算总值不对 ,然后再杀掉 INT0-INT3 防止 DEBUG
     之类的程序跟踪 ,如您有单步执行一定会动到 INT0-INT3 ,而造成某个
     特殊旗标(SS:20C)被改掉。
        5267:05CD 83EC04     SUB  SP,+04 ┐
        5267:05D0 83FB0C     CMP  BX,+0C ┃
        5267:05D3 75ED      JNZ  05C2  ┘
     一次抓四个位元 ,比对是否有个 +0C 码,如果没有就继续 ,一但单步执
     行 ,这个 +0C 就会被改掉,造成无限循环(死机) ,最后就跳到下一行去
     执行INT3(CS:598) ,不做任何比对AX暂存器 ,直接就当做是程序解码用
     ,若暂存器数据正确则解码后的程序才是正确的 ,不然就无法预知后果
     解码后 ,开始使用解码后的程序(磁盘 I/O)数据比对 ,如程序正确就把
     真正的主程序解码和将自己的保护程序清除掉 ,防止被人看见程序解码
     后的重要数据 ,最后还原 INT0-INT3 执行该程序。
     换句话说 ,您可以在 DEBUG 下执行该程序 ,但不能单步执行 ,因此您
     可以在执行当中连打 Ctrl-Break ,当它还原主程序后 ,正好您也取到
     控制权 ,将它中断掉了 ,这时您可以去找 PSP 去看主程序在那里 ,将
     解密文件存回磁盘(假如功力够 ,但笔者功力不足 ,无法办到 )。

6-2 Sega 公司的游戏
4B37:0100 B80000     MOV  AX,0000  ┐
4B37:0103 CD13      INT  13     ┃ 这是笔者写的一个读取
4B37:0105 B80102     MOV  AX,0201  ┃ 该保护道数据的程序
4B37:0108 BB0002     MOV  BX,0200  ┃
4B37:010B B90000     MOV  CX,0000  ┃ 读取第零道零面第零个
4B37:010E BA0000     MOV  DX,0000  ┃ 额外扇区。
4B37:0111 CD13      INT  13     ┃
4B37:0113 80FC10     CMP  AH,10   ┃ 其数据放到 ES:0200
4B37:0116 75E8      JNZ  0100    ┃
4B37:0118 CD20      INT  20     ┘
第一次读该道的数据如下 :
4B37:0200 44 45 44 30 31 32 33 34-35 36 37 38 44 8A C8 E8 DED012345678D.Hh
4B37:0210 08 C0 00 06 CE 44 23 40-00 38 D0 3C 38 1B 21 DE [email protected]#@.8P<8.!^
4B37:0220 88 C0 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .@..............
4B37:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
第二次读该道的数据如下 :
4B37:0200 44 45 44 30 31 32 33 34-35 36 37 38 44 EA 0A 0C DED012345678Dj..
4B37:0210 26 38 84 4D 9C 8C 46 C9-3D 1C 0D 02 AE D4 03 BD &8.M..FI=....T.=
4B37:0220 36 45 BD BD BD BD BD BD-BD BD BD BD BD BD BD BD 6E==============
4B37:0230 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0240 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0250 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0260 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0270 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
 除了标头的 "DED0123456789D" 以外数据都不一样 ,原来这就是著名的
 保护 Weak-Bit ,这种保护无法用磁盘介面卡制造出(运气好可以做出)
 但是由于该公司出版的游戏都用此法保护 ,并且使用到 INT13h 很容易
 被长驻程序骗过去。
 笔者附上 CRCEDIT.ASM 供大家参"拷"使用,可骗过该公司的游戏保护。
 (该软件不得贩卖图利 ,使用后有任何后遗症 ,恕不负责)。
PS : 软件的保护是为了使软件作者的权益受到保护 ,手上有合法软件者 ,
   不要到处散播 ,因为国内软件刚起步 ,也希望大家合力去保护它 ,如
   您是一位写软件的作者 ,就可以感觉出希望大家购买合法软件的心情
   (笔者不出版软件) ,当您没有能力购买原版软件时 ,使用拷贝版有点
   愧对于良心 ,如您有能力购买正版软件 ,希望您早日购买 ,不但用的
   安心 ,也有助于软件更新版本 ,让大家有更好的软件与更多的软件作
   者头入国内软件市场。
          CRCEDIT.ASM : 常驻后 ,可以骗过该保护 ,制造出类似
                 Weak-Bit 的效果,该程序没有检测自己
                 是否载入过,故可能被载入两次以上。
                 (可以自己加减用 ,骗骗看好不好玩??)
   

[关闭][返回]