发信人: shangbings()
整理人: cobe(2001-08-06 13:03:58), 站内信件
|
第四章 程序跟踪的动作
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 ,因文件过大 所以未全部压进此文件。 |
|