发信人: Reinhard.bbs@bbs.sjtu.edu.cn (摘星的人), 信区: cnhacker
标 题: DOS下软件解浅谈 (一) -- Alex 整理(转寄)
发信站: 饮水思源站 (Fri Apr 25 20:07:30 1997)
转信站: Lilac!ustcnews!ustcnews!sjtunews!sjtubbs
出 处: bbs.sjtu.edu.cn
发信人: kevin@SMTH (老人与海), 信区: Hacker
标 题: DOS下软件解浅谈 (一)
发信站: 水木清华 (Mon Nov 6 20:47:08 1995)
转信站: SMTH
DOS下软件解浅谈
| 清华大学 计算机系 何开川 | Email:hyj-dmp@mail.tsinghua.edu.cn
一、概述∶
在当今五彩缤纷的软件世界里,有很多被加过密的软件,给软件的使用和
研究带来诸多不便,然而由于软件保护法的推行需要一定时间,软件开发商们为
了维护自身的利益,不可能在短时间内放弃对软件的加密。因此为了更好地利用
现有软件和研究软件技术,我们有必要对软件的加解密知识有所了解。
考虑到读者大多对软件解密不太了解,本文仅以比较简单的DOS下软件
解密(特别是游戏软件的PASSWORD的解拆)为对象,向大家介绍一下软件解密
的基本思路。
二、有关的基础知识∶
应该说,在任何操作系统下的解密工作都是建立在对此操作系统的高度
熟悉的基础上的。你对系统的原理理解的越透彻,在进行剖析解密之类的工作时
也就越如鱼得水。当然,仅仅为了解一些简单的DOS下软件,也没有必要完整地
研究DOS的体系结构,但下列BASIC KNOWLEDGE不可不知∶
1)DOS的中断机制∶
Intel80X86处理器系列藉助于一张256个四字节向量的
中断向量表提供最多256种不同中断动作的服务能力。这张表存在实地址的
0∶0-0∶256处。每个向量由32位的地址组成,形成对相应中断作出响
应时自动调用的例程的"段址∶偏址"
触发这样一个例程有3种方式∶⑴由处理器芯片本身从内部产生;
⑵由外部中断请求信号产生(所谓的"硬中断");⑶由一条软中断(INT)
指令产生。我们关心的通常是后两种。
最常用的中断有∶
⑴ INT 9∶
键盘硬中断,每当有键按下时自动产生。游戏程序常接管此中断。
(2) INT 10∶
BIOS的显示中断例程,当软件改变屏幕模式或做屏幕显示时常调中
断。
⑶ INT 13∶
BIOS的磁盘低级输入、输出服务例程。有些加密软件把密钥信息存
在磁盘上,则其在运行时常会调此中断。
INT13 AH=02
目的∶ 读绝对扇区入内存。
入口参数∶ AL=要读扇区数
CH=磁道号或
柱面号8低位 (对硬盘)
CL=扇区号(bit0-bit5)
柱面号高2位(bit6-bit7) (对硬盘)
DH=磁头号
DL=驱动器号 (00H∶A驱,01H∶B驱 80H∶C盘)
ES∶BX 数据缓冲区
返回∶ CF置位-- 出错
CF 清零 -- 成功
⑷ INT 16∶
BIOS提供的键盘服务软中断,程序通常主动调此中断以读取键盘状
态。
INT16 AH=00H:
目的∶ 得到击键状态。
返回∶ AX=扫描码
AL=ASCII字符
INT16 AH=01H
目的∶检查是否有有效击键。
返回∶ ZF置位 -- 无有效击键
ZF清零 -- 若击键有效,此时∶AH=扫描码, AL=ASCII字符
INT16 AH=02H
目的∶返回BIOS保存的状态键的按下状态。
返回 ∶AL=状态键的标志位。
⑸ INT 40
可看作是INT 13的一个子集,它只提供软盘的中断例程,其调用接口与
INT13基本相同。
⑹ INT 33
鼠标服务例程。
INT33 AX=0003H
目的∶ 返回位置和按钮状态。
返回∶ BX=按钮状态
bit0:左按钮按下;
bit1:右按扭按下;
bit2:中按扭按下;
CX=列坐标;
DX=行坐标。
⑺ INT 21
DOS编程的最主要的API,最好都有所了解。
INT21 AH=3D
目的∶ 打开文件(句柄方式)
入口参数∶AL∶访问方式
DS∶DX 指向ASCIIZ文件名字符串。
INT21 AH=4B
目的∶ 执行程序(EXEC)
入口参数∶ AL--执行方式
ES∶BX--参数块指针
DS∶DX--指向EXEC的结构指针,
其中的偏移04H∶指向程序名的
ASCIIZ字符
串
INT21 AH=4CH
目的∶ 带返回码的程序中止。
2) Assembler语言∶
我们都知道,汇编语言是直接与CPU对话的最低级的语言,也是我们在
解密过程中唯一可以看到的语言形式。因此对汇编语言程序设计的基本了解是解
密必不可少的基础。
3)其它∶
由于本文意不在讲述DOS编程,因此还有很多相关知识没有列出,读
者若有兴趣深如研究DOS,不妨参考下列书籍∶
《深入DOS编程》--求伯君
《PC INTERRUPTS》-- Ralf Brown & Jim Kyle
《Advanced MS-DOS Programming》-- Ray Duncan
三、解密工具∶
“.工欲善其事,必先利其器",软件解密的实现在很大程度上依赖于强
有力的工具软件,下面介绍一下DOS下解密用的常见工具∶
1)DEBUG∶
虽说土了点,但DEBUG毕竟是各类工具程序的鼻祖,也是早期
解密者的唯一工具。不过,时至今日,DEBUG早已过时,除非要体会用石头
和木棒作战的辛苦,否则还是换一个先进点的调试器为好。
2)GAME BUSTER 4.0∶
我不用说大家也都明白了,GB4一向被游戏玩家视为工具经典,
其实它在解密场合也可派上用场。 (详见"实例分析")
3)GAME TOOL 3.0∶
Game Tool 亦为一个与Game Buster相仿的"游戏改命工具",但值得
一提的是它的新版本中带了一个Internal Debug非常好使, 可在找到存命单元后
直接在上面设内存断点,然后跟踪追击找到减命指令,从而把游戏改为"不死
版"。遗憾的是其内置 DEBUG目前还不支持A(汇编)指令,好在其漂亮的彩
色U(反汇编)指令算是对此做出了补偿。
4) PCTOOLS/NORTON UTILITIES:
很多加密、解密的初学者似乎很喜欢用这两种工具对公用机房的分区
表、子目录做些手脚。其实这两种工具的真正用途在与"数据修复"和"反病毒"等
等,用在解密过程中通常是作为程序的PATCH(修补)工具。
5)TURBO DEBUG
对BORLAND公司有感情的用户对这个名字应该不会陌生,
TURBO DEBUG 在DOS的调试器里"界面"算是一流的,它的优点在于调
BORLAND系列的目标代码,特别是调高级语言,用于调解密时的机器码则显得
不够灵活。
6)Soft Ice for Dos:
如果说上面所述的各种调试器各有所长的话,那么NuMega
Technologies公司的Soft-Ice可谓是集调试器之大成者,它充分发挥了80386的
保护模式特性,例如分页、I/O特权级、断点寄存器........,来实现对程序的硬件
级动态调试,而不需额外的电路嵌入式仿真器(ICE),这也正是Soft Ice名字的由
来。 SOFT ICE 有命令行装入和作为设备驱动程序装入两种装入方式 ,利用后
者装入时可以发挥其全部特性。
下面对 SOFT ICE 功能作简要介绍∶
一般调试器只有一种中断程序的方法,即在特定的代码处设置断点;有
的调试器(TURBO DEBUG)虽能用键盘把当前程序中断,但由于优先级太低,常
常在想断的时候断不下来。而SOFT-ICE 是以虚拟机方式运行DOS,工作在
DOS之上,所以凡是DOS实模式的程序几乎没有断不下来的。
SOFT ICE 支持DEBUG的所有命(除N、L、W)外, 而且提供了功能
强大的断点命令∶
⑴BPM:
语法∶ BPM [size] address
size:B、W、D分别代表Byte,Word,Double Word
功能 ∶ 在指定内存处设读、写断点
举例∶ bpm ds:1234 (ds=2000)
当地址2000∶1234处的BYTE被、写时激活断点。
⑵ BPR:
语法∶ BPR start-address end-address [verb]
verb: R,W,RW,T,TW (R、W代表读、写;T代表跟踪)
功能∶ 设内存范围断点,利用其中的T或TW选项可以实现"逆指令流"
跟踪的高级调试方法。
⑶ BPIO:
语法∶BPIO port
功能∶在I、O端口上设断点。
举例∶BPIO 378 在端口378H设断点。
这条在解软件狗、加密卡等利用外设加密的软件时非常有用,如果
在高级操作(DOS、BIOS调用)中没有发现程序的加密方法,可以通过设I/O断
点来进行更深入的考察。
⑷ BPINT
语法∶BPINT int-number [<AL|AH|AX>=value]
功能∶在中断上设断点。
距例∶ BPINT 13 AX=0201 当对BIOS的13号中断得功能02(读盘)发出
调用时激活断点;
BPINT 21 AH=3D 当用INT21H打开文件时激活断点。
此命令是最常用的断点命令,用于在某一中断号上设断点,有与DOS编程
要频繁地调用DOS、BIOS中断,因此对中断进行监视,就可对程序的来龙去
脉有一个大至的把握。
⑸ 其它命令∶
EXIT:用于强迫从当前DOS程序退出。
VECS∶显示中断向量列表。
MAP∶查看DOS的内存图(MCB链)
? 或 H∶联机帮助,对其它诸多命令,可以通过帮助了解其用法。
--
沉默的人
Reinhard Young
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.96.212.29]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:202.987毫秒