|
2、 使用激光穿孔法实现软件防复制加密
这种方法主要是利用程序设计中的“陷阱技术”来实现的。基本设计思路是这样的:在软盘表面穿孔,使部分扇区遭到破坏,这是物理损坏,无法用工具软件修复。设计者在开发软件以前,用通用的检测工具对磁盘表面全面扫描,找到已被损坏的扇区,将它们记录下来,以后设计软件时,只要让软件判断这些扇区是否损坏就能判断软件是否已被复制。
对于生产少量的软件产品而言,这种方法不失为一种经济有效的加密方法,但是如果软件要被大量生产,这种方法就变得更加繁杂:每次穿孔的位置不一定一样,软件所要判断的扇区编号也不一样,实现相当困难,但设计思想是值得借鉴的。
3、 特殊磁道防复制加密技术
虽然激光穿孔技术能达到很好的防复制加密效果,但其实现过程是相当复杂的。特殊磁道防复制加密技术实现简单,也能够很好的对软件起到加密作用。为了简单起见,在此仅对软盘进行讨论。
平时我们所讨论的磁盘扇区都是指的数据区,其实一个扇区由标识区和数据区以及两个间隙组成,一些磁道(柱面)的ID信息被保存在非数据区中。在DOS系统启动的时候,软盘磁盘基数表被装载到起始地址为0000:0525的内存单元中,INT 13H的许多操作都是根据这一基数表来确定扇区大小的。那么,只要我们修改磁盘基数表,再用普通的INT 13H来操作磁盘,就能很容易的将软件密钥写到磁盘扇区间隙处。一般情况下,对于这种特殊扇区,磁盘控制器无法在磁盘上写出,这样,一般的复制程序也就无法将其复制,但在被加密的软件程序中可以将间隙处的密钥作为特殊扇区的一部分读出,判断密钥信息就可以确定软件是否已被复制。
以下是采用这种方法读取一个扇区长为4096B的数据区的例子,读取的是软盘的0面0道,读出的信息被保存在DS段偏移量为1000H的内存单元中。
C:\WINDOWS>debug
-e0000:0525
0000:0525 02.05 3F.01
-a100
1288:0100 mov ax,201
1288:0103 mov bx,1000
1288:0106 mov cx,0
1288:0109 mov dx,0
1288:010C int 13
1288:010E int 3
1288:010F
-g=100
特殊磁道加密是这样实现的:INT 13H AH=05H功能是根据BX所指向的内存单元的参数来对磁盘进行格式化的。上面已经提到,每个扇区都有一个ID,ID是由柱面号、磁头号和扇区字节长度组成,那么只要修改ID参数,并用这种奇特的参数格式化磁盘,就会产生特殊磁道。剩下的工作和对特殊扇区的操作相同:将密钥写入特殊磁道,就能实现软件防复制。下面是一个对360K、DSDD磁盘磁道格式化的C语言函数,其中trktbl数组存放的就是磁盘扇区的ID参数。
int fmt_trk (int dsk, int trk, int head)
{
union REGS regs;
struct SREGS sregs;
char trktbl[36];
int i;
for (i=0;i<9;i++) {
trktbl[i*4] = trk;
trktbl[i*4+1] = head;
trktbl[i*4+2] = i;
trktbl[i*4+3] = 2;
}
regs.h.ah=0x05; regs.h.ch=trk;
regs.h.dh=head; regs.h.dl=dsk;
regs.x.bx=FP_OFF(trktbl); sregs.es=FP_SEG(trktbl);
int86x (0x13, ®s, ®s, &sregs);
return (regs.h.ah);
}
二、Windows系统下软件注册加密技术
1、利用Windows注册表实现软件注册加密
相信大多数软件都是采用这种方法来实现注册功能的。Windows系统注册表信息量相当大,几乎所有Windows系统和计算机系统配置信息都保存在注册表中。如果软件密钥被写入注册表,那么寻找密钥保存位置无异于海底捞针,不采用一定的技术(如线程跟踪等)是无法得到密钥的。
Windows系统注册表有六个主键:HKEY_CLASS_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIG和HKEY_DYN_DATA。每个主键下面又分若干个子键,每个子键下又可新建子键和项,整个注册表呈树状结构。每个项都有名称和值,值可以是二进制、十进制、十六进制和字符串型。
用程序实现注册表的操作是相当简便的。以下Delphi程序段用以在HKEY_CURRENT_USER的子键Software下创建一个名为Arcobet的子键,并将字符串“ChenQingyang”写入该字符串中。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
上一页 [1] [2] [3] 下一页 没有相关教程
|