发信人: 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)
页面执行时间:216.951毫秒