⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosje.txt

📁 关于黑客的论坛的下载资料
💻 TXT
📖 第 1 页 / 共 2 页
字号:

                       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∶联机帮助,对其它诸多命令,可以通过帮助了解其用法。
                                DOS下软件解浅谈  (二)
| 清华大学 计算机科学与技术系  何开川                                                           
| EMAIL:hyj-dmp@mail.tsinghua.edu.cn

四、解密 = 跟踪 ?
                如果要用两个字概括解密的实质的话,那就是∶跟踪;是的,就是跟踪。
我们在调试一般程序的时候也需要跟踪,但两者的目的是不尽相同的。后者是为
了排错、而前者是为了窥探,具体地说,就是找出程序在哪儿加的密、如何加的,
从而找到"修改点",以便将其改为解密版。
                先介绍解密的几条思路∶
 1)从头至尾式∶
                        拿到一个软件,从第一条指令开始,逐条跟踪,直至找到"修改
点",这就是最基本的解密方法。但要注意,跟踪过程中应采取"先粗后细,偶
而回溯"的方针。比如下面一段程序∶
                        
                *                       *                          *
         Initialize
                    |               
           V
        Call Module1
                   |
                     V   
        Call Module2-->Call Module3 
                    |                   |
                    V                   V 
                  ...      Call Module4 -> Call  Module 5
                                                    |
|
                                                    V                        
                                              检查Password                                                             Or   ax,ax
        我们要找的修改点 ======>     jz  游戏入口
                                          jnz 显示"Password" 不对 
                                                                                                                                   ...               
                          *                     *                       *                               
  我们要找的"修改点"藏在Module 4里面,如果我们从Module1开始一条一条
跟的话,恐怕要看几千条指令,但如果我们按"先粗后细"的原则,先用P 命令,
即Step方式跟踪,当发现Step过Module2时,游戏已检查过Password,说明跟"过"
了,于是用"偶而回溯"策略,从新执行程序,这次跟入Module2, 再用P粗
线条跟踪,发现Step过Module4后又错过了"修改点",于是返回头来跟入Module4,
这次终于发现在一处由 Or  ax,ax /  jz  XXXX  产生的分支与程序是否"认
为"Password正确直接相关,不妨试着把jz  XXXX改为jmp XXXX--成功了,
游戏已正常进入主画面。这说明我们找到了"修改点",解密的主要工作也就完成
了,关于如何把这一修改"固化"下来,参见后文。

2)中途拦截式∶
        抗日影片《铁道游击队》中,机警勇敢的游击队战士在同日寇交锋时常
常不是正面进攻,而是早早地埋伏在铁路旁,等敌人的火车经过时,给它来个"
中途拦截",从而达到出其不意的制胜效果。 在软件解密的过程中亦有同样的战
术∶拿到一个软件后,先不忙着从头跟起,而是考虑一下,有没有办法跳过程序
的初始化部分,直接切入程序判断密钥的"关键点"或是"关键点"附近的部分。若
是存在这样的捷径,就可省去不少跟踪之苦。
        这里,仅以解拆游戏PASSWORD为例。让我们思考这样一个问题∶程

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -