你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
软件加密解密之动态跟踪
 

  :本文对动态跟踪技术的原理和可行性作了全面的论述,并给出了综合实例、实验方法及实验结果。

关键词动态跟踪  软件加密  软件解密

 

一、前言

软件加密和解密是建立在同一理论基础上的一对矛盾,它们既互相对立又相互促进。加密和解密技术经过多年的发展与应用,已趋于成熟,深入了解软件的加密和解密技术,对提高自己的编程能力和思考能力大有益处。

本文通过分析常用的加密方法和磁盘操作的特点,详细介绍动态跟踪技术的原理与实现方法。

二、常用的软件加密方法

软件加密是指用户或软件厂商为了保护自己信息的隐秘性和完整性,采用相应的加密措施,这是一种信息保护的有效手段。目前通用的加密技术主要包括两大类,一是基于密码学理论,如私钥加密、公钥加密等;二是利用存储介质和硬件设备的特性来防止非法拷贝,如磁盘加密、加密狗等。其中磁盘加密应用得最为普遍。

操作系统在格式化和读写软盘均采用默认的标准格式,如1.44MB软盘的标准格式为:双面、80道、每道18扇区、每扇区512字节,也就是说操作系统要求0C≤79H=011≤R≤18N=2。如果在KEY盘中建立一些不符合这一格式的特殊扇区,并在特殊扇区中或扇区与扇区之间保存关键信息,在应用程序运行或安装时,用相应的方法读出关键信息,以验证KEY盘是否合法。由于操作系统无法对特殊扇区进行读写操作,只要这些扇区不能被破译者复制(不是绝对不能,而是很难),就能有效地防止非法拷贝,起到加密的作用。

建立特殊扇区的方法很多,常用的有:利用内圈磁道(磁道号大于79)、超级扇区(字节数大于512)、加长磁道(缩短扇区间隔的长度)、道间加密(低密度软盘的两个磁道间隐藏了一个高密磁道)、接缝加密(利用磁道头尾相接处的噪声信息)等。利用盘基参数表和INT 13H的参数可自行设置的特点,可建立多种格式的特殊扇区。大多数情况下,都是将以上方法组合使用,并辅以适当的反跟踪手段,以增加破译难度。

三、常用的软件解密方法

尽管磁盘加密的方法多种多样,但加密的关键信息一定存在磁盘的某些特定的扇中,而且加密软件对磁盘的读写操作都是通过BIOSINT 13H功能调用。

软件解密的过程实际上就是找出保存加密信息的特殊扇区号和扇区格式,并制作相同或相似的KEY盘(也可开发相应的免KEY盘软件)实现软件的解密。寻找特殊扇区的方法通常有以下三种:

1代码分析法:用DEBUG跟踪或分析加密软件,这种方法适合破解用汇编语言编写的程序,它的不足之处在于工作量大而且成功率较低;

2静态分析法:编制磁盘分析工具,对所有可能的扇区号(2*80*19*256*7=5447680个)进行读操作,找出所有能够被成功读取且与标准格式不符的扇区,这些扇区就是用于加密或干扰破译的扇区,这种方法耗时巨大,且对软驱有一定的伤害,只适合于对怀疑区域进行局部分析;

3动态跟踪法:在程序运行期间监视软驱的读写操作,记录INT 13H的入口参数和盘基参数表,此方法高效准确,适合破解各种复杂的加密软件,是本文介绍的重点。

四、动态跟踪的原理

用软盘加密的应用软件在运行或安装时,均要读写软盘以验证KEY盘的合法性,绝大多数的软件都是通过调用INT 13H(或INT 40H)中断服务程序来读写磁盘。根据这一特点,我们可以在内存中驻留新的INT 13H服务程序,在实际磁盘操作之前记录特殊扇区号和盘基参数表,从而达到软件解密的目的。由于是在运行期间动态监视软驱的读写操作,所以我们将其称为动态跟踪,其工作流程序可以用下图表示:

 

是软盘吗?

记录扇区号和盘基参数

调用原INT 13H(实际磁盘操作)

 


                              Y

 

 


                              N

 

1 INT 13H中断服务程序流程图

    从流程图可以看出,新的中断服务程序通过监视磁盘操作,在不影响正常磁盘操作的情况下,自动记录软盘操作的相关信息,若加密程序在硬盘中,那么记录的信息即为KEY盘验证的全过程。

五、实现方法

在示例代码中用到了一些相关的Turbo C函数,getvect()与setvect()的功能是获得和设置中断向量;system( )的功能是执行DOS命令,此处用于运行加密程序以便跟踪;fopen( )fwrite( )C语言中文件操作函数。

1.新的中断服务程序

    从以上的分析可以看出,动态跟踪的核心就是改写INT 13H中断服务程序,新的服务程序必须在不影响正常磁盘操作的前提下自动记录特殊扇区号、盘基参数和磁盘操作的结果。在Turbo C语言中,CPU的寄存器除控制寄存器(指令指针寄存器IP和标志寄存器PSW)外可用伪寄存器变量(Pseudo registers)直接存取(如变量_AX_BX等),但是在磁盘操作(特别是加密解密)的结果中,PSW是一个非常重要的信息,为了获取PSW的值,我们在程序中使用了一些技巧,利用Turbo C中断函数的特点,定义中断函数newint,巧妙地读取标志寄存器。动态跟踪的核心代码如下:

void    interrupt newint(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs)

{ /*用于读取标志寄存器*/

    flag=flgs;

}

/*INT 13H服务程序*/

void    interrupt new13(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs)

{

     (*old13)(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs);/*实际磁盘操作*/

     out_ax=_AX;out_cx=_CX;out_dx=_DX;/*保存出口参数*/

     newint();flgs=flag;/*巧取标志寄存器的值*/

     drive=dx&0xff; /*驱动器*/

     record[number].ax=ax; /*记录入口参数*/

     record[number].cx=cx;

     record[number].dx=dx;

     ax=out_ax;cx=out_cx;dx=out_dx;

     if(number<MAXRECORD)

     if((drive==0||drive==1))

      {/*驱动器为AB即软驱时才记录*/

        parameter=MK_FP(peek(0,0x78+2),peek(0,0x78));

        for(p=0;p<11;p++)

         record[number].parameter[p]=parameter[p];/*记录盘基参数*/

        record[number].out_ax=ax;/*记录出口参数*/

        record[number].flags=flgs;/*记录标志寄存器*/

        number++;

      }

}

2.处理中断向量

    在开始跟踪之前用getvect函数保存INT 13H中断服务程序的入口地址(中断向量),并用setvect函数设置新地址;在跟踪结束后再恢复原有的中断向量:

init( ) /*保存和设置中断向量*/

{

    old13=getvect(0x13);

    setvect(0x13,new13);

}

restore( ) /*恢复中断向量*/

{

    setvect(0x13,old13);

}

3.显示并保存跟踪结果

    当被跟踪的程序运行结束时,将跟踪结果在屏幕上显示出以便进一步分析和利用,根据实际需要,还可将其保存在磁盘文件中。

    printf("\nRecord Count=%d\07",number);

    if(number>0)

    {

     printf("\nAX   CX   DX   O_AX PSW  par[11]");

     for(i=0;i<number;i++)

     {

      printf("\n%04x %04x %04x %04x %04x ",

record[i].ax,record[i].cx,record[i].dx,record[i].out_ax,record[i].flags);

      for(j=0;j<11;j++) printf("%02x ",record[i].parameter[j]);

     }

     printf("\n");

     fp=fopen(file_dat,"wb+");

     fwrite(&number,2,1,fp);/*记录加密程序读写特殊扇区的次数*/

     for(i=0;i<number;i++) fwrite(&record[i],sizeof(struct rec),1,fp);

     fclose(fp);

    }

4.实验方法

    为了便于实验,我们编写了一个读盘程序用于模拟实验,模拟实验程序只简单地读0道和40道的第一扇区。实验时可换盘并多次实验,观察显示结果,注意读盘结果和标志寄存器PSW的变化。

/*模拟实验程序disk.c*/

#include <stdio.h>

#include <bios.h>

main()

{

    char    buf[512];

    biosdisk(2,0,0,0,1,1,buf);

    biosdisk(2,0,0,40,1,1,buf);

}

刚插入软盘或换盘时,实验结果如下:

D:\zhiyx\软件加密解密之动态跟踪>tracker disk

Record Count=2

AX  CX   DX   O_AX  PSW  par[11]

0201 0001  0000  0600   3203  df 02 25 02 3f 1b ff 54 f6 0f 08

0201 2801  0000  0001   3202  df 02 25 02 3f 1b ff 54 f6 0f 08

Press any key

再次实验时结果为:

Record Count=2

AX  CX   DX   O_AX  PSW  par[11]

0201 0001  0000  0001   3202  df 02 25 02 3f 1b ff 54 f6 0f 08

0201 2801  0000  0001   3202  df 02 25 02 3f 1b ff 54 f6 0f 08

Press any key

六、结束语

通过分析常用的软件加密方法和磁盘操作的特点,提出了利用中断服务程序进行动态跟踪的解密方法,并给出了相应的程序代码、实验过程序及实验结果。动态跟踪技术的提出和完善,要求从事软件加密工作的程序员或开发商必须进一步提高软件的破译难度,同时重视反跟踪技术的应用。

软件加密和解密技术从来就是一对矛盾,它们互相制约,又互相促进。软件解密技术随软件加密技术而产生,而解密技术的进步又促进了加密技术的发展,这正是我们发表本文的目的。

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089