分类：电脑/网络-软件
问题：软件中类似U盘的一个叫狗的是什么东西我想用一个建筑软件叫《神机妙 
我想用一个建筑叫《神机妙算》可这个软件太贵我买不起想用盗版可同事说这个软件需要一个狗插在电脑上就是类似U盘的一个东西。  我不知道这个狗是什么东西它是通过什么方式对软件进行保护的，  是纯粹的加密还是软件中的某些数据在这个狗中没有这个狗软件就用不了。是不是有狗的软件盗版一般都不能用
回答：你说的是加密狗吧？现在所说的加密狗，一般都是加密狗。是一种类似于u盘一样的东西，是一种防盗版的方式。一般是把程序的一小部分或解密部分集合到加密狗的硬件中，防止软件的盗版。加密狗就是一种插在计算机并行口上的软硬件结合的软件加密产品，为多数软件开发商所采用。加密狗一般都有几十或几百字节的非易失性存储空间可供读写，现在较新的加密狗内部还包含了单片机。软件开发者可以通过接口函数和加密狗进行数据交换（即对加密狗进行读写），来检查加密狗是否插在并行口上；或者直接用加密狗附带的工具加密自己EXE文件（俗称"包壳"）。这样，软件开发者可以在软件中设置多处软件锁，利用加密狗做为钥匙来打开这些锁；如果没插加密狗或加密狗不对应，软件将不能正常执行。加密狗厂家都会提供一套机密狗的读写接口给开发商，厂家卖给开发商的狗都有各自的区别，某个开发商只能操作自己买的那加密狗。 加密狗通过在软件执行过程中和加密狗交换数据来实现加密的.加密狗内置单片机电路(也称CPU)，使得加密狗具有判断、分析的处理能力，增强了主动的反解密能力。这种加密产品称它为"智能型"加密狗.加密狗内置的单片机里包含有专用于加密的算法软件，该软件被写入单片机后，就不能再被读出。这样，就保证了加密狗硬件不能被复制。同时，加密算法是不可预知、不可逆的。加密算法可以把一个数字或字符变换成一个整数，如DogConvert(1)=17345、DogConvert(A)=43565。下面，我们举个例子说明单片机算法的使用。 比如一段程序中有这样一句：A=Fx(3)。程序要根据常量3来得到变量A的值。于是，我们就可以把原程序这样改写：A=Fx(DogConvert(1)-12342)。那么原程序中就不会出现常量3，而取之以DogConvert(1)-12342。这样，只有软件编写者才知道实际调用的常量是3。而如果没有加密狗，DogConvert函数就不能返回正确结果，结果算式A=Fx(DogConvert(1)-12342)结果也肯定不会正确。这种使盗版用户得不到软件使用价值的加密方式，要比一发现非法使用就警告、中止的加密方式更温和、更隐蔽、更令解密者难以琢磨。此外，加密狗还有读写函数可以用作对加密狗内部的存储器的读写。于是我们可以把上算式中的12342也写到狗的存储器中去，令A的值完全取决于DogConvert()和DogRead()函数的结果，令解密难上加难。不过，一般说来，加密狗单片机的算法难度要低于一些公开的加密算法，如DES等，因为解密者在触及加密狗的算法之前要面对许多难关。对于加密狗的破解大致可以分为三种方法，一种是通过硬件克隆或者复制，一种是通过SoftICE等Debug工具调试跟踪解密，一种是通过编写拦截程序修改软件和加密狗之间的通讯。硬件克隆复制主要是针对国产芯片的加密狗，因为国产加密狗公司一般没有核心加密芯片的制造能力，因此有些使用了市场上通用的芯片，破解者分析出芯片电路 以及芯片里写的内容后，就可以立刻复制或克隆一个完全相同的加密狗。不过国外的加密狗就无法使用这种方法，国外加密狗硬件使用的是安全性很好的自己研制开 发的芯片，通常很难进行复制，而且现在国内加密狗也在使用进口的智能卡芯片，因此这种硬件克隆的解密方法用处越来越少。　　对于Debug调试破解，由于软件的复杂度越来越高，编译器产生的代码也越来越多，通过反汇编等方法跟踪调式破解的复杂度已经变得越来越高，破解成本也越来越高，目前已经很少有人愿意花费大量精力进行如此复杂的破解，除非被破解的软件具有极高的价值。　　目前加密锁（加密狗）的解密破解工作主要集中在应用程序与加密动态库之间的通讯拦截。这种方法成本较低，也易于实现，对待以单片机等芯片为核心的加密锁（加密狗）具有不错的解密效果。　　由于加密锁（加密狗）的应用程序接口（API）基本上都是公开的，因此从网上可以很容易下载到加密狗的编程接口API、用户手册、和其它相关资料，还可以了解加密狗技术的最新进展。　　例如，某个国内知名的美国加密狗提供商的一款很有名的加密狗，其全部编程资料就可以从网上获取到，经过对这些资料的分析，我们知道这个加密锁（加密狗）有64个内存单元，其中56个可以被用户使用，这些单元中的每一个都可以被用为三种类型之一：算法、数据值和计数器。　　数据值比较好理解，数据值是用户存储在可读写的单元中的数据，就和存储在硬盘里一样，用户可以使用Read函数读出存储单元里面的数据，也可以使用Write函数保存自己的信息到存储单元。　　计数器是这样一种单元，软件开发商在其软件中使用Decrement函数可以把其值减一，当计数器和某种活动的（active）算法关联时，计数器为零则会封闭（deactive）这个算法。　 　算法单元较难理解一些，算法（algorithm）是这样一种技术，你用Query（queryData）函数访问它，其中queryData是查询 值，上述函数有一个返回值，被加密的程序知道一组这样的查询值/返回值对，在需要加密的地方，用上述函数检查狗的存在和真伪。对于被指定为算法的单元，软 件上是无法读和修改的，即使你是合法的用户也是如此，我理解这种技术除了增加程序复杂性以外，主要是为了对付使用模拟器技术的破解。　　此加密锁（加密狗）的所有API函数调用都会有返回值，返回值为0的时候表示成功。　 　因此，破解思路就出来了，就是使用我们自己的工具（如VB、VC等）重新编写构造一个和加密狗API一样的DLL动态库文件，里面也包含Read、 Write等全部API中包含的函数，使用的参量及返回值和原来的函数一样，所有函数返回零。然后对Query、Read函数进行处理，返回应用软件需要 的数值即可。　　这个新的DLL文件编写成功后，直接替换掉原来的DLL文件，这时候再运行应用软件，软件访问加密狗的操作就全部会被拦截，拦截程序永远会返回正确的数据给软件，从而实现了模拟加密狗的运行。