QPhome# 青浦之家论坛

QQ登录

只需一步,快速开始

2122

积分

13

好友

374

主题
1
发表于 2007-3-23 20:53:18 | 查看: 1670| 回复: 0
汇编语言的crack


第一章 使用规则
1-1  前  言
  要学会解密之前 ,您必须了解什么是加密 ,如何加密 ,以及跟踪程序,这样对于解密
就再也不是梦想 ,使用的工具只有 DEBUG.COM ,不过现在的程序一般都会检测有无载入
DEBUG ,若有则死机!!
1-2 DEBUG 与文件
  学过 DEBUG 的人都知道以下的指令 :
    T      --- 单步执行 ,一次执行一个指令
    G <Address> --- 执行到 <Address> 就停下来
    G      --- 执行完载入的程序
    N <Filesname>--- 定义文件名 (配合 "L" 或 "W" 用)
    L      --- 载入文件(LOAD)
    W      --- 写入文件(SAVE)
    W      --- 写入文件(SAVE)
  大部份解密过程只用到上列指令.....
  ==================================================
  文件分为.COM 与.EXE ,因为.COM 最大只能有 64K 所以演生出.EXE 文件。但是.E
XE又有个文件头 ,记录文件放在那儿所以 DEBUG 无法写回此种文件 ,而产生错误信息。

  ※因此EXE文件必须用 PCTOOLS 将指令码找出来改....
第二章 磁盘格式与保护
2-1 磁盘格式
  大多数人认为磁盘只有分几道、两面而已 ,其实又细分了更多的东西2D 的磁盘有
39 道 ,2HD 的磁盘有 80 道 ,每一道又分为9个扇区 ,每个扇区又再分 512 个位元组
,因此要做保护只要和正常道不同即可。
  (PS: DOS2.0每道8个扇区 ,DOS3.1以上版本才是9个扇区)
  磁道(TRACK) : 磁盘上分成数个同心圆环 ,便称磁道
   面(Head) : 软盘分为 0/1 面 ,但硬盘可能超过此数字
 扇区(SECTOR) : 磁道上储存数据区域之一
     N 值 : 扇区大小 ,正常为2 (N=1 256Bytes ,N=2 512Bytes)
         2的N次方乘以256,即为该扇区的大小
         2的N次方乘以256,即为该扇区的大小
  因此正常的磁道 ID 栏应该为 :
     T  H  S  N
  1   02 00 01 02 10.4%    这是第二道第零面的状况
  2   02 00 02 02 10.4%    "%" 代表这扇区占该道的
  3   02 00 03 02 10.4%    百分比 ,每次皆会有少许
  4   02 00 04 02 10.4%    差异。
  5   02 00 05 02 10.4%
  6   02 00 06 02 10.4%
  7   02 00 07 02 10.4%
  8   02 00 08 02 10.4%
  9   02 00 09 02 13.7%
 ----------------------------
  若 N=3 则必需有 17.8% 以上的空间才能制造出正常磁道 ,不然都会造出坏道(CRC
ERROR) ,所以该道只能有 5 个扇区 ,否则就变成坏道。这是因磁盘控制卡之故 ,无法要
求小又好(NO ERROR)的扇区。
2-2 保护的种类与介绍
  空白扇区  : 该道不具扇区 ,也就是某一道不做 FORMAT ,这样当读写
         这个磁道就会造成错误 ,但只能防标准的 DISKCOPY 的
         拷贝程序 ,是早期的保护方式 『如 疯狂大家乐』
  非标准扇区 : 就是乱改 T H S N 值 ,变成与正常道不同 ,早期的保护
         也是利用此法 『如 卡诺夫将 S 值乱改』
异常大小的扇区 : 占该磁道大小百分比异常 『如 快打砖块』
   隐藏扇区 : 用 ID 栏错误法 ,使得该扇区必须要用 READ ID 法才能
         找到该扇区 ,所以可骗过早期的 COPYWRIT or COPYIIPC
         『如 名车大赛』
 增加额外扇区 : 让某一道扇区超过正常数目 『如 名车二代』
         磁盘控制卡若能制造出 20h 个扇区就算不错了,但有些却
         制造甚多个使之无法用软件拷贝 『如 图腾抓图软件』
   虚拟扇区 : 又名 WEAK BIT ,就是将数据写入时以介于 0 与 1 的磁性
         写入 ,于是读出来的数据每次都不一样 ,正常软驱无法
         做出(碰运气可作出,但百分比越大越难做出) ,只能靠外来
         硬件做拷贝 『如 冲破火网』
     长道 : 利用转速慢的软驱写入 ,这样写入的数据比较多 ,除非
         拷贝的软驱转速相同 ,不然拷不下(拷贝卡也无法)
    无缝锁 : 利用 N 值为 6 的扇区 ,因为超过该道所能容纳的空间 ,
         所以当您读取该扇区时就会顺便将头尾的数据读出 ,任何
         软驱都无法处理该区 ,造成不能被拷贝 ,因此市面使用
         此保护者 ,每片都不一样保护道数据 ,不可能拷贝 ,同时
         该法会挑软驱 ,故少人用之 『如 风云麻将』
   额外磁道 : 正常磁盘假如有 39 道 ,但可读写的还有 40 41 道 ,因
         此有人就在该道做手脚 ,然后以正常方式读写该道
         『例如 冲风飞车』
2-3 非正常扇区的保护范例
   FORMAT 磁道的程序        验证该道
 CS:100 MOV AX,0000 \ 重置磁盘   CS:100 MOV AX,0000 \ 重置磁盘
     INT 13   / 读写前的准备     INT 13   / 读写前的准备
     MOV AX,0501 - FORMAT 1个扇区    MOV AX,0201 - 读一个扇区
     MOV BX,0200 - ID 数据放在 ES:BX  MOV BX,0200 - 将数据放在 ES:BX
     MOV CX,2901 - 29h道        MOV CX,29FF - 第29h道,FFh扇区
     MOV DX,0001 - 零面,B软驱     MOV DX,0001 - 零面,B软驱
     INT 13   - 起动磁盘 I/O     INT 13   - 磁盘 I/O 起动
     JB 0100  - 失败再重作      JB TEST ERROR 无特殊道
     INT 20   - 结束程序       JMP TEST OK  有特殊道
 ES:200 DB 29 00 FF 02 (ID栏数据)
  上例利用到额外扇区 ,DOS 只用到 27h道,而该程序用到 29h道,于是不怕有人 FOR
MAT 该磁盘 ,因为 FORMAT 不会洗到该道数据 。在29h 道制造一个编号为 FFh 的扇区
,所以就算能拷到该道 ,也可防一般拷贝软件 ,能防 COPYIIPC(因只拷到28h道) ,但仍
不能防 COPYWRIT。
第三章 磁盘控制卡的认识
3-1 磁碟控制卡的介绍
  磁碟控制卡上的 uPD765A 是整个磁碟作业的核心 ,而 uPD765A 靠著3个I/O 埠的暂
存器与 CPU 沟通 ,这三个暂存器如下 :
    &h3F2 : 数位输出暂存器
    &h3F4 : 主状态暂存器
    &h3F5 : 资料/状态 暂存器
  资料传输到磁片时 ,又可分为 DMA 与 非DMA 模式 ,由於与主题无关略过。
  uPD765A 磁碟控制卡可下达以下指令 :
    ┌━━━━━━━━━━━━━━━━━━━━━━━━━━┐
    ┃ Read Data (读取资料)                ┃
    ┃ Write Data (写入资料)               ┃
    ┃ Read ID (读取 ID)                 ┃
    ┃ Format A Track (将磁轨格式化)           ┃
    ┃ Read Deleted Dtat (读取已删除的资料)        ┃
    ┃ Write Delete Data (写入已删除的资料)        ┃
    ┃ Read A Track (读取磁轨)              ┃
    ┃ Seek (找寻磁轨)                  ┃
    ┃ Scan EQUAL (扫瞄比对相等)             ┃
    ┃ Scan high or equal (扫瞄大於或等於)        ┃
    ┃ Scan low or equal (扫瞄小於或等於)        ┃
    ┃ Recalibrate (校准磁头 ,磁头回到第零轨)       ┃
    ┃ Sense Interrupt status (感测中断状态)       ┃
    ┃ Sense Driver Status (感测磁碟机状态)        ┃
    ┃ Specify (指定)                   ┃
    └━━━━━━━━━━━━━━━━━━━━━━━━━━┘
3-2 工作方式
             ┌━━━━━┐
             ┃ CPU ┃
             └━━━━━┘
                ↑
                ↓
           系统汇流排 (SYSTEM BUS)            
    ↑         ↑
    ↓         ↓     资料窗  ┌━━━┐
 ┌━━━━━┐ DRQ ┌━━━━━┐←━━━━━┤ RLL ├┬━ ┬━━┐
 ┃     ┃←━ ┃     ┃  RD DATA └━━━┘┃  ┃ 磁 ┃
 ┃     ┃   ┃     ┃←━━━━━━━━━━┘  ┃ 碟 ┃
 ┃  8237  ┃DACK ┃ uPD765A ┃━━━━━━━━━━━━→ ┃ 机 ┃
 ┃     ┃━→ ┃     ┃  WR DATA         ┃ 介 ┃
 ┃DMA 控制器┃   ┃  FDC  ┃  输入控制         ┃ 面 ┃
 ┃     ┃   ┃     ┃            → ┃ ⊙ ┃
 ┃     ┃━→ ┃     ┃            → ┴━━┘
 └━━━━━┘ TC └━━━━━┘  输出控制
        终结计数
3-3 中断简介
  由于汇编高手甚多 ,因此各中断向量便不再介绍 ,只介绍几个与磁盘有关的功能 ,
其它中断请自行查书。
      INT 13h  
           
      (AH)=0 : 重置软驱 ,将磁头拉到 TRACK 0
      (AH)=1 : 读入磁盘状态
      (AH)=2 : 将指定扇区读入记忆体
      (AH)=3 : 将记忆体数据写入扇区
      (AH)=4 : 查验扇区
      (AH)=5 : 格式化指定扇区
      返回代码 (AH or AL 值,以二进位来看)
      00000001 传给软驱 I/O 指令不正确
      00000010 找不到位址标记
      00000011 磁盘贴有写保护
      00000100 找不到指定扇区
      00001000 DMA 越界
      00001001 超过DMA边界(有64K)处存取数据
      00010000 CRC 错误
      00100000 软驱控制卡损坏
      01000000 Seek 动作错误
      10000000 时间超过而软驱仍未动作
           
      INT 1Eh  
           
      INT 1E 指向的位址就是磁盘参数表 ,一般指向 0000:522-52C
     0000:0522 DF 步进速率
     0000:0523 02 表 DMA 传输数据
     0000:0524 25 马达起动时等待 25ms
     0000:0525 02 N值为2 (512Bytes)
     0000:0526 09 可容许最大扇区编
     0000:0527 2A 间隙(Gap)长度
     0000:0528 FF 扇区数据长
     0000:0529 50 格式化时的间隙长度
     0000:052A F6 填入空白扇区的位元值
     0000:052B 0F 移动每一道后等待25ms再读写数据
     0000:052C 02 马达起动时间
第四章 程序跟踪的动作
4-1 DEBUG 的跟踪程序功能
  在汇编指令中有数百个指令,程序中又有数以万计的指令,到底那里才是保护的所在
地呢,这就要牵扯到 DEBUG 的 TRACE 的功能了。
  DEBUG 较常用的指令有 :
   "N"     = 定义程序名称
   "L"     = 根据定义的文件名作 LOAD 文件
   "W"     = 根据定义的文件名作 SAVE 文件
   "U"     = 列出程序 (相当于 LIST)
   "T"     = 执行一个指令码,遇到 CALL 则跳到内部继续执行
   "P"     = 执行到下一行,遇到 CALL 时则执行完那个 CALL
   "G"     = 执行程序,又可分成下列几种
           "G=<Address>" 不管现在执行到那,直接跳到<Address>
                  继续执行(不常用)
           "G <Address>" 从现在的地方执行到<Address> 后停下来
           "G"      从现在的地方执行到结束为止
4-2 汇编指令简介
  MOV AA,BB  将 BB 放到 AA 里
  CALL     调用子程序 (相当于 BASIC 的 GOSUB)
  RET 与 RETF 返回程序  (相当于 BASIC 的 RETURN)
  CMP XX,YY  比较 XX 与 YY
  JZ      若相等则转移
  JNZ     若不相等则转移
  JB      若小于则转移
  JG      若大于则转移
  JMP     无条件转移
  J???     (各种转移指令)
  LOOP     循环
  INT XX    类似 CALL 的中断涵数
  以后凡是遇到上述指令都停下来查看一下 ,即键入 G<该行号>
  兹举例如下(随压缩文件内附文件) :
   CW.EXE (唯我读尊执行文件)
  A>DEBUG
  -N CW.EXE  请您随时键入 "U" 键看看程序
  -L
  -G 37
  -G 60    ┐ 一个循环,程序在此打转
  -T (JZ 6B)  ┃ 为了能继续执行,因此最后一定会跳出此循环
  -G 71    ┃ 前面三个条件转移不管是否成立都跳不出此循环
  -T (JZ 7C)  ┃ 因此肯定它一定是在 CS:9C 不成立下跳出
  -G 8A    ┃ 所以我们可以键入 G 9E(CS:9C的下一行)
  -T (JNZ 92) ┃
  -G 98    ┃ 如果没有把握只能用试的,或您时间多慢慢跟踪程序
  -G 9C    ┃ 个数圈以后也会跳出。
  -T (JZ 58)  ┘
  -G 9E (循环跳出后继续跟踪)
  -G AD    ┐
  -T     ┃ 第二个循环,可能从 "CS:BB JZ CE" 或 "CS:C6 JZ DE" 跳出
  -G BB    ┃ 于是先假设是 CS:BB ,当您键入 "G CE" 时程序执行了,可见
  -T     ┃ 假设错误,应该是由 CS:C6 跳出,于是再重新 LOAD ,
  -G C6    ┃ 前面已 TRACE 过,故直接键入 G37、T、GFE、T
  -T     ┘ (因为 RETF 与 IRET、JMP FAR、CALL FAR 指令会改变 CS
          段落,故需在此停下后再按"T" ,如 "CS:37 的 RETF" ,
          "CS:FE 的 JMP FAR")
  -G DE (循环跳出后继续跟踪)
  -G FE
  -T
  -G 483
  -T
  -G 495 \ 从 495 到 4A9 中间有个 "CALL" ,当您执行完此 CALL 竟
  -T   - "问你密码" ... 表示如杀掉此 CALL 则不会再问你密码了
  -G 4A9 / 但以下程序仍稍追一断试试。
  -T (JNZ 4AE) --> 如果你密码输入正确,则会转移,若错误就不跳,因此
           你必须将它改为无条件转移 (JMP)
  -于是将此两位置 ASCII 码抄下后用 PCTOOLS(Find) 修改后执行看看结果执行无误
,此文件以后就不再须要输入密码了 !
   PS : 1. 在解的过程中一定要拿支笔来记下已追到那儿了 !!
     2. CW.EXE 必须再配合其它文件才能执行此 Game ,因文件过大      
所以未全部压进此文件。
第五章 保护法
5-1 无缝锁介绍
  方法 : 因为一个磁道无法容纳 N=6 ,所以会格式化出坏道(BAD CRC)      同
时利用软驱无法正确写入索引孔附近数据,因此拷贝卡等硬件拷被工具也无法拷贝,但如
果仍要读该道时,磁盘就会顺便将索引孔的数据读出,只要比对其数据即可知是否原版。

  流程 :      ┌━━━━━━━━┐
           ┃ Reset Driver ┃
           └━━━┬━━━━┘
           ┌━━━┴━━━━┐
           ┃ Read a Track ┃
           └━━━┬━━━━┘
           ┌━━━┴━━━━┐ 不是 →
           ┃ 比对是否坏道 ├━━━━━━┐
           └━━━┬━━━━┘      ┃
               ┃ 是         ┃
           ┌━━━┴━━━━┐ 非预设数据 ┃
           ┃  比对数据区  ├━━━━━━┤
           └━━━┬━━━━┘    → ├━━━━━━━┐
           ┌━━━┴━━━━┐      ┃  失败结束  ┃
           ┃  成功的执行  ┃      └━━━━━━━┘
           └━━━━━━━━┘
汇编语言的crack2


[[[ FORMAT A磁盘第29h道,第零面,第1个扇区 ]]]
   ***** FORMAT UTILITY *****
       MOV AX,0000 ; 重置磁盘
       INT 13    ;
       MOV AX,0501  ;
       MOV BX,200  ; FORMAT 参数
       MOV CX,2901  ; 请查 DOS 手册
       MOV DX,0000  ;
       INT 13
       JB 'FORMAT ERROR'
       JMP 'FORMAT COMPLETE'
    ES:200 29 01 01 06  (ID 栏值,请看第二集)
   ***** TRACK DATA *****
       MOV AX,0000
       INT 13
       MOV BX,0000   ; ┐
       MOV DS,BX    ; ┃ 磁盘参数表,放在 0000:0525
       MOV BX,0525   ; ┘
       MOV AL,06    ; N=6
       MOV [BX],AL   ; 将 0000:0525 磁盘参数改为可读 N=6 的扇区
       MOV AX,0201   ; ┐
       MOV BX,300    ; ┃ 读取 29h 道,第 0 面,第一号扇区
       MOV CX,2901   ; ┃ 读到的数据放到 ES:BX
       MOV DX,0000   ; ┃ 请查 DOS 手册
       INT 13      ; ┘
       CMP AL,10    ;  是否 BAD CRC
       JZ 'TEST OK'  ;  如果是则跳越到比对数据
       JMP 'ERROR'
     由于 N=6 已超过一个扇区所能容纳的范围,因此变成 BAD CRC
     AL 的返回代码请参考 DOS 技术手册。
5-2 雷射保护
     方法 : 将磁盘上某一道用雷射将之破坏,使得该道原磁盘特性全毁     
   雷射准确性高,可100%破坏特定道,而一般使用者不会有雷射,也不会花钱买,而造
成无法拷贝。
     流程 :
            ┌━━━━━━━━━━━┐
            ┃ 格式化该磁道(Format) ├━━┐ 格式化失败
            └━━━━━┬━━━━━┘  ┃
              ┌━━━┴━━━━┐   ┃
              ┃ 写入该道数据 ├━━━┤ 写保护
              └━━━┬━━━━┘   ┃ 或写入失败
              ┌━━━┴━━━━┐   ┃
              ┃ 读取该道数据 ┃   ┃
              └━━━┬━━━━┘   ┃
            ┌━━━━━┴━━━━━━━┐┃
            ┃ 比对是否与写入数据相同 ├┤ 完全相同
            └━━━━━┬━━━━━━━┘┃
              ┌━━━┴━━━┐  ┌━┴━┐
              ┃  Test OK  ┃  ┃ 失败 ┃
              └━━━━━━━┘  └━━━┘
      ***** TEST PROGRAM *****
          MOV AX,0000
          INT 13
          MOV AX,0509   ;
          MOV BX,0200   ;
          MOV CX,XXXX   ; Format a Track
          MOV DX,XX00   ;
          INT 13     ;
          JB 'ERROR'
          MOV AX,0201   ;
          MOV BX,0200   ;
          MOV CX,XXXX   ; Read a Track
          MOV DX,XX00   ;
          INT 13     ;
          JNB 'ERROR'
          JMP 'Compare DATA'
5-3 Weak Bits
   方法 : 使用微弱的写入信号,造成磁盘上有介于0与1之间的讯号      软驱
每次读取时会读到不同数据,一般软驱无法写入介于0与1的讯号,只能利用写入时突然 R
eset 造成 Weak Bit ,旦准确度不高,只能靠外来硬件拷贝程序(拷贝卡)
   流程 :
        ┌━━━━━━━━━━┐
        ┃ 读取该道放入"A"区 ┃
        └━━━━┬━━━━━┘
        ┌━━━━┴━━━━━┐
        ┃ 再读一次放入"B"区 ┃
        └━━━━┬━━━━━┘
        ┌━━━━┴━━━━━┐
        ┃ 比对"A"与"B"的数据 ├━┐
        └━━━━┬━━━━━┘ ┃ 数据完全相同
             ┃       ┃┌━━━┐
           ┌━┴━━┐    └┤ 失败 ┃
           ┃ 成功 ┃     └━━━┘
           └━━━━┘
      ***** Weak Bit Test *****
        MOV AX,0000
        INT 13
        MOV AX,0201    ┐
        MOV BX,0200    ┃
        MOV CX,0000    ┃ 读数据到 ES:200
        MOV DX,0000    ┃
        INT 13      ┘
        MOV AX,0000
        INT 13
        MOV AX,0201    ┐
        MOV BX,0400    ┃
        MOV CX,0000    ┃ 读数据到 ES:400
        MOV DX,0000    ┃
        INT 13      ┘
    LOOP:  MOV BX,200      ┐
        MOV AL,ES:[BX]    ┃ 比对是否相同
        CMP AL,ES:[BX+200]  ┃ 若相同则 LOOP
        JZ LOOP       ┘
        CMP BX,3FF      ┐ 是否比对完毕
        JZ 'ERROR'     ┘
        JMP 'TEST OK'    ; TEST OK
   以上的保护都是从软件上抄下的,将之简化后登出,不过上述例子都是使用   磁
盘 I/O (INT 13h) 方式读取保护,因此很容易被拦截而解密,所以最好的方法就是将 RO
M (BIOS) SAVE 到程序内,如果须要使用到 INT 13h 时,就调用自己程序内的 BIOS ,这
样就没有问题了,但是由于 ROM 有 32K ,请自行抓出可用的程序,摆在自己程序内,这样
就算有XX写保护程序也不能防止被写入数据,但由于此方法必需考虑程序是否过大、版权
问题,所以少有人用之,例如目前市面常见的 SoftGard 2.00~3.01 都是自己写磁盘 I/O
,所以程序庞大,因此将其功能分成三个小文件,分别工作之。
   SoftGard 3.00 保护简介 :
    被 SoftGard 保护住的磁盘有两个隐藏文件,分别为 CML0300.HCL 以及   VD
F0300.VDF。首先由一个主文件启动磁盘,经过自我检测程序,然后再把把 DEBUG 要 TRA
CE 用的 INT 0~INT 3 全部换成 SoftGard 所用的程序使得 DEBUG 等程序完全当掉,然
后再读取 CML0300.HCL 将自己程序完全解码,使得SoftGard有正确程序可继续执行(防单
步执行),然后将保护道数据与解码后的 VDF0300.VDF 数据比对,若正确的话就将原主文
件解码,并还原各中断向量,然后执行该文件。
  对于该种保护的强度可能只有那些真正解过的人才知道了,但是不管保护如何强劲,
都有其致命伤,就是不管何时都禁止按 Ctrl-Break ,因此如果你在 DEBUG 下执行原版的
软件,那就在键入"G"后,连打 Ctrl-Break,因为就在它解开密码的那一点,就会将程序中
断向量还原,然后执行其真正的程序,而因为它是最后一个步骤才还原中断向量,因此您可
以中断其程序也就代表它正执行到保护与正确程序的交接点,就被你的快手中断掉了,此
时记忆体只留下来真正的程序,再写回磁盘就解密了,说穿就是这么诈。由于笔者手上有
一个类似被 SoftGard 保护的软件,相当强撼,将在下一集为您大略说明,想写一些防止被
TRACE 的保护,不能错过。
第六章 某种超级锁
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 .@..ND#@.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 的效果,该程序没有检测自己
                 是否载入过,故可能被载入两次以上
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
转发到微博

收藏回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

回顶部