PDA

查看完整版本 : 转载:软件狗的加密和解密


华亮
2004-10-15, 09:30 PM
1、认识软件狗。

软件狗是插在微机并行口上的一个软件保护装置,它包括主机检查程序和密钥(也称加密盒)两部分。主机检查程序就是前面说的加密代码的一部分,加密盒是用来存放密码的。一般来说,软件狗插在并行口上,不会影响打印机的正常工作。常见的软件狗加密盒外形,如两个一公一母的D行25针连接器倒接在一起,公头(DB25/M)插在并行口上,母头(DB25/F)可接打印机,相当于原来的并行口。整个软件狗的硬件电路板就在这约5厘米见方的加密盒子里。
电路板上的公头(DB25/F)之间的管脚是一一对应、直接相联结的,以保证并行口的作用不变。存储密码或起信号加密变换作用的器件及其它辅助元件就跨接在这25根线上面,应用程序以特定的方式跟他们沟通、核对。除了某些设计不良的情况之外,一般不会影响打印机的正常工作,打印机工作时也不会影响它们。
为了防止程序被非法复制,所做的加密保护措施一般都包括两部分。首先是要有保存密码数据的载体,即密钥;其次是夹杂在应用程序中的主机检查程序,即加密代码。密钥应该能保证不易被解密、复制;如一般用磁盘做加密时,加密部分无法用一般的工具复制。另外,当检查程序用特殊方法去读密码时,密码应该能很容易地被读出,而不致影响应用程序的正常执行。当发现密码不对或密钥不存在时,就让主机挂起、重新起动或采用被的措施。

软件狗经历的“时代”
软件狗的发展经历了好几代,至2001年初就已发展到了第四代。
第一代是存储器型的加密锁。这是最有历史的加密锁,内部只有存储体,厂商只能对锁进行读、写。软件狗起信号加密变换作用的器件,最多只简单采用一些电阻、二极管等,检查方法也比较简单,很容易被人解密.常见的有原金天地的“软件狗”、深思洛克的Keypro型、Rainbow的Cplus等。这种锁的主要特点是厂商可以预先把自己的保密数据设置到锁内,然后在软件运行时随机读取,这样防止了解密者通过简单重复并口数据来解密,但解密者进一步分析一下数据规律就可以解决了,这就是常说的“端口”层的数据分析。这种加密锁原理非常简单,是种正在被逐步淘汰的产品,但是其原料成本极低,即使在很低的价位也有很好的利润,加密厂商一般都不愿放弃这种锁;而很多厂商由于成本原因又不得不采用,因此这种锁仍有一定的市场份额;
第二代是算法不公开的加密锁。硬件内部增加了单片机,即所谓内置CPU,厂商主要是利用算法功能进行加密。加密锁通常还增加了一些辅助功能,比如倒计数器、远程升级等。软件狗采用了低功耗TTL,COMS等逻辑元件,在电路上做了一些加密工作,检查时也要比第一代软件狗多一道手续,解密的难度自然也增加了。常见的有深思洛克的“深思Ⅰ”型,彩虹天地的SuperPro、微狗,ALADDIN的MemoHASP等。利用单片机,软件与锁之间的数据通讯建立了一个保密协议,数据都是经过加密的,解密者就难以分析出数据内容和规律了,因此对于这种锁的数据分析就不是停留在“端口”层了,解密者转向了“功能”层,就是对软件中的函数调用进行分析。为了抵挡功能层的数据分析,这种锁来了个“软硬”兼施的策略。
“软”的是指驱动程序内反跟踪、外壳加密等等软件工作,让解密者难以在功能层上仿真,谁都靠的是对操作系统、微机系统的精确理解。谁都无法决胜,结果是加密驱动程序在不断更新、膨胀。
 “硬”的就是加密锁内的算法功能,这大大增加了解密难度,这是掌握在加密者手中的武器。但是,加密者只能设置算法的参数,即所谓内含多少种算法可选,而算法内容并不知道。这样就限制了厂商对算法的使用,要么预先记录算法结果然后在软件运行时核对(使用码表);要么在软件中至少变换两次然后比较结果是否一致。如果解密者截获这些数据,通过统计、分析就有可达到解密目的;
第三代加密锁,即所谓“可编程”的加密锁。1999年初,以北京深思洛克为代表推出了第三代加密锁,“可编程”加密锁概念的推出是软件加密技术的一次进步。“可编程”加密锁设计初衷是希望用户能够将软件中重要的代码或模块“移植”到加密保护设备中运行,使软件与加密锁实现真正无缝链接。但由于成本限制,早期推出的几款“可编程”加密锁采用的低档单片机给 “可编程”性造成了很大的局限,主要表现在:1、算法变换的复杂度不够高,2、指令编码空间较小,3、程序区的空间较小。这些局限性使得用户根本不可能利用“可编程”加密锁实现理想的高强度加密方案。 软件狗采用了PAL(Programmable Array Logic)、PEEL(Programmable Electrically Erasable Logic Device)、GAL(Generic Array Logic)等可编程器件,但目前流行的期间大概要算串行读写的EEPROM(Serial Electrically Erasable PROM)了。这些器件由于密码编制的灵活性和制成密钥后在程序中插入检查的方便性,极大地增加了解密的难度。从使用的角度来看PAL、PEEL、GAL等逻辑器件只能读取数据,不能随时写入数据,密码的重新设置比较麻烦;而EEPROM芯片可随意读写,用在软件狗上灵活性相当大,譬如可以为每一个软件狗单独设一个密码,以增加解密的难度;另外,从EEPROM器件的电器性能上来说也非常适合做软件狗;因此这种器件在软件狗的设计中获得了广泛的应用,是当时软件狗制作者的首选芯片。它象一般RAM存储器一样可读写(只不过读写是串行的),即使断电后也能保存数据不变。常用的EEPROM型号是93C46,它是64×16bit的结构,也就是说一个93C46具有64个16位bit单元的容量,每次处理数据也都是16位。有的93C46,如Microchip、ATMEL、CSi等品牌的93C46可以通过切换,变为128×8bit或64×16bit两种模式,这对软件狗制作来说就更灵活了,其加密效果也更好。当然也有人采用更大容量的93C56、93C66或容量小一点的93C06、93C26等EEPROM芯片。因为软件狗是插在微机的并行口上,所以检查程序是通过并行口的I/O地址去读写EEPROM。具体的读写方式跟硬件线路以及EEPROM的时序有关,因此,一般的检查程序针对某一种硬件线路;但是这些程序大同小异,大体上是差不多的。
第四代软件够在第三代软件狗基础上,加入一个单片机芯片,如PIC16C5X。此芯片中存有特定的算法程序,可将读出的密钥数据进行加密变换,以对抗逻辑分析仪。可以说,软件狗发展到第四代,已经非常成熟了。在此技术上,各软件狗研制公司又加入自己的电路设计,形成了各自的产品特色。
平时常见的狗主要有“洋狗”(国外狗)和“土狗”(国产狗)。这里“洋狗”主要指美国的彩虹和以色列的HASP,“土狗”主要有金天地(现在与美国彩虹合资,叫彩虹天地)、深思、坚石。总的来说,“洋狗”在软件接口、加壳、防跟踪等“软”方面做得没有“土狗”好,但在硬件上绝对“无法”pj(应当说pj难度非常大):而“土狗”在“软”的方面做得绝对称得上世界第一,许多技术,如噪音、自检测、算法可变、码表变换等等,可以说都很先进,而在硬件上不及国外,只要稍有单片机功力的人,都可复制。

现在狗的技术发展很快,针对不同的应用场合有不同的类型,如:
强劲狗:自由定义算法的高强度加密方案
微狗: 面向单片机环境的高强度加密方案
USB狗: USB接口的微狗全兼容产品
软件狗:面向单机环境的低成本加密方案
网络狗:面向网络环境的加密方案
卡式狗:面向网络环境的加密方案

软件狗采取了各种的加密技术,目前较先进的加密技术有以下几种:
AS技术:API函数调用与SHELL外壳加密结合,即使外壳被破坏,加密程序依然不能正常运行。
反跟踪:
a.数据交换随机噪音技术:有效地对抗逻辑分析仪分析及各种调试工具的攻击。
b.迷宫技术:在程序入口和出口之间包含大量判断跳转干扰,动态改变执行次序,提升狗的抗跟踪能力。
抗共享:可从硬件对抗并口共享器,由开发商选择是否共享狗。
口令: 可由软件开发商设置32位口令,口令错误将不能对存储区进行读写。
时间闸:某些狗内部设有时间闸,各种操作必须在规定的时间内完成。狗正常操作用时很短,但跟踪时用时较长,超过规定时间狗将返回错误结果。
单片机:硬件内置单片机,固化的单片机软件保证外部不可读,从而保证狗不可仿制。
存储器:提供20字节掉电保持存储器供开发商存放关键数据、配置参数等信息。

市场上常见几种软件狗的简单介绍
彩虹天地:在中国应该算是老大了,从第一代到第四代的产品都有,但它的主要产品还是第三代的微狗(TD-MH),该代产品中有干扰芯片,能随时产生无用的干扰信号,更加有效的对抗逻辑分析仪;虽然有第四代的强劲狗(CS-QA),但好象有不少问题,所以推出的USB接口的加密锁还是兼容微狗的。彩虹天地的加密强度不高,最简单的pj方法就是随便买一个狗,然后复制成要解的狗。
深思洛克:也是一个比较有名的,至2001年初最主要的产品就是第四代的深思Ⅲ型加密狗,特点就是用户可在狗中定义自己的算法,这大大加强了其保护能力,但它的CPU功能还不够强,算法上有漏洞,而且只提供一种加密方式,所以也是可以击破的,并且也能硬件复制原狗。此类狗加密的产品有Pkpm结构计算软件、分析家股票软件、圆方cad软件等等。
深思 Ⅲ 的n阶黑箱模型法:
深思 Ⅲ 的n阶黑箱模型法并不是简单的记忆,而是通过深思 Ⅲ 独特的完全可编程使得深思 Ⅲ 锁对于输入和输出呈现高阶黑箱控制模型的特征。每次调用代码运行时使用锁内存储作为运算变量和参数,改变锁的状态影响后续的调用。用户自定义的代码没有任何的说明书和特征,甚至两次相同的调用会返回不同的有用的结果。这是深思 Ⅲ 独特之处。
以上加密范例并不要求加密者寻找复杂并难以预料的函数关系加以移植。
如果是采用0阶黑箱模型那么输入与输出具有直接的对应关系 y=f(x1,x2),其中x1,x2为本次输入,y为本次输出。这时如果函数关系简单就很容易被解密者破译,比如用迭代法、插值法和列表法等方法逼近;这就迫使加密者寻求复杂函数来防止解密者的破译和仿真。但由于锁内资源的限制使得软件移植几乎不可能。现在采用n阶黑箱模型,就使得输入与输出的对应关系复杂化: yn=f(yn-1,yn-2,yn-3,...,y1,xn1,xn2),其中,y1,y2,...,yn-1为以前n-1次调用输出或隐藏的结果,xn1,xn2为本次(第n次)调用的输入参数。
面对这样的复杂关系,解密者简单地取消中间的任何一次调用都可能使后边的结果发生错误,既使是简单的函数关系也可以被这高阶黑箱过程隐藏得难以推测。这样,借助于高阶黑箱模型法很容易找到应用软件中可以利用的公式或函数作为加密的对象。
n阶黑箱模型法使用过程中一样可以使用码表法,例如,范例中的第一次调用。
但是,这样的码表法不同的加密点互相关联,必须进行整体解密,这就大大地提高了加密强度。使用传统的0阶黑箱模型时,不同的加密点之间互不关联只需各个击破分别解密即可,其复杂度无法与n阶黑箱模型相比。对于比较复杂的函数,尽管锁内没有足够的资源,还是可以通过n阶模型法进行加密处理我们可以将复杂函数化为简单函数的运算组合,例如:y=(a-b)*(a+b)+c可以先计算(a-b)和(a+b)然后将结果相乘再加c。
n阶模型严格说是不可解的(只是目前理论上,也请深思公司记住这一点),因为第n次输出依赖于前n-1次输入和输出,而前n-1次输出可能已部分或全部被隐藏,所以第n次输出无法推测,至少推测n-1次输入产生的输出要比一次输入产生的输出复杂度有质的飞跃。
深思 Ⅲ 具有完备的指令系统,可以通过编程实现n阶或任意阶黑箱模型,每次调用互相关联,并且可以绝对隐藏中间结果,只要使用得当,理论上是不可解的( 我的理论是没有不可解的:)
飞天诚信:是新崛起的一家,主要产品是ROCKEY-IV和相兼容的USB狗,技术支持比较好,功能比较多,它的外壳加密程序很不错,用在加密上主要是8号功能(种子码)和14、15、16号功能(都是自定义算法),它的自定义算法比深思的产品好,“没有”漏洞(目前理论上说)。如果很好地使用它加密,是极难pj的。但大多数开发商都很偷懒,比如就只用8号功能(种子码)来加密。
制作和出售软件狗的公司很多,你只要注意一下计算机杂志上的广告就能得知。各公司生产的软件狗除了上述特点外,一般都有一些为吸引用户而附加的功能,主要是一些工具软件,其核心技术却是大同小异。

加密狗的一般特点
1、不占用并行口,因为它虽然插在并行口上,但是它又提供了一个跟原来一致的并行口。
2、软件具有防解密功能,可对抗各种调试工具的跟踪。
3、一狗一密码或一种线路,软硬件不可互换,就像一把锁一把钥匙那样。
4、提供各种语言的编程接口以及一套实用工具,方便用户在自己开发的程序中嵌入加密模块。
5、提供对可执行文件的加密工具,以便用户对已有的产品进行加密。

加密锁性能判定
加密锁很小巧,包含的技术内容却很丰富。一般我们从三个方面分析加密锁的性能:
 第一个是加密原理,或者说加密锁有些什么功能,这往往是针对一些解密方法发展起来的,最需要创造性的地方就是这里。国内产品在这个方面一直与国外产品具备足够的竞争能力。
 第二个是加密锁的可靠性、稳定性、兼容性、透明性等。这些是对锁的基本要求,但是做完整并不容易,尤其是兼容性、透明性问题,加密厂家在这方面有着丰富的经验,但是没有谁可以100%保证。透明性是锁的一个比较特殊的指标,由于锁是工作在并口(打印口),并口还会有其他设备,比如打印机、绘图仪、硬盘、光驱等,锁如果影响到原来设备的正常工作就是透明性不够好,完全的透明是难以做到的,一般的加密厂家不保证锁对并口硬盘、光驱等设备的透明性。
 最后一个是锁的易学性、易用性。

软件狗加解密技术的简单介绍(我将在以后陆续加入并详细介绍)
 涉及到加、解密的技术可以说是包罗万象,基本的有汇编语言、调试工具、操作系统等,还需要一些密码学的基本常识,如果对数据结构、编译原理等有一定的了解会更有帮助。当然,这并不是说没有这些基础就做不好加密,在使用加密锁时,很多工作已经由加密厂家完成了,其实加密者只要对“随机性”有一些基本的认识,就可以完成很出色的加密。这个随机与一般意义上的随机有所不同,这里强调的是“不可预测性”。如果解密者可以预知加密锁返回的数据,就可以用程序代替锁来返回,软件就无法知道锁是否真正存在,就是被解密了。这就是我们常说的“仿真”,在密码学中就是假冒攻击。所以,加密的一个重要思路就是让解密者看来:锁输入输出数据有很强的随机性。目前,加密设计中最迫切解决的就是构造随机性的问题。
 常有人这样加密:在软件中反复检查锁内的数据,而且运用了很复杂的检查方法,比如中间插入一些运算或者垃圾程序等,加密的工作量很大,以为“我查了那么多次锁还不够吗?”。但这在解密者眼里不值一提,只要发现锁返回数据的规律性就足够解密了,根本不必理会软件是怎么使用的。这种加密失败在于,只是用了些读操作,没有构成返回数据的随机性。那么,如果扩大加密锁存储容量,或者进行些写操作就行吗?显然还是随机性太差。因为这点,第一代加密锁很难胜任真正的加密工作了。也因为这点,过去比较繁荣软加密技术难以深入发展。这提醒我们,如果加密原理不合理,再大的加密工作量也是徒劳无益的。
 使用算法变换就可以增强随机性,但是有人这样加密:在软件中大量调用算法变换,变换的数据量也很大(即算法码表很大),可还是被轻易解密了。为什么呢?是不是算法被破了?不是。这种加密方法在解密者看来和上个没有什么不同,只要把每次变换的数据内容都记录下来,如果软件再用同样的数据调用算法,解密者自然知道应该返回什么数据了。失败原因是,码表内容是固定的,被解密者穷举了,没有构成随机性,这说明可以穷举的东西是不具备随机性的。那么怎么才能防止被穷举呢?由于加密者也不知道算法方程,实际上是做不到的。但是,我们可以给解密者增加很多穷举困难。我们知道,只要让解密者抓到一次,这个数据就再也没有加密作用了,因此不能让软件运行一次就用完所有码表,另外还可以用些随机数来做变换,这就考验解密者的分辨能力了。这是个技巧性比较高的问题,需要不小的工作量,但这的确对加密强度有贡献。
 如果加密者知道算法内容,而解密者不知道,这样就可以用任何数据来访问加密锁的算法功能,解密者就无法穷举了,第三代“可编程”加密锁就能实现这种思想。
 由于第三代锁的出现,需要补充另外一个话题,就是加密锁的功能。如果解密者可以通过数学方法解析出锁的内部功能,就可以“仿真”了。如何设计锁的功能才不易被破呢?这涉及到一点密码学,一般的加密者只要能够将不同类型的运算混合使用就够。对于第一、二代加密锁,解密者没有必要去分析程序是如何使用锁返回数据的(仿真的思路),而对于第三代锁,这种方法常成了解密者唯一希望,寄希望于通过跟踪锁返回数据的使用过程而推测出锁的内部功能。这时候几乎任何能够降低程序可读性的手段都会提高加密效果,比如程序垃圾、反复的数据搬动、嵌入汇编、插入浮点运算等等。这点很吸引人,即使你刚明白加密,也能让解密专家围着你团团转。
 加密者往往远不如解密者专业,随着互联网的发展,解密技术正以更快的速度传播,这给加密带来了更大的挑战。

软件狗的加密技术介绍
解密一个软件狗可以从两方面入手,其一是软件,只要把检查软件狗的那部分代码解除,那么软件狗就成了一只“死狗”。其二是从硬件入手的解密方法,其含义是要仿制一个加密盒,不管机密做的如何好,如果加密盒被仿制了,那么软件狗的加密作用也就不存在了。因此,从硬件入手的解密跟从软件入手的解密其效果是一样的,只不过后者需要付出一定的额外代价—硬件成本而已。
那么既然从软件、硬件着手都能解密,用它来保护软件还有什么作用?不用着急,让我们来谈谈如何更地保护您的软件。
针对解密的两种方法,我们也从这两方面来加强软件的加密功能。

增强软件狗加密功能的方法
一、软件加密
全面我们说,从软件入手的解密方法很多,针对这种情况,人们也研制出了很多行之有效的防解密措施,在次,我们把一些常用的防止软件跟踪解密的措施列于下面:
1、计算程序执行时间,并判断程序的执行时间是否过长;
2、关键程序部分禁止 键盘中断,并检查键盘中断是否被开放;
3、关键程序部分禁止显示输出和打印输出;
4、在软件中多做几次软件狗检查;
5、把程序的重要部分加以编码加密,在运行时才解密;
6、修改断点中断功能;
7、利用除零中断或溢出中断是否有程序跟踪;
8、利用时钟中断检查是否有程序跟踪;
9、在程序中调用INT 7;
10、程序不要写得很结构化,要多一些“废话”;
11、若干种加密方法综合使用;
12、用黄玫瑰软件制作组出品的BITSHELL作外层防护;
...... ......
==================================================
[ 附:外壳反跟踪反破译程序BITSHELL简介
一、系统简介
BITSHELL是一套可反跟踪反破译的软件加密系统,主要用语保护软件开发者的合法权益,防止未经授权的复制、算法解读及目标码反汇编。它是我们应高级开发者的要求从BITLOK中提炼出来的,专为应用软件提供pj保护的系统。应用软件开发者可以充分发挥自己的才智编写或精巧或复杂的程序,有BITSHELL的保护不用担心竞争者对商品软件进行逆向分析。应用软件开发者更可以设计自己的反拷贝介质(加密卡、加密狗等),然后用BITSHELL进行外层保护,从而不必担心访问反拷贝介质的代码被截获。应用软件开发者也可以购买商品化的加密卡,加密狗等,在应用系统内部秘密地存取加密卡、加密狗,用BITSHELL作外层保护,防止访问反拷贝介质的代码被截获。
主要功能和性能如下:
千变万化的加密方案
内含随机可选的二十套加密算法,构造出千变万化的反跟踪反破译方案,特别适合加密有多个单独执行程序的软件。
先进超强的反跟踪技术
采用加密虚拟机、多层间址多 链解等独创的世界领先技术,结合传统的加密方法,具备超强的动态反跟踪能力。防范各种软硬件调试器对其破译。不仅防止了国际上通用的调试器,如:Soft-ICE,Turbo Debugger,Symdeb等,还重点防范了国内开发的各种专用调试器。
可靠性高、兼容性好、使用面最广泛
经BITSHELL1.0加密过的软件日夜运行在超过60万台机器上,经过了最广泛、最严格的测试。BITSHELL2.0具备同样可靠的性能,加密过的软件可以在各种厂牌各种机型上正常运行,兼容各种流行的DOS系统。
功能全面、使用方便
可加密各种带覆盖模块的执行文件,特别适合加密有Clipper,FoxPro等编译的各种数据库应用系统。
提供OBJ嵌入式加密模块。这样,用户还可以在源程序里加入加密模块,与外壳部分相互关联,有效地提高破译难度。
可以为用户定制专用BITSHELL反跟踪反破译系统,可以满足用户的独特需求。
二、快速入门
BITSHELL经过了用户严格的检验,作者对其精雕细琢反复修正,现在的版本使用极容易。确保BITSHELL硬盘或网络安装已经成功,或BITSHELL源盘在软驱中,加密方法如下:
BITSHELL<源文件><目标文件>
例如:
把TEST.EXE加密成TESTOK.EXE。输入以下命令:
BITSHELL TEST.EXE TESTOK.EXE
把TEXE.EXE加密不保留未加密的程序。输入以下命令。
三、操作指南
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);

==================================================
虽然加密方法那么多,但是道高一尺,魔高一丈,随着加密技术的发展,解密技术也进一步蓬勃发展起来,目前可用于解密的工具有SOURCE、DEBUG、SYMDEB、TURBO DEBUG、SOFT-ICE、TRW2000等等。这些工具的功能一个比一个强,更何况还有那么多“专业”解密高手,似乎任何加密技术到了他们手里都会迎刃而解。说来说去,您可能会想,你仍然没有最终解决软件的加密问题吗。是的,本来吗,加密和解密就是一对矛盾的统一体,某一阶段的优 只能看是哪一方先亮出了新招,谁都不敢说他的加密方法别人破译不了,或者说他能破译任何加密方法。如此看来,我们所做的工作只在于尽量减少被解密的可能性,以赢得时间进行下一步的开发。
软件解密就是要想办法把加密代码攻破,具体到软件狗上,即是找到检查程序,然后干掉它。因此,如果我们在应用程序的不同地方多做几次检查,就可以让解密者浪费更多的时间。这对I/O速率很快的软件狗来说是很方便的,不像软盘加密那样检查起来既费时又不方便。
一个好的程序员会把程序设计得简单易懂,具有结构化,但这也给解密者带来了方便,所以程序不要写得太规则,另外还要加上一些“废话”,以干扰解密者。
另外一种不破坏程序结构化,也不需要写“废话”就可以有效干扰解密者,提高解密难度和复杂性的方法是,把子程序全部用宏改写。这样汇编出的程序是一串串很难看出结构的指令,进出堆栈的数据和各种传递的参数以及积存器暂存数的存取相距很远,嵌套很深,分析起来很伤脑筋。第三代软件狗的存取程序就是全部用这种方法写的。
很多软件加密技术的研制者对Soft-ICE很头疼,因为它的解密功能太强了,但是您只要在程序中调用一下INT 7,就能防止它的跟踪,您不妨试试看。
在用解密工具跟踪程序时,执行时间显然要比平常的长,另外一般都用键盘来操作,用显示器或打印机作输出,所以采用执行时间检查或者在关键程序部分禁止键盘中断,以及禁止显示器或打印机输出(修改INT 10H 或INT 17H 中断)等都是较好的方法。例如在第三代软件狗编程中用到的方法:

...... ......
...... ......
;................MACRO.....................
;. 计时反跟踪 .
;..........................................
;-----------------------------------------[+]
;保存时间
;-----------------------------------------[+]
TimeSave macro
ifndef debug-Time
push ds
push cs:[_const_word_0_]
pop ds ;ds=0000H
push ds:[046ch] ;把时钟记数值
pop cs:start_time ;保存到start_time
pop ds
endif
endm

;-----------------------------------------[+]
;检查程序执行时间,超过5秒则主机被挂起
;-----------------------------------------[+]
TimeTest macro
ifndef debug_Time
push es
push ax
push cs:{_const_word_0_]
pop es ;es=0000H
mov ax,es:[46ch] ;得到新的时间记数值
sub ax,cs:start_time;
cmp ax,18*5 ;执行时间超过5秒吗?
ja $+4 ;是,则主机被挂起
pop ax
pop es
endif
endm

;..................MACRO...................
;. 键盘反跟踪 .
;..........................................

;-----------------------------------------[+]
;禁止键盘中断
;-----------------------------------------[+]
KbdOff macro
ifndef debug-Kbd
mov cs:_tmpB_,al ;保存al
mov al,02h ;禁止键盘中断
out 21h,al
mov al,cs:_tmpB_ ;恢复al
endif
endm

;-----------------------------------------[+]

;检查键盘中断,若被开放则主机被挂起
;-----------------------------------------[+]
KbdTest_jmp macro
ifndef debug_Kbd
push ax
in al,21h
test al,02h ;键盘中断被开放?
jz $+3 ;是是,则挂起
pop ax
endif
endm

...... ......
...... ......
另外,如果我们把关键部分的程序加以编码,运行时再译码出来,这也增加了解密的难度,因为解密者必须懂得编码、译码规则才能修改可执行文件,而这些规则加密者一般是不会泄露的。

多种软件加密方法的综合,以及几种加密技术交叉使用,足以让许多解密者知难而退。因为必须了解所有的加密技术原理才有可能解密,这就增加了难度,毕竟能够精通各种加密方法的人不多。例如有就把软件狗加密技术和磁盘加密技术结合起来做。

二、硬件加密
软件狗的电路不要做的太直接,否则不利于加密。这里我们就来讲讲如何增进软件狗的复杂性,加强硬件电路的机密功能。
在讲第二代软件狗时,我们说它其实就是几个简单的与或逻辑门,目前已经被淘汰。现在我们将要把它跟EEPROM结合起来,经过变化,组成比较复杂的第三代软件狗,从而增加解密难度。
CAL芯片由于本身就有加密功能,所以也常被用来与EEPROM结合做成复杂的软件狗,更由于其内部逻辑配置的灵活性,使得解密的难度上涨了很多倍。
解密者要仿制加密盒,首先必须搞到同型号的EEPROM,所以,我们尽量采用市场上一般购买不到的EEPROM型号,这样也能起到保密的作用。另外,如果采用特殊的93CX6系列,就可以利用不同厂商出品的特殊93CX6,其特性不同这一点来加强硬件的 加密功能。
下面我们给出两个具体例子来说明(以93C46型为例)
例:
在电路中加入一个非们,以改变93C46某一管脚的极性,电路中要尽量采用低功耗的芯片,所以这里用了CMOS型的74HC04非门来实现。
这是在前面例子的基础上把CS信号反了相,读者还可以适当加入一些无用的电阻,电容等器件,以迷惑解密者。同时,我们还需要把相应的程序修改一下,把原来对CS信号的控制也反相才行。
...... ......
...... ......
;---------------------------------------------[+]
;设置EEPROM的片选CS为高电平,即选中EEPROM(-AUTO FEED线反相
;后接CS)
;硬件电路变化时,本部分程序应作相应改动
;---------------------------------------------[+]
SetCS macro
push ax
CtrlPort ;选择控制口
in al,dx
; and al,not,02h ;令-AUTO FEED线输出
;为高电平
or al,02h ;令-AUTO FEED线输出
;为低电平
KbdTest_Add_AL ;检查键盘中断,若被开
;放,则改变al值
out dx,al
_CtrlPort ;选择数据口
pop ax
endm

;--------------------------------------------[+]
;设置EEPROM的片选CS为低电平,即不选中EEPROM(-AUTO FEED线反相
;后接CS)
;硬件电路改变时,本部分程序应作相应改动
;--------------------------------------------[+]
ClearCS macro
push ax
CtrlPort ;选择控制器
in al,dx
or al,02h ;令-AUTO FEED线输出
;为低电平
and al,not 02h;为高电平
KbdTest_Add_0w ;检查键盘中断,若被开放
;则改变_const_word_0_值
out dx,al
_CtrlPort ;选择数据口
pop ax
endm

...... ......
...... ......

第四代软件狗加密技术
前面我们介绍了从第一代软件狗到第三代软件狗的使用和制作,但是,这些软件狗都是着眼于别人想不到这样的做法这个基础上的,一旦被人解密,散发出来,那么它的保护效果就要大打折扣了。任何人只要搞得到相同的芯片,便能仿制出一模一样的软件狗。即使你在加上一些TTL和CMOS等逻辑器件,甚至加上PAL、PEEL、GAL,或者在加上一些无用的电阻、电容,但毕竟都是局限于一些简单的逻辑变化和干扰手段,对于那些“专业解密高手”来说,仍然可以轻易地把它当作一个黑盒子,找一台储备示波器或者逻辑分析仪、逻辑分析卡,然后把电脑和软件狗之间的所有操作信号都记录下来,再用单片机将所有操作信号一五一十加以模拟就成了。甚至还可以设计出学习式的软件狗,像市场上那种学习式万用遥控器一样,去学习原版软件狗的操作信号,真正是道高一尺,魔高一丈。
这种情况是否以为这软件狗已经没有什么用了呢?那倒也不是,只不过还需要再往上提高一个层次—采用单片机来设计软件狗。目前已经有不少软件公司在他们的一系列软件上都采用了这种新的软件狗作加密保护用。
采用单片机制作软件狗有什么优点呢?主要在于主机存放程序与加密盒之间的沟通方式可以任意设计,不像第三代软件狗那样比较固定。这样,解密、破译的难度就成倍增加了。譬如,对于想用模拟方式仿制软件狗的做法,我们可以采用用特定的算法来沟通的方法予以解决,让示波器或逻辑分析仪每次记录的信号都不一样,别人就难以模拟您的软件狗了。再如,为对付学习式软件狗,我们可以设定若干种沟通方式,平时只用一种方式沟通,在某种条件下、才出现特别的沟通方式,过一阵子也会失效,很难把所有的沟通方式都记录下来。
说了那么多,那么好,这种软件狗到底该如何制作呢?是不是采用任何一种单片机都行呢?不是。前面说过,软件狗是靠“**”来获得电源的,所以,在选择单片机时,首先要保证它的功耗比较低,适合在并口上工作。其次单片机的指令要简单,功能要较强,适合做软件狗,最后一点,单片机本身带内置ROM,并有加密功能,以简化电路和防止被非法复制。符合这些条家的单片机是很多的,如NEC的MPD7554,Microchip的PIC16C5X系列等等。
第四代软件狗硬件设计思想
现在,我们给出第四代软件狗的一个实例,供大家参考。我们采用PIC16C54结合93C46来设计。
以并行口(DP25)的第9脚DATA7作为主电源,而以16脚—INIT为辅助电源。这样做,可以避免PIC16C54的电源因DATA7的变化而时有时无。-INIT脚的输出是很弱的,所以为了降低功耗,当DATA7为LOW时,就令PIC16C54的振荡频率降低到100kHz以下。这是通过对电阻R2的控制实现的。DATA 7为HIGH时,R1与R2并联,总的电阻小于100K欧,振荡频率大于100kHz;当DATA7变为LOW时,R1就与R2断开,总的电阻等于100K欧,振荡频率就小于100kHz,使得PIC16C54处于低功耗状态。PIC16C54的RTCC脚是用来监视并行口的-STROBE脚。因为当-STROBE出现负脉冲时,表示并行口有数据要送入打印机,所以此时软件狗不能工作。而RA0是用来监视并行口的-SLCTIN脚的,当-SLCTIN为HIGH时,打印机不会工作,这时候与软件狗通讯比较合适。
在我们的电路中采用了93C46,但它并不是必须的。因为它的用途是来记录一些密码,序号等数据,如果采用OTP型,每一个芯片本身就可以存储不同的密码,是用不着外接存储器的;但在大批量生产MASK时,它是必须的,要不然,所有的软件狗就一个样了,这不符合加密原则。
第四代软件狗在硬件电路方面没有什么好变化的,最多也就仿照第三代软件狗的做法,但是在软件方面,由于采用了单片机,尽可以根据各人的巧心思,进行自由的发挥。
2、第四代软件狗的一个软件设计
(1)在DATA7及-SLCTIN为HIGH时才能工作。
(2)工作期间如-STROBE有负脉冲则软件狗停止工作。
(3)建立128BYTES循环式的密码表,以数据口送出去的第一个BYTE为密码的起点,并以BIT2决定所要核对的密码是七次或八次。
(4)送出数据的方式采用从数据口出,前后两个数据XOR后所得的值为所要传送的数据。
(5)所有密码核对正确后,有-SLCTIN脚以约100ms的负脉冲,以串行方式从-ACK脚在上升沿时读回密码表的下一个密码供PC机核对。
根据这个原则,我们可以卸出一个比较好的软件狗程序,足以另解密者头疼很长时间了。有兴趣的朋友不妨自己编一编,解一解看。
这是当前软件狗加密技术中比较好的一个解决解密问题的方案。别人想要仿制您的软件狗,一般是不可能的,除非找到读出单片机中程序代码的工具。

以智能卡技术为核心构建的新一代加密锁的安全特征(新一代加密锁介绍)
 IC智能卡以其可靠的安全保障性能广泛应用于军事、金融、保险等国民生计的重要领域。以智能卡技术为核心构建的新一代高强度加密产品,也因此具备了极为优越的安全性能。
 改进之一:重要软件代码完全移植到硬件中运行
在新型锁软件保护的方案中,PC端应用软件的关键的代码和数据“消失”了,被安全地移植到加密锁的硬件中保护起来。在需要使用时,应用软件可以通过功能调用引擎来指令加密锁运行硬件中的关键代码和数据并返回结果,从而依然可以完成整个软件全部的功能。由于这些代码和数据在PC端没有副本存在,因此解密者无从猜测算法或窃取数据,从而极大程度上保证了整个软件系统的安全性。
 利用智能卡技术的新一代加密锁最多可提供总计高达32~64K字节的程序和数据空间,可容纳近万行的C语言代码。
 改进二:强大的运算处理能力
 利用智能卡技术的新一代加密锁具有强大的运算和数据处理能力,能够支持浮点运算库、数学函数库、安全服务库、标准输入和输出库等;这些对提高加密强度起着至关重要的作用。
 改进三:智能卡芯片具有极高的安全性
 智能卡芯片具有很高的集成度,与普通低档的单片机不同,只有已通过国际安全机构检测和认证(EAL 4+和IT SEC认证)的专业安全芯片制造商才能提供智能卡芯片。
 智能卡芯片能够有效抵御电子探测攻击(SPA和DPA)和物理攻击(SiShell),其在硬件设计阶段就提供了完善的安全保护措施。它通过芯片厂商开发,通过产生额外的噪声和干扰信号,或通过增加滤波电路来消除噪声,再加上若干保护层,采用特殊的材料(对电子束敏感的材料)等,使监测芯片内执行的指令序列不可能实现。同时智能卡芯片提供了硬件随机数发生器,在CPU 的控制下,每次芯片与外界数据传输中,产生的随机数可以保证数据不会重复。
 为了保证智能卡芯片的可靠性和可用性,国际权威技术标准管理机构ISO为此专门制定测试标准――ISO/IEC 10373,其中就明确了智能卡在紫外线、X射线、电磁场下的测试要求。1999年,ISO推出了安全芯片技术的新标准ISO/IEC 15408,新标准对智能卡芯片的防物理攻击能力提出明确要求。
 符合以上标准的智能卡芯片具有以下防物理攻击的功能:
 ◆通过烧断熔丝,使测试功能不可再激活(测试功能是智能卡芯片制造商提供的对智能卡芯片进行全面检测的功能,这一功能对智能卡芯片具有较大的操作性,不能激活测试功能将大大提高智能卡芯片的安全性);
 ◆高/低电压的检测;低时钟工作频率的检测;
 ◆防止地址和数据总线的截取;
 ◆逻辑实施对物理存储器的保护(存取密码等);
 ◆总线和存储器的物理保护层等。
 此外,智能卡芯片还具有一些软件保护来说极为有用的安全功能:
 芯片自锁功能――软件对芯片的访问首先由PIN码保护,PIN码的尝试次数可由软件开发商设定。当非法用户利用字典攻击的情况出现时,如果次数超过设定值以后,芯片会自我锁定,外界一切对芯片的操作均被停止。
 全球唯一序列号――智能卡芯片具有全球唯一序列号,不可更改。这可以杜绝冒用的情况发生,同时也可以对已发行的产品进行有效管理。如果软件开发商与加密技术供应商合作,可以获得提供特殊序列码区段控制服务,这几乎可以从根本上解决硬件的复制仿冒问题。
 硬件随机数发生器(白噪声技术)――用于产生高强度随机数。除对称算法生成密钥需要外,随机数在安全加密领域具有非常重要和广泛的应用,因此,硬件本身带有高强度随机数发生器对安全而言意义重大。
 硬件时钟定时器 ――是软件计时使用、反跟踪等常用软件保护手段中必备的功能。
 改进四:智能卡技术的核心――操作系统COS
 COS(卡片操作系统Card Operating System)存放在智能卡芯片上,是一个比较小但非常完整、严密的系统。COS管理着智能卡的一举一动,智能卡整套系统的安全性除一部分由芯片设计生产厂商保证外,大都由COS开发商实现。
 COS 主要分为四部分:通讯管理、文件管理、安全管理和应用管理。国际标准化组织 ISO 已经对智能卡的物理和电器指标以及应用标准做出较详尽的规定――ISO7816,有关智能卡与外界交换信息的电气指标以及指令格式在ISO7816――3&4中有详细的规定。
 开发COS系统是有相当大的难度和工作量的,需要投入很大的人力、物力;任何不按标准快速开发出的芯片控制系统很可能存在导致巨大安全隐患的设计缺陷。而采用第三方厂商的COS系统组合而成的产品由于其核心技术不太可能由加密锁厂商完全掌握控制,系统的安全性依赖于第三方COS厂商,由此也增大了用户的安全风险。
因此,利用智能卡技术开发软件加密保护类产品,从安全性、效率、稳定性、可靠性等各方面来说,核心的COS系统必须具有自主版权而且完全符合国际标准ISO7816。

软件加密技术和解密技术是矛与盾的关系,总是形影不离,当有了一项新的加密技术的时候,过不了多久,相应的解密技术也就诞生了。有时候,一项绝妙的解密技术也能使加密技术的研制这痛苦半天,反之怡然。如此纠缠,何时方休:回答是,永远完不了。唯一的出路,就是普遍提高人们的素质,寻求版权保护。切实做好产品的服务和质量,以此增强人们对您产品的吸引力,而不想去使用盗版产品。