建立先进理念和体系,创造更好技术和工艺,开创不凡业绩和局面

当前位置:首页>芯片解密>浏览正文

软件狗[Dongles]的加密与解密技术(3)

来源:龙人计算机研究所 作者:站长 时间:2006-11-04 11:30:50

软件狗[Dongles]的加密与解密技术(3)

三、操作指南

1、BITSHELL参数的详细说明

BITSHELL可以用KEY环境变量来设定一些参数,这样可以简化使用过程。设置方法如下:

SET KEY=[SCHEMExx,][STAY,][CHECKOVL]

BITSHELL各项参数的意义如下:

(1)参数SCHEMExx,若给出则依用户的要求使用指定的变形算法,否则将随机抽取一种加密算法。BITSHELL2.0共有20种算法可选。

每一种算法都有自己的特点,有的加密难度大但解码时间长,这种算法适合加密重要的代码不是特别大的软件,如算法三和十二;还有的加密难度适中但解码速度快,如算法一,适合加密大型软件。

每个用户可以根据自己的特点选择,如加密不同的版本用不同的算法,加密不同的程序用不同的算法。如选算法十五可给出SCHEME15,选算法十九可给出SCHMEM19等,依次类推。

(2)参数STAY用来选择在加密程序执行完毕后,是否驻留监控程序。默认值为不驻留监控。

如果加密FoxPro编译的程序,必须加参数SET KEY=STAY,以监控覆盖模块。

(3)参数CHECKVOL如果被加密的程序中有覆盖模块,此参数是用来选择是否检查覆盖模块。对于用CLIPPER编译出来的软件,加密时设置该参数非常有必要。默认值不检查覆盖模块。

BITSHELL参数都是可选的,如果不设置,都有相应的默认值。默认的设置为:

(1)SCHEME为随机挑选算法
(2)不驻留检测程序(加密FoxPro编译的软件,设定为驻留检测)
(3)不检查覆盖模块

2、使用BITSHELL

BITSHELL的商品盘是加密的,用户可以将其安装在NOVELL网络服务器上使用,源盘不能复制。如果只是临时使用一次也可不用安装,将BITSHELL源盘放入软驱中直接使用。方法:

BITSHELL<源程序>[<目标程序>]

如果不设置目标程序,加密的结果直接覆盖在源程序上。加密所用算法可用环境变量KEY来设置。

例如:①BITSHELL C:TEST.EXE
②BITSHELL TEST.EXE SAMPLE.EXE
③A:BITSHELL D:TEST.EXE C:TEST.EXE

其中<源程序>是需要加密的程序路径名。源文件必须是可执行文件以COM或EXE为后缀。如果缺省<目标程序>则直接在<源程序>上加密。如果还想保留未加密的程序,就不要缺省<目标程序>,并且保证源程序名与目标程序名不同。

[说明]
(1)BITSHELL系统本身是加密的,不能复制。
(2)经BITSHELL加密的软件,可以拷贝,散发,任意运行,除非被加密的程序有自己的反拷贝介质。
(3)经BITSHELL加密的软件不能还原为未加密状态。
(4)经BITSHELL加密的软件无法跟踪,无法反汇编。

四、BITSHELL高级技巧

1、源程序嵌入式保护措施

软件开发者在其软件开发完成以后,再在关键地方链入以下函数。当链接成功后,用BITSHELL.EXE将用户软件加密。这套被加密的软件运行时,就可以检测该程序是否被解密修改,以采取响应的反击措施,如拒绝执行等等。

用户可参考以下流程加密:

(1)将自己的软件(SAMPLE.C)编好,调试通过。

SAMPLE.C
#include<stdio.h>
main()
{
printf("This is my sample program! \n");
}

(2)在SAMPLE.C重要的地方调用加密函数。

SAMPLE.C
#include<stdio.h>
main()
{
/* Insert BITSHELL function call */
id (BL_ComeIn()==0)
{
printf("Error! \n")
return(255);

printf("Thin is my sample program! \n");}

(3)编译SAMPLE.C成为SAMPLE.OBJ后,再将SAMPLE.OBJ和BLOBJ.OBJ链接成SAMPLE.EXE。
QCL /AL SAMPLE.C BLOBJ.OBJ

(4)用BITSHELL加密,键入命令执行:
BITSHELL SAMPLE.EXE SALE.EXE
软件加密过程完成了!
如果被加密的程序SALE.EXE被解密或修改,就会提示错误,然后退出。

2、使用BITSHELL须知
请不要使用PKLITE,LZEXE或EXEPACK进行压缩商品程序。
建议高级语言程序设计者,如有可能将所用程序设计语言的启动代码作修改,改变程序的入口点,避免被截获。在程序内部识别BITSHELL的嵌入式模块最好采用随机调用。

加密时用环境变量指定参数。生产一批软件,用同一种变形算法,万一软件有漏洞,新版本的软件可换一种变形算法。加密后的文件放在硬盘上,可提高加密速度。超大文件加密后,再用PKZIP等压缩后,放入商品软件盘上。

3、注意事项

(1)运行BITSHELL系统,或运行经BITSHELL加密的程序系统,如果安装了驻留型的调试跟踪器(如:Soft-ICE,GameBuster等),请先拆除之,否则程序将拒绝运行,因为这样有跟踪解密的嫌疑。

(2)使用BITSHELL加密商品软件的开发者,不要将BITSHELL系统盘上的任何文件和信息,以任何方式提供给最终用户。不要将自己所用的BITSHELL的版本,序列号和变形算法透漏出去。

五、系统提供的可链接函数

函数BL-ComeIn(BLOBJ.OBJ).........................[1]
C语言说明:
extern unsigned long BL_ComeIn(void);
说明:
利用这个函数可判断是否运行过反跟踪程序,同时还返回程序的PSP段地址和机器的ROM检查和,供用户程序进一步检查。这是一个与加密外壳相关的函数,这样可使用户程序与加密软件融为一体。对PSP段地址和ROM检查和的判断不要隔的太近。
入口参数:无
出口参数:如果出错,返回 0FFFFFFFFH ;
(DX:AX=0FFFFFFFFH)
如果成功,返回一个无符号的长字。
其中:
低字节是ROM检查和,高字是PSP段地址。
(AL=ROM检查和,DX=PSP段地址)
注意:ROM检查和计算方法:
累加ROM(0xF000:0xE000)处开始字节,长度为0x100。
获取PSP段地址方法:
MOV AH,62H
INT 21H
BX就是该程序的PSP段地址。
调用建议:
不要每次运行都去检查该函数,用适当频率、在关键的地方调用这个函数。

C Usage Example:
/*
* function:BL_ComeIn
*/

extern unsigend long far BL_ComeIn(void);
/* Error return 0xFFFFFFFF,Success Return
* Lo Byte is checksum,Hi Word is PSP segment
*/

void My_BL_ComeIn()
{
unsigned long ComeIn;
unsigned short int ROM_CheckSum;
unsigned int PSPsegment;
ComeIn=BL_ComeIn();
if (ComeIn==0xffffffff)
{
printf("\nERROR:not loaded from BITSHELL shell ! \n");
{
else
{
ROM_CheckSum=ComeIn&0xff;
PSPsegment =ComeIn>>16;
printf("nBITSHELL On Entry:\N");
printf("ROM checksum is %x\nh",ROM_CheckSum);
printf("PSP segment is %xh\n",PSPsegment);

inregs.h.ah=0x62;
intdos(&inregs,$outregs);
printf("n This program PSP segment is %xh\n",outregs.x.bx);
{
{