您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > VB 共享软件防破解设计技术初探(二)
VB共享软件防破解设计技术初探(二)作者:爱琴海[SCG]2008/09/06(转载请保留该信息)上个篇我粗略的讲了以下几个内容:1、文件完整性,防止被非法修改2、运行时的校验,防止被LOADER3、反调试,防止动态跟踪和挂接4、防静态反汇编分析5、注册码系统(算法部分,核心内容)6、加壳防脱壳7、隐蔽性设计8、另辟蹊径列表在这里是为了提醒初学VB发布共享软件的朋友,在设计VB防破解的时候,不要出现“水桶效应”,也就是说,设计如水桶,任何一个角落缺失都将导致无法全部盛满水。而这个水桶的捆圈恐怕就是保护文件完整性,防止修改了。周末了,今天有点时间。赶快写好,等下吃晚饭,练练琴,然后陪陪女朋友。接下去,我们将开始具体至微的讲解第1、2两个内容,剩下的老规矩:日后有空,有时间,有精力,有能力的话接着写。1、文件完整性,可采用CRC32或者MD5或者哈希算法等,计算出文件的加密值,在适当的时候进行对比,判断文件被修改与否。当然那也可以加猛壳来防止文件非法修改。还有简单点的检查文件最后修改时间,看看是否是你自己设置好的时间,如果不是,则很有可能被修改过;也可以检测文件大小,往往压缩壳被脱掉后,文件的大小会增加;保护壳被脱掉后,文件大小会变小,我们可以根据这个设置好临界值来检测有没有被脱壳。常用的还有故意设计好关于算法方面的陷阱,如果是破解者会主动掉进你的陷阱,而事实上,这个跳转除非爆破,不然在算法上是永远也无法到达的,这样就检出破解者在修改程序流程。你可以无声无息的程序死掉,不要直接退出,不然会被追踪到退出函数。还有内存镜像校验,是为了防止普通的修改内存和普通断点问题。我们就具体演示3种VB程序的完整性校验设计。第一种是VB的CRC32自校验设计,包含过程,代码和所有工程文件及演示;第二种是VB程序的时间检测法则,包括过程,代码和所有工程文件及演示;第三种是VB程序的文件大小检测法则,包括过程,代码和所有工程文件及演示。其实还有些检测的办法,但是原理跟我们即将大曝光的三种办法差不多,都是衍生的吧。第二章第一讲VB的CRC32自校验设计来来来…大家跟我一起做运动,抖抖手啊,抖抖脚啊,做做深呼吸,本讲将会有点长,力求做到简单明了,容易明白,学完马上上手,学会应用的要求,我会具体点讲,不会像某些高人敝帚自珍,当然如果有错误的地方还请大家多多帮忙纠正,谢谢首先来简单复习下何谓CRC32CRC校验实用程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。有查表和计算法,我们可以在程序中自动生成码表来查表计算,方便和快速为了快速带过原理笔墨,节省点时间吃饭,我把网路上的一篇介绍《探究CRC32算法实现原理》引述过来,原文地址:以下是引用部分——————————————————————————————基于不重造轮子的原则,本文尽量不涉及网络上遍地都是的资料。What'sCRC?简而言之,CRC是一个数值。该数值被用于校验数据的正确性。CRC数值简单地说就是通过让你需要做处理的数据除以一个常数而得到的余数。当你得到这个数值后你可以将这个数值附加到你的数据后,当数据被传送到其他地方后,取出原始数据(可能在传送过程中被破坏)与附加的CRC数值,然后将这里的原始数据除以之前那个常数(约定好的)然后得到新的CRC值。比较两个CRC值是否相等即可确认你的数据是否在传送过程中出现错误。那么,如何让你的数据除以一个常数?方法是对你的数据进行必要的编码处理,逐字节处理成数字。那么这个常数是什么?你不必关注它是什么,也不需要关注它是如何获得的。当你真的要动手写一个CRC的实现算法时,我可以告诉你,CRC的理论学家会告诉你。不同长度的常数对应着不同的CRC实现算法。当这个常数为32位时,也就是这里所说的CRC32。以上内容你不必全部理解,因为你需要查阅其他资料来获取CRC完整的理论介绍。ThemathematicsbehindCRC?很多教科书会把CRC与多项式关联起来。这里的多项式指的是系数为0或1的式子,例如:a0+a1*x+a2*x^2+...+an*x^n。其中a0,a1,...,an要么为0要么为1。我们并不关注x取什么值。(如果你要关注,你可以简单地认为x为2)这里把a0,a1,...,an的值取出来排列起来,就可以表示比特流。例如1+x+x^3所表示的比特流就为:1101。部分资料会将这个顺序颠倒,这个很正常。什么是生成多项式?所谓的生成多项式,就是上面我所说的常数。注意,在这里,一个多项式就表示了一个比特流,也就是一堆1、0,组合起来最终就是一个数值。例如CRC32算法中,这个生成多项式为:c(x)=1+x+x^2+x^4+x^5+x^7+x^8+x^10+x^11+x^12+x^16+x^22+x^23+x^26+x^32。其对应的数字就为:11101101101110001000001100100000(x^32在实际计算时隐含给出,因此这里没有包含它的系数),也就是0xEDB88320(多项式对应的数字可能颠倒,颠倒后得到的是0x04C11DB7,其实也是正确的)。由此可以看出,CRC值也可以看成我们的数据除以一个生成多项式而得到的余数。如何做这个除法?套用大部分教科书给出的计算方法,因为任何数据都可以被处理成纯数字,因此,在某种程度上说,我们可以直接开始这个除法。尽管事实上这并不是标准的除法。例如,我们的数据为1101011011(方便起见我直接给二进制表示了,从这里也可以看出,CRC是按bit进行计算的),给定的生成多项式(对应的值)为10011。通常的教科书会告诉我们在进行这个除法前,会把我们的数据左移几位(生成多项式位数-1位),从而可以容纳将来计算得到的CRC值(我上面所说的将CRC值附加到原始数据后)。但是为什么要这样做?我也不知道。(不知道的东西不能含糊而过)那么,除法就为:1100001010_______________10011)11010110110000附加了几个零的新数据10011.........这里的减法(希望你不至于忘掉小学算术)是一个异或操作-----.........10011........10011........-----........00001.......逐bit计算00000.......-----.......00010......00000......-----......00101.....00000.....-----.....01011....00000....-----....10110...10011...-----...01010..00000..-----..10100.10011.-----.0111000000-----1110=这个余数也就是所谓的CRC值,通常又被称为校验值。希望进行到这里,你可以获取更多关于CRC的感性认识。而我们所要做的,也就是实现一个CRC的计算算法。说白了,就是提供一个程序,给定一段数据,以及一个生成多项式(对于CRC32算法而言该值固定),然后计算得出上面的1110余数。Thesimplestalgorithm.最简单的实现算法,是一种模拟算法。我们模拟上面的除法过程,遵从网上一份比较全面的资料,我们设定一个变量register。我们逐bit地将我们的数据放到register中。然后判断register最高位是否为1,如果是则与生成多项式异或操作,否则继续处理。这个过程简单地模拟了上述除法过程:引用到此结束—————————————————————————————————看来大家选择CRC32作为数据校验是有原因的,速度快,代价小,检错能力比较大。VB软件作者对CRC32有个认识就好了。我们编写VB的CRC32自校验程序思路如下:1、计算出目标文件除掉末尾8字节后的所有数据的CRC32值2、将上面计算出来的结果储存在目标程序的末尾8个字节里3、主体程序内置计算自身除掉末尾8字节后的所有数据的CRC32值的功能代码4、主体程序读取末尾8字节内容与计算的CRC32值比较,不一致说明被修改由1、2点我们发现,如果手动来添加CRC32值将是件麻烦的事情,所以一般我们都会写一个具备计算要求的CRC32值,及把该值添加到目标程序指定位置的程序,帮我们节省时间和体力。为了方便记忆和理解,在这里我将它命名为VB-CRC32注射器,顾名思义,即将计算出来的CRC32注射到目标程序里。那么执行自校验的程序我称它为VB-CRC32主体程序。大家记住了哦,下面开始先设计VB-CRC32注射程序。请跟我一起来:打开VB6.0新建工程新建类模块,名字改为“clsCRC”,别告诉我你不会改名,当然是在“属性窗口”改的。将如下类模块代码复制到clsCRC类模块里去:(或者直接从我发布的附件来条用该类模块)注意:类模块后缀名是CLS,请刚接触VB的同学注意,不要跟模块搞混了。我是代码起始线————————————————————————————————OptionExplicitPublicEnumCRCAlgorithmsCRC16CRC32EndEnumPrivatem_AlgorithmAsBooleanPrivatem_CRC16AsLongPrivatem_CRC16Asm()AsBytePrivatem_CRC16InitAsBooleanPrivatem_CRC16Table(0To255)AsLongPrivatem_CRC32AsLongPrivatem_CRC32Asm()AsBytePrivatem_CRC32InitAsBooleanPrivatem_CRC32Table(0To255)AsLongPrivateDeclareFunctionCallWindowProcLibuser32AliasCallWindowProcA(ByVallpPrevWndFuncAsLong,ByValhWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong'此函数作用在这里是内联汇编之用PublicFunctionAddBytes(ByteArray()AsByte)AsVariantDimByteSizeAsLong'异常处理OnLocalErrorGoToNoData'计算大小ByteSize=UBound(ByteArray)-LBound(ByteArray)+1'异常处理OnLocalErrorGoTo0'内联汇编提高处理速度SelectCasem_AlgorithmCaseCRC16CallCallWindowProc(VarPtr(m_CRC16Asm(0)),VarPtr(m_CRC16),VarPtr(ByteArray(LBound(ByteArray))),VarPtr(m_CRC16Table(0)),ByteSize)CaseCRC32CallCallWindowProc(VarPtr(m_CRC32Asm(0)),VarPtr(m_CRC32),VarPtr(ByteArray(LBound(ByteArray))),VarPtr(m_CRC32Table(0)),ByteSize)EndSelectNoData:'返回新值AddBytes=ValueEndFunctionPublicFunctionAddString(TextAsString)AsVariant'将字符转为数组,以便套入函数计算CRCAddString=AddBytes(StrConv(Text,vbFromUnicode))End
本文标题:VB 共享软件防破解设计技术初探(二)
链接地址:https://www.777doc.com/doc-6072585 .html