论坛: 编程破解 标题: 最全的加密,解密基础教程 复制本贴地址    
作者: yongmin [yongmin]    论坛用户   登录
第一章 使用规则
1-1  前  言
  要学会解密之前 ,您必须了解什么是加密 ,如何加密 ,以及跟踪程序,这样对于解密就再也不是梦想 ,使用的工具只有 DEBUG.COM ,不过现在的程序一般都会检测有无载入 DEBUG ,若有则死机!!
1-2 DEBUG 与文件
  学过 DEBUG 的人都知道以下的指令 :
    T      --- 单步执行 ,一次执行一个指令
    G <Address> --- 执行到 <Address> 就停下来
    G      --- 执行完载入的程序
或 "W 用)
    L      --- 载入文件(LOAD)
    W      --- 写入文件(SAVE)
    W      --- 写入文件(SAVE)
  大部份解密过程只用到上列指令.....
  ==================================================
  文件分为.COM 与.EXE ,因为.COM 最大只能有 64K 所以演生出.EXE 文件。但是.EXE又有个文件头 ,记录文件放在那儿所以 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道,于是不怕有人 FORMAT 该磁盘 ,因为 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    ┐
或 "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��
,如 "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 ┃
           └━━━┬━━━━┘
           ┌━━━┴━━━━┐ 不是 →
           ┃ 比对是否坏道 ├━━━━━━┐
           └━━━┬━━━━┘      ┃
               ┃ 是         ┃
           ┌━━━┴━━━━┐ 非预设数据 ┃
           ┃  比对数据区  ├━━━━━━┤
           └━━━┬━━━━┘    → ├━━━━━━━┐
           ┌━━━┴━━━━┐      ┃  失败结束  ┃
           ┃  成功的执行  ┃      └━━━━━━━┘
           └━━━━━━━━┘
  [[[ 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的讯号,只能利用写入时突然 Reset 造成 Weak Bit ,旦准确度不高,只能靠外来硬件拷贝程序(拷贝卡)
   流程 :
        ┌━━━━━━━━━━┐
       ┃ 读取该道放入"A区 ┃
        └━━━━┬━━━━━┘
        ┌━━━━┴━━━━━┐
       ┃ 再读一次放入"B区 ┃
        └━━━━┬━━━━━┘
        ┌━━━━┴━━━━━┐
"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) 方式读取保护,因此很容易被拦截而解密,所以最好的方法就是将 ROM (BIOS) SAVE 到程序内,如果须要使用到 INT 13h 时,就调用自己程序内的 BIOS ,这样就没有问题了,但是由于 ROM 有 32K ,请自行抓出可用的程序,摆在自己程序内,这样就算有XX写保护程序也不能防止被写入数据,但由于此方法必需考虑程序是否过大、版权问题,所以少有人用之,例如目前市面常见的 SoftGard 2.00~3.01 都是自己写磁盘 I/O ,所以程序庞大,因此将其功能分成三个小文件,分别工作之。
   SoftGard 3.00 保护简介 :
    被 SoftGard 保护住的磁盘有两个隐藏文件,分别为 CML0300.HCL 以及   VDF0300.VDF。首先由一个主文件启动磁盘,经过自我检测程序,然后再把把 DEBUG 要 TRACE 用的 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 的效果,该程序没有检测自己
                 是否载入过,故可能被载入两次以上。
                 (可以自己加减用 ,骗骗看好不好玩??)
   第七章
 
以勇者斗恶龙之游戏为说明 ,以前第一代保护与解法 :
保护 :           解法 :
  设定磁盘参数 N=6      设定磁盘参数 N=6
  设定磁盘参数 N=6      设定磁盘参数 N=6
    ↓              ↓
  读取坏磁道数据        读取 DQ.DAT (坏道数据文件)
    ↓              ↓
  比对数据           比对数据
由于两者都能读到坏道数据 ,只不过第二者要事先将坏道数据存为一个文件
(DQ.DAT) 较麻烦 ,不过以后可免 KEY DISK ,省事多了 !
弟以市面上的解密版举例说明 ,兹列出其 EGA 版程序一部份。
-D CS:385
4B70:0385 44 51 2E-44 41 54 00 88 44 03 B9    DQ.DAT..D.9
4B70:0361 1E       PUSH  DS
4B70:0362 0E       PUSH  CS
4B70:0363 1F       POP  DS
4B70:0364 90       NOP
4B70:0365 90       NOP
4B70:0366 90       NOP
4B70:0367 B8003D     MOV  AX,3D00  ┐
4B70:036A BA8503     MOV  DX,0385  ┃ 开启 DQ.DAT
4B70:036D CD21      INT  21     ┘   (坏道数据文件)
4B70:036F 06       PUSH  ES
4B70:0370 1F       POP  DS
4B70:0371 31D2      XOR  DX,DX
4B70:0373 B90020     MOV  CX,2000  ┐
4B70:0376 89C3      MOV  BX,AX   ┃ 读取文件
4B70:0378 B43F      MOV  AH,3F   ┃
4B70:037A CD21      INT  21     ┘
4B70:037C 72F3      JB   0371
4B70:037E B43E      MOV  AH,3E   ┐
4B70:0380 CD21      INT  21    ┘ 关文件
4B70:0382 1F       POP  DS
4B70:0383 EB0A      JMP  038F
4B70:0385 44       INC  SP
以上程序取代了原来的 INT 7Fh(13h) 的读取保护道数据过程。
弟再举例例说明 ,该游戏是勇者斗恶龙 ][ 的一部份程序 :
4B70:6E01 33C0      XOR  AX,AX     ┐
4B70:6E03 8ED8      MOV  DS,AX     ┃
4B70:6E05 A14C00     MOV  AX,[004C]   ┃ 将磁盘读取之 N 值
4B70:6E08 A3FC01     MOV  [01FC],AX   ┃ 改为 6 (正常为 2)
4B70:6E0B A14E00     MOV  AX,[004E]   ┃
4B70:6E0E A3FE01     MOV  [01FE],AX   ┃
4B70:6E11 C5367800    LDS  SI,[0078]   ┃
4B70:6E15 B006      MOV  AL,06     ┃
4B70:6E17 884403     MOV  [SI+03],AL  ┘
4B70:6E1A B80000     MOV  AX,0000    ┐ Reset Driver
4B70:6E1D CD7F      INT  7F      ┘
4B70:6E1F BF0800     MOV  DI,0008
4B70:6E22 1E       PUSH  DS
4B70:6E23 50       PUSH  AX
4B70:6E24 B83658     MOV  AX,5836
4B70:6E27 8ED8      MOV  DS,AX
4B70:6E29 C606E22800   MOV  Byte Ptr [28E2],00
4B70:6E2E 90       NOP
4B70:6E2F 881E7E28    MOV  [287E],BL
4B70:6E33 58       POP  AX
4B70:6E34 1F       POP  DS
4B70:6E35 57       PUSH  DI
4B70:6E36 B80001     MOV  AX,0100 ┐
4B70:6E39 050101     ADD  AX,0101 ┃ 读取第 27h 道第 72h 号扇区
4B70:6E3C B97227     MOV  CX,2772 ┃ 第零面 ,将数据放到 ES:BX
4B70:6E3F BB0000     MOV  BX,0000 ┃ (9800:0000)
4B70:6E42 BA0000     MOV  DX,0000 ┃
4B70:6E45 CD7F      INT  7F    ┘
4B70:6E47 5F       POP  DI
4B70:6E48 80FC10     CMP  AH,10  ┐ 若是坏道则跳越
4B70:6E4B 7403      JZ   6E50   ┘
4B70:6E4D 4F       DEC  DI
4B70:6E4E 75E5      JNZ  6E35
4B70:6E50 B002      MOV  AL,02     ┐
4B70:6E52 884403     MOV  [SI+03],AL  ┃
4B70:6E55 B90001     MOV  CX,0100    ┃ 比对数据
4B70:6E58 BB0017     MOV  BX,1700    ┃
4B70:6E5B B04E      MOV  AL,4E     ┃
4B70:6E5D 263A07     CMP  AL,ES:[BX]  ┃
4B70:6E60 7503      JNZ  6E65     ┃
4B70:6E62 43       INC  BX      ┃
4B70:6E63 E2F8      LOOP  6E5D     ┘
4B70:6E65 268807     MOV  ES:[BX],AL   ┐ 结果放到此位址
4B70:6E68 26884701    MOV  ES:[BX+01],AL  ┘
4B70:6E6C B80098     MOV  AX,9800   ┐
4B70:6E6F 8ED8      MOV  DS,AX    ┃
4B70:6E71 B80000     MOV  AX,0000   ┃
4B70:6E74 B9001A     MOV  CX,1A00   ┃ 二次比对数据
4B70:6E77 33DB      XOR  BX,BX    ┃
4B70:6E79 3307      XOR  AX,[BX]   ┃
4B70:6E7B 052301     ADD  AX,0123   ┃
4B70:6E7E 43       INC  BX     ┃
4B70:6E7F E2F8      LOOP  6E79    ┘
4B70:6E81 1E       PUSH  DS
4B70:6E82 50       PUSH  AX
4B70:6E83 B83658     MOV  AX,5836
4B70:6E86 8ED8      MOV  DS,AX
4B70:6E88 C606F32500   MOV  Byte Ptr [25F3],00
4B70:6E8D 90       NOP
4B70:6E8E 58       POP  AX
4B70:6E8F 1F       POP  DS
4B70:6E90 3D7C45     CMP  AX,457C
4B70:6E93 7403      JZ   6E98
4B70:6E95 E95BFF     JMP  6DF3
与第一代的保护法完全相同 ,怎么去解它呢?? 请参考前例
弟附上 CRCEDIT.EXE 二代给您用用,当您执行时请先将原版磁盘 A 放入
A 软驱上 ,然后键入 CRCEDIT2.EXE 即可 ,接着它会读取坏道并将之存盘。
┌━━━━━━━━━━━━━━━━━━━━┐
┃  IBM PC Bad Sector Save System.   ┃
┃      Written by Dekuo Ko.    ┃
┃  Setting Save ID = 27/00/72/06    ┃
┃Crcedit Now Saveing ...Complete OK !  ┃
└━━━━━━━━━━━━━━━━━━━━┘
代表坏道数据读取成功 ,并写回 CRC.DAT !
┌━━━━━━━━━━━━━━━━━━━━┐
┃  IBM PC Bad Sector Save System.   ┃
┃      Written by Dekuo Ko.    ┃
┃  Setting Save ID = 27/00/72/06    ┃
┃   The DISK not found This ID    ┃
└━━━━━━━━━━━━━━━━━━━━┘
代表读取磁盘失败 ,再试一次看看。
请将 RET.EXE 与 CRC.DAT 放于同一文件区中 ,执行 RET.EXE
接着进入 PCTOOLS 取找寻备份的主文件 (DQ.EXE or DF2.EXE) ,寻找
共找到两个 ,第一个不改 ,第二个改 "CD99
好啦 ,这个游戏您可以自硬盘启动也不会读取 KEY DISK 了 ,不过切
记 ,每次玩 Game 时都要先载入 RET.EXE 唷 ,否则会死机。
解说 :
RET.EXE 会制造 INT 99h ,当有人调用此中断便会将 CRC.DAT 读进
记忆体内 ,造成与读保护道有同样之功效。
弟附上该软件 ,请勿贩卖 ,未来该类软件出新版亦可续用 ,唯 CRC.DAT
需重新存盘。
拷贝教程第六集
 
Microsoft (R) Symbolic Debug Utility Version 4.00
Copyright (C) Microsoft Corp 1984, 1985. All rights reserved.
Processor is [80286] ,Files Name : S.EXE (RS2的游戏保护)
-r
AX=0000 BX=0000 CX=9765 DX=0000 SP=0080 BP=0000 SI=0000 DI=0000
DS=1B5D ES=1B5D SS=333D CS=24AF IP=0012  NV UP EI PL NZ NA PO NC
24AF:0012 06       PUSH  ES
-u 12 70
24AF:0012 06       PUSH  ES ━━━ 未来转移用,暂不用到
24AF:0013 0E       PUSH  CS ┐ 断落对齐
24AF:0014 1F       POP  DS ┘
24AF:0015 8B0E0C00    MOV  CX,[000C] ┐
24AF:0019 8BF1      MOV  SI,CX   ┃
24AF:001B 4E       DEC  SI     ┃一些没营养的数据 ,待会
24AF:001C 89F7      MOV  DI,SI   ┃比对数据时的
24AF:001E 8CDB      MOV  BX,DS   ┃长度、位置 数据放入暂存器
24AF:0020 031E0A00    ADD  BX,[000A] ┃
24AF:0024 8EC3      MOV  ES,BX   ┃请注意 BX=DS=CS
24AF:0026 B400      MOV  AH,00   ┃
24AF:0028 31ED      XOR  BP,BP   ┃
24AF:002A FD       STD        ┘
24AF:002B AC       LODSB       ┐ AX=DS:SI=0-525
24AF:002C 01C5      ADD  BP,AX   ┃ 将CS:0到CS:525的指令码加起来
24AF:002E AA       STOSB       ┃ 放到 BP ,若有人单步执行则 BP
24AF:002F E2FA      LOOP  002B    ┘ 值就有误 ,因但部执行会产生CC码
24AF:0031 8B160E00    MOV  DX,[000E] ━ 正常主程序码相加后所得 1/2
24AF:0035 8AC2      MOV  AL,DL   ┐
24AF:0037 29C5      SUB  BP,AX   ┃ 等于 SUB BP,DX
24AF:0039 8AC6      MOV  AL,DH   ┃
24AF:003B 29C5      SUB  BP,AX   ┘
24AF:003D 39D5      CMP  BP,DX   ┐ 比对是否曾单步执行
24AF:003F 740C      JZ   004D    ┘ 未单步执行则跳越
24AF:0041 BA9101     MOV  DX,0191  ┐
24AF:0044 B409      MOV  AH,09   ┃ 印出 Crc Err 字样
24AF:0046 CD21      INT  21     ┘
24AF:0048 B8FF4C     MOV  AX,4CFF  ┐ End files
24AF:004B CD21      INT  21     ┘
24AF:004D 53       PUSH  BX     ┐
24AF:004E B85300     MOV  AX,0053  ┃ 跳到 CS:53 去执行程序
24AF:0051 50       PUSH  AX     ┃
24AF:0052 CB       RETF       ┘
24AF:0053 2E8B2E0800   MOV  BP,CS:[0008] ┐
24AF:0058 8CDA      MOV  DX,DS    ┃
24AF:005A 89E8      MOV  AX,BP    ┃
24AF:005C 3D0010     CMP  AX,1000   ┃
24AF:005F 7603      JBE  0064     ┃ 主程序
24AF:0061 B80010     MOV  AX,1000   ┃
24AF:0064 29C5      SUB  BP,AX    ┃
24AF:0066 29C2      SUB  DX,AX    ┃
24AF:0068 29C3      SUB  BX,AX    ↓
  这个 Game 的保护有点类似 SoftGard ,都利用了计算程序码的长度 ,这
 种保护可以 100%检测出对方是否有过单步执行。
 "G 100 这个指令看起来很单纯 ,只是要求程序执行到 CS:100 时停下来
 让使用者能够Debug 自己的程序 ,事实上它真的就是这样 ,不过在 Debug
上是如何执行工作 ,首先它会将 CS:100 的指令码暂时存起来 ,改放个 "CC
 (INT 3) 码来取代 CS:100 的指令码 ,一但执行到此就会触动 INT 3 的中断
 而将程序复原 ,并暂时终止程序继续执行 ,等使用者下命令。
 程序说明 :
      CS:0012 为主程序
        ↓
      设定 SI=523,CX=525
        ↓←━━━━━━━━┐
      取得 CS:SI 的指令码   ┃
        ↓         ┃还
      将此码加入 BP 内     ┃未
        ↓         ┃加
      将 SI 减 1 ,与 CX-1   ┃完
        ↓         ┃程
      CX 是否为零       ┃式
      (是否将程序码由头加到尾 ┃码
      即CS:0-CS:523)     ┃
        ├━━━━━━━━━┘
        ↓
      比对是否正确
        ├━━━━━━━┐程
        ↓       ┃式
      印出 Crc Err    ┃码
      结束程序      ┃正
        ┌━━━━━━━┘确
        ↓
      执行程序
 后记 : 其实任何保护都是在磁盘上制造某种错误 ,然后根据这个错误来判
     定是否原版。
     拷贝是利用程序来复制这个错误 ,让软件能正确无误的执行。
 
拷贝教程第七集
 
  由于弟所撰写之软件失败 ,造成第七集延误交件 ,所以请各位看一些废
话内容是弟对于软件保护与智慧财产权之保障 ,以及弟心里一些话。
  相信各位都知道一个好的软件的诞生 ,需要许多时间和努力 ,因此对于
发展软件的供应者而言 ,所推出的软件在市面上能够有不错的销路是十分重
要的 ,有适当的回收才能刺激原设计者发展更精良的产品。
  一套软件才上市不久即被海盗版攻占 ,这样的软件商绝不能够生存 ,因
为软件发展所需之费用没有合里的来源 ,那样所有的软件设计师大概都饿死
了 ;台湾有个很不好听的名称 ,叫做『海盗王国』 ,可是做一个海盗必需要
极大的勇气(触法)与智慧(盗版法)才能够做一个标准的"人奸盗 ,与其这
样 ,不如让我们携手来洗刷这个恶名。
  弟曾和大宇公司某人谈过 ,以下是其谈话主要内容....
 国内的 Game 虽然很多 ,但是真正有版权的少之又少 ,大宇的软件写出来
 后 ,国内喜欢的人也许多 ,但是一个游戏只是叫好不叫座 ,那样写软件的
 人也没精神再去发展更好的软件 ,一个游戏的推出必需经过相当的时间与
 人力才能达成 ,但是推出后一般只有半年的寿命 ,可是国内就是有一票人
 老是喜欢解人家的软件自娱 ,于是软件不叫坐 ,国人也就没有好的软件可
 以使用 ,国内电脑玩家通通都是被这种人害死 ,造成国人开始发展国外专
 用的软件 ,于是没人愿意为国内写软件 ,国内软件也就无法进步。
  事实上国人的脑袋并不会比外国人差 ,可是大家都花心思去想办法拷贝
  ,不愿意花钱去买 ,电脑病毒随之猖狂 ...
 再者 ,国内大多数发行电脑游戏的软件公司大多是花钱到国外买套软件 ,
 然后到台湾大量拷贝出售 ,这种软件不必负担任何的开发费 ,价格在150
 左右 ,与他们所开发的软件需负担开发费而言 ,价格也要定在200左右,又
 要考虑买的人大多是学生 ,不得不压低价格。
  他们也说 ,如果买的人又拷给别人 ,那样还不如一开始就将价格抬高 ,
 然后只卖几套就可回收成本 ,可是他们不愿意这么做 ,所以希望国内对于
 智慧财产权能够加以保障。
 PS : 这也就是为什么弟绝不解大宇的 Game 保护。
 国内一些公司不但自己有在写 Game ,但也 "兼 卖国外拷贝版软件 ,
对于这种 "叫人守法 自己违法 的做法 ,弟实感不平,因此对于该类公司
,但是对于这种 "耍特权 耍老大 的公司则不在此限。
  因为弟看不惯这种公司 ,绝不会购买此软件或流出该软件 ,对于其软件
 保护只会引导使用者备份其磁盘 ,至于使用者备份做什么事 ,就凭使用者
 自己的良心 ,而一些绝对守法的公司 ,弟绝不会告知其保护解法 ,也希望
 国内玩家共同遵守此一原则 .. 不解合法公司之软件保护。
 一个荒谬的事实 : 国内使用 Tracer 这套由 陈宏然先生 所发展之扫
          毒剂已万馀人 ,虽然这是 PD 公益软件 ,但是该作
          者所收到的赞助费只千元不到 ,也难怪作者写到后
          来有无力感。
          (该套软件发行已半年馀 ,该作者铁饿死)
  如果您和我一样都已会赚钱 ,那么也请您赶快洗掉拷贝版 ,改用原版磁
  片,不但有售后服务 ,也能促进软件发展 ,使更多人投入软件开发的行列
  ,灭绝病毒传染途迳。拷贝教程第八集
 
    由于上次弟的软件失败后 ,急忙推出下集 ,所以显得比较简陋 ,请多包涵。
  原因是弟本来想写无缝锁程序 ,无耐该种软件只有360K DRIVER 能做出来,
  于是弟又将作品抽回来 ,因此弟在此简介如何制作无缝锁吧 !
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  FORMAT 的部份 :
    先将磁盘 ID 设定好 ,然后 FORMAT 即可....
    有关于磁盘 ID 的部份 ,请参考前几集。
    FORMAT 就使用 INT 13h 即可 ....
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  读取数据部份 :
  0000:0522 这个位址一般都是 02 ,代表扇区 N 值等于 2(512Bytes)
  但是如果您将它改为 6 ,就能够读出该种扇区内的数据 (请参考第五集)
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  ※ 弟附上一个软件 ,是一个软件保护的实例 ,让各位练习使用。
  FORMAT.EXE 这是一个用来格式化您的磁盘片 ,在您执行这个软件前 ,请在
  软驱A放入一片您不要的磁盘 ,然后再执行这个软件 ,于是它会在第27h
  (39道)的地方做一个额外扇区FFh的扇区 ,一般的拷贝程序无法拷贝该种特
  别的扇区(COPYWRIT、COPYIIPC 等强拷软件除外) ,于是可达到您的磁盘保
  护的目地 ,因此本程序只能当做一种在磁盘上做标记的程序。
  CHECK .EXE 这是用来简查磁盘有没有标记 ,然后判别出结果并显示之。
  换句话说 ,这是一套上保护的软件 ,但是防拷能力并不强 ,只要稍具拷贝能
  力的软件皆能拷下来 ,至于若希望软件不能被拷贝 ,似乎只能借助于外部硬
体才能办得到 ,因此弟只写了简单的程序。��
 
拷贝教程第九集
 
  经过数天来苦心研究后 ,终于发现所写的无缝锁何以不能执行之 ,现在就
  展现在您的眼前 (我花了数天才研读出来..您只要看一遍就懂了)。
  在此为您解说一下磁盘参数吧 ,这个参数对于想玩磁盘保护的人绝对要学
  起来 ,因为懂了它就可以玩出一堆花样来....
  0000:0525h 02h ..... 磁盘的N值 ,用以设定目前读取的ID之N值。
  0000:0526h 12h ..... 每一道18个扇区 ,弟将它改为9,才能正确格式画磁盘。
  请您放一片磁盘(已格式划过的2HD磁盘)到A软驱 ,然后执行 FORN6.EXE
  它就会帮你制造坏磁道(4Fh道第0面)。
  接着执行 SAVEN6.EXE ,它会把坏道存成文件 (DEMO.DAT) 。
  您可以试著看看每次格式划后的坏道数据都不一样 ,拷贝后亦不一样。
您可以用"TYPE DEMO.DAT看到坏道数据 ,这种保护是无法被覆制的。
  解说 (FORMAT-N6) :
   ┌ 将磁盘参数每道有18(12h)个扇区(0000:0526h) ,改为每道有9个扇区
   ├ 然后格式划磁盘
   ├ 将磁盘参数改回正常
   └ 结束程序
  解说 (SAVE-N6) :
   ┌ 将磁盘参数N值由2改为6
   ├ 读取最后一个扇区 ,放到 Buffers
   ├ 将 Buffers 的数据存盘 (DEMO.DAT)
   └ 结束程序
  解说磁盘格式 :
    前几集我们曾经讨论过磁盘格式 ,但由于太精简 ,有些人可能一知半解
  所以重新再说明一次。
  所以重新再说明一次。
   2D : 每片有39个磁道 ,每个磁道又分为8个扇区(DOS2.0版本)
                     9个扇区(DOS3.0以上版本)
      但是一般360K软驱可以控制到41道 ,于是也有人多用此磁道 ,变成
      额外的磁道保护。
   2HD : 每片有79个磁道 ,每个磁道又分为18个扇区(DOS3.1以上版本)
      但是一般1.2MB软驱可以控制到81道 ,于是也有人多用此磁道 ,变成
      额外的磁道保护。
  扇区 : 每个扇区又有分为 T.H.R.N ,就相当于是该扇区的目录一样 ,记录了
      T = 磁道 ,H = 面 , R = 第几号扇区 , N = 2 扇区有 200h Bytes
      (N=3 400hBytes N=4 800hBytes N=5 1000hBytes N=6 2000hBytes)
      这个目录总称 ID 。
  正常的一片 2D 磁盘 27h 道第0面的 ID 应该是 :
      T. H. R. N.
      27,00,01,02 ┐
      27,00,02,02 ┃ 这个目录(ID)就是这条
      27,00,03,02 ┃ 磁道的所有东西。
      27,00,04,02 ┃
      27,00,05,02 ┃ 每个扇区可放 512Bytes
      27,00,06,02 ┃       (200h)Bytes
      27,00,07,02 ┃
      27,00,08,02 ┃
      27,00,09,02 ┘
  或许你已发现了 ,这条磁道总容量是 1800h Bytes ,而如果 N=6 就有 2000h
  Bytes ,于是当您读取这个磁道 ,就会读取超过该磁道的容量 ,将其磁道接缝
  处顺便读出来 ,而一般软驱无法处里此接缝 ,因此也就无法拷贝。
  接缝 : 磁盘上有一个索引孔 ,当软驱读到这个孔就会开始做读写工作 ,直
      到该工作做完为止 ,但是不可能整圈磁道全用完 ,于是造成将这未读
      写完的部份扇区(俗称接缝)。
      软驱的磁头在写入时 ,磁头都会加以磁化 ,但磁性物体不可能通电
      后马上有磁性 ,断电后马上没有磁性 ,由于这个剩磁 ,将接缝的数据
      变动到 (因为写完数据后磁头仍会在该道停留到遇到下一次索引孔为
      止),这个磁性绝对无法用软件加以控制 ,所以市面上也就没有东西可
      以拷贝它。
 
拷贝教程第十集
 
据说 KeyPro 保护是用某种专上此种保护的软件上的,所以应该大同小异。
某种以 KeyPro 保护的雷射印表软件 ,兹以原版与解密版说明之 :
A>DEBUG JM.EXE
-u CS:C560 (原版)
15C3:C560 9A0C003C23  CALL  233C:000C  ━使用INT17h将KeyPro数据读出
15C3:C565 2E      CS:         ┐
15C3:C566 01066901   ADD   [0169],AX  ┃
15C3:C56A D0E0     SHL   AL,1    ┃
15C3:C56C D0E0     SHL   AL,1    ┃
15C3:C56E D0E0     SHL   AL,1    ┃运算和数据比对
15C3:C570 D0E0     SHL   AL,1    ┃
15C3:C572 2E      CS:         ┃
15C3:C573 01066901   ADD   [0169],AX  ┃
15C3:C577 50      PUSH  AX     ┃
15C3:C578 59      POP   CX     ┃
15C3:C579 2E      CS:         ┃
15C3:C57A 2906038D   SUB   [8D03],AX  ┃
15C3:C57E 3C00     CMP   AL,00    ┃
15C3:C580 751E     JNZ   C5A0    ┘
15C3:C582 B402     MOV   AH,02
15C3:C584 9A0C003C23  CALL  233C:000C
15C3:C589 8AE6     MOV   AH,DH
15C3:C58B E89805    CALL  CB26
15C3:C58E A3F2CD    MOV   [CDF2],AX
-u CS:C560 (解密版)
15C3:C560 9A0C003C23  CALL  233C:000C ━ 读数据(读不到)
15C3:C565 90      NOP          ┐
15C3:C566 31C0     XOR   AX,AX     ┃已知数据运算的 AX=0
15C3:C568 2E      CS:          ┃所以帮它运算。
15C3:C569 01066901   ADD   [0169],AX   ┘
15C3:C56D 90      NOP
15C3:C56E 90      NOP
15C3:C56F 90      NOP
15C3:C570 90      NOP
15C3:C571 90      NOP
15C3:C572 2E      CS:
15C3:C573 01066901   ADD   [0169],AX  ┐
15C3:C577 50      PUSH  AX     ┃
15C3:C578 59      POP   CX     ┃ 以下运算式因只用到 AX
15C3:C579 2E      CS:         ┃ 故不修改其内容
15C3:C57A 2906038D   SUB   [8D03],AX  ┃
15C3:C57E 3C00     CMP   AL,00    ┃
15C3:C580 751E     JNZ   C5A0    ↓
15C3:C582 B402     MOV   AH,02
15C3:C584 9A0C003C23  CALL  233C:000C
15C3:C589 8AE6     MOV   AH,DH
15C3:C58B E89805    CALL  CB26
15C3:C58E A3F2CD    MOV   [CDF2],AX
现在的软件保护,实在越来越厉害,实在可以这样说 :
   解读不易,解密更难,所有保护,专攻DEBUG,防止破X
========================================================================
由于时间关系,本篇稍嫌简陋,由于弟的功力有限,下回应该会更精彩一些。
拷贝教程到此算是暂时告一段落了 ,原因是题裁取得不易 ,软件防破能力太强
,因此对于开站的我已无多的时间慢慢 Debug ,只好告诉各位未来续出的时间可
能会每1-2个月出一次 ,也希望各位大爷忍耐一些 ,所以先告诉各位一些主意 ,
就是对于防拷不必花时间去解 ,只要您写个小程序即可解所有 Int13 的保护 ,
1. 拦截 INT13h ,对于来自非DOS调用的时后 ,即将所读到的数据存盘 ,以备下
  次拷贝版使用。
 (判别是否DOS调用 ,只要判别触动INT13时的CS是否小于自己程序的CS可得知)
2. 同上 ,但这次是将存的文件读出来。
这个程序已有人写出来 ,由于该软件并非弟所写 ,故无 Source. 可给您 ,几乎
所有的软件都可解。
SAVE.EXE 是负责 SAVE 坏道的东西 ,键入后再输入文件名 ,如 C:\A.LOK ,然后执
行原版磁盘 ,这时原版磁盘一边执行 ,一边将坏道数据存盘 ,最后程序执行了 ,
您的硬盘也有保护道数据了。
重新开机 ,清掉 SAVE.EXE。
LOAD.EXE 是负责将坏道数据放回去的 ,键入后再输入文件名 ,如 C:\A.LOK ,然后
就可以执行拷贝版了。
由于关系重大 ,只有赞助本站 User 可拿到软件 ,赞助者亦不可传至它站 ,否则
后果自行负责。
※ 以上软件若有闪失 ,概不负责。
 
拷贝教程第十一集
 
INT_13h 所有功能涵数之解说如下∶
1. AH=00 (重置磁盘系统)  ┐
2. AH=01 (取得磁盘状态)  ┃
3. AH=02 (读取扇区数据)  ┃由于一般 DOS 书籍已有介
4. AH=03 (写入扇区数据)  ┃绍 ,故不再多谈。
5. AH=04 (验证扇区好坏)  ┃
6. AH=05 ( 格式化磁道 )  ┘
7.  AH=06 格式化损坏的扇区 (PC/XT HD Only)
   AL=扇区数
   CH=磁柱号码
   DH=磁头
   DL=软驱 (80h-FFh)
返回代码 :
   成功进位旗标为零 ,AH=00
   失败进位旗标为壹 ,AH=状态 (参考AH=01)
8.  AH=07 格式化软驱 (PC/XT HD Only)
   同 AH=06 ,但会从指定之磁柱起开始格式化
9.  AH=08 取得磁盘参数 (PC/AT PS/2)
   DL=软驱 (软盘 00-7F ,硬盘 80-FF)
返回代码 :
   成功则进位码被清除
   BL=软驱种类
    01 360 KB ,40道 , 5.25寸
    02 1.2 MB ,80道 , 5.25寸
    03 720 KB ,80道 , 3.5 寸
    04 1.44MB ,80道 , 3.5 寸
  CH & CL = 最大磁道数之 "低.高位元
   DH=磁头数
   DL=软驱数目
   ESI 软驱参数表的 [分段:差距]
   失败 (同AH=07)
10  AH=09 (重设磁盘的特性)
   DL=软驱码 (PC/AT PS/2 HD Only)
   INT_41h 需指向磁盘(HD)0的参数表
   INT_46h 需指向磁盘(HD)1的参数表
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
11  AH=0A 0B (读/写延伸扇区 HD Only)
   AL=扇区数
   CH=磁道
   CL=扇区
   DH=磁头
   DL=软驱 (80h-FFh)
   ES:BX = 缓冲区
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
12. AH=0C (磁头定位,但不读写数据)
   CX=磁道编号
   DH=磁头
   DL=软驱 (80h-FFh)
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
13. AH=0D (同 AH=00 只是仅将 HD 磁头拉到第0道)
   AL=软驱代码
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
14. AH=0E 0F(读/写磁盘控制卡上的数据)
   ES:BX 缓冲区
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
   只是将卡上的 BUFFERS 数据读出 & 写入BUFFER ,并不会动软驱
15. AH=10 (TEST)
   DL=软驱 (80h-FFh HD Only)
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
16. AH=11 (同 AH=00 只是仅将 HD 磁头拉到第0道)
   AL=软驱代码
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
17. AH=12 (PC/XT HD CONTROL CARD RAM TEST)
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
18. AH=13 (PC/XT HD CONTROL CARD TEST)
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
19. AH=14 (PC/AT HD CONTROL CARD ALL TEST)
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
20. AH=15 取得磁盘种类
   DL=(软盘00-7Fh ,硬盘80h-FFh)
返回代码 :
   成功 清除进位旗
   AH=00 没有磁盘
    01 没有支援变更列的软盘
    02  有支援变更列的软盘
    03 若是硬盘 ,CXX 长512位元组扇区数
   失败 AH=状态 (参考书籍 AH=01)
21. AH=16 测试磁盘是否抽换过 PC/AT Only
   DL=软驱 (00-7F)
返回代码 :
   AH=00 未抽换 清除进位
   AH=06 已抽换 设定进位
22. AH=17 设定磁盘种类
   AL=00 未用
    01 320/360KB 软盘 (使用360KB驱动器)
    02 320/360KB 软盘 (使用1.2MB驱动器)
    03 1.2MB   软盘 (使用1.2MB驱动器)
    04 720KB   软盘 (使用720KB驱动器)
   DL=软驱 (00-7F)
返回代码 :
   成功 AH=00 ,清除进位
   失败 AH=状态 (参考书籍 AH=01)
23. AH=18 设定储存媒体种类 (略)
24. AH=19 PARK (PS/2 Only)
   DL=软驱
25. AH=1A FORMAT ESDI HD
 
拷贝教程第十二集
 
前言 :
 市面上有个超级磁盘机 ,这是 陈宏然先生的作品 ,但是所支援的功能有限
所以特别制作了以下三个文件 ,将有利于使用者解密软件。
13H.EXE :
  这个软件载入后会拦截 INT_13h ,然后当有人触动这个中断即会显示 ,
 换句话说 ,可用它来观看磁盘运作 ,与所下参数。
 例如观查 PCTOOLS 如何检测磁盘片格式 ,1.2软驱做FORMAT 360K..
UNDOS13.EXE :
  这个软件平常在触动 INT_13h 时并不会显示出 ,除非是来自非 DOS 本
 身的调用才会显示给您看 ,例如使用 PCTOOLS.EXE 动到磁盘 , 拷贝工具
 等等才会显示 ,如果您执行有防拷的软件 ,那么将只显示被上防拷的坏道
  ,换据话说 ,您可以利用它来解防拷 ,只要写个常驻程序 ,拦截 INT_13h
 和比对刚才显示过的坏道 ,若相同则将坏道数据送到它指定的记忆体位置
 (参考第五集) ,这样子的话几乎无所不拷。
PU13.EXE :
  这个软件和 UNDOS13.EXE 完全相同 ,只是每次拦到来自非 DOS 调用的
 INT_13h 就显示给您看 ,并且暂停一下 ,等您按下一个键再继续执行这个
 程序。
以上软件显示若因卷页而消失 ,可按右边的Shift键重新显示。
PS: 这个软件采用记忆体直接显示数据 ,也就是说不会触动 INT_10h 来显
   示字元 ,其中有标出 MGP ,这就是决定单彩色版 ,单色时 video=B000
   彩色时 video=B800。

地主 发表时间: 06-11-03 10:11

回复: xky [yfnt]   论坛用户   登录
再接着发啊,或者是发到我的油箱
地址是:yfnt2002@yahoo.com.cn


本人将感激不尽.

B1层 发表时间: 06-11-07 11:36

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号