荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: samba (木星), 信区: Hacker
标  题: 拷贝心得(2)
发信站: BBS 荔园晨风站 (Thu Sep  9 07:44:11 1999), 转信




    磁碟控制卡上的 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 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 ,因档案过大
             所以未全部压进此档。


--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 202.202.37.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店