|
五.防止文件被暴破暴破是指破解者在模拟算法失败的情况下,恼羞成怒,狗急跳墙,一气之下暴力破解,将软件的壳脱掉,将要求注册的部分直接跳过去,这样直接产生的后果是文件大小被改变了。
首先要说的是:一般暴力破解前奸人都要跟踪查看你关于注册文字的一些关键字,请大家不要将注册信息的明文写在软件中,如“请注册”,“注册成功!”,“注册失败!”,这些文字请打乱后显示,有可能的话再加密,这样破解者不容易找到位置。奸人有时用一种简单的字符分析工具很容易找到这些敏感的字,因此尽量避免明文显示。
其次,不要使用信息框进行提示是否注册成功,这个信息框的API函数的使用情况很容易被奸人找到,可以单独制作一个提示窗口,上面显示注册成功与否加密后的文字,或直接在窗口中放一张提示是否注册成功的图片也行。
再次,你的注册码判断最好不要直接判断注册码,而是用两个MD5进行对比,即用户输入在注册编辑框中的文本信息与注册码文本信息进行MD5的直接对比。有时奸人会输入一个假的注册号,然后在内存中寻找这个数据,如果转换为MD5判断后,奸人在内存中是轻易找不到自己输入的数据的;
最后,你的注册判断不要使用“如果”这样简单的命令,而是使用前面所说的循环命令进行判断。
加壳软件的作用就是防止自己的程序被暴破。首先破解者会脱壳,如果有的壳很硬,或有加密算法,这为脱壳带来麻烦。其次,加壳后,在外部DLL中存一个MD5的校验,这将防止脱壳后运行,这样奸人就不能进行运行调试了。
加壳软件分为普通壳与加密壳。加壳可压缩文件大小,并且将一些本来清晰的字串进行了打乱的效果。
普通壳的作用是压缩资源,使文件尺寸变小,一般可使易语言缩小一半以上的尺寸,有的还可以减少系统资源占用。其他编程语言生成的EXE文件加壳后有可能变大,例如C语言生成的程序本来就小,压缩不了尺寸,这时再加上一个壳,尺寸反而会变大。
普通壳有:UPX,ASPACK,ASProtect,PKLITE,PECompact等。
加密的壳有:幻影,软件保护神等。
加密的壳可以提供直接的注册码功能。加密的壳由于是公用壳,很多人都去购买使用,一般容易被奸人看中脱壳,灵活性也差。如果被破解了,那么后果是十分严重的。因此推荐的就是一个普通壳,如UPX,然后进行MD5判断是否被脱壳就可以了。
下面,再介绍一下常用的加壳软件。
1.常用加壳软件介绍下图是UPX Shell v3.10软件的运行界面:
下图是ASPACK软件的运行界面:
下图是PKLITE软件的运行界面:
下图是PECompact软件的运行界面: 下图是“幻影”加壳软件的运行界面:
下图是“软件保护神”加壳软件的运行界面: 壳加完后,余下的工作就是防止脱壳了,一般来说,很多人都想要一个很强的壳,但一方面任何壳都有可能被破解,另一方面壳的兼容性就有很大的问题。
如采用强壳的《系统管理》采用了一个国外出品的强壳,确实是很难脱掉的,但由于破解版的原因,在WIN98下运行时经常会死机。正式版的价格也非常高,基本上要1000元RMB左右。
而常用的普通壳虽然强度并不高,但通过易语言编程进行校验,可以保护您的壳不被轻易脱掉。
加密第3定理:用最普通的壳,让弱手们去脱脱看!我还有校验等着呢。
2.加壳后文件大小验证加壳后一些数据安全得到了保证。这包括一些没有加工过的字符串,例如:数据库密码,加密算法密码。
加压缩壳后,易语言的EXE文件尺寸一般会变小,一般1.5MB的软件会变小为800KB左右。
那么最常用的文件大小验证可以用如下易语言代码:
判断(取文件尺寸(取执行文件名())= 843674)
上述代码中的数值是经过查看编译及加壳后文件属性大小生成的,但由此造成两种不方便的地方:一是由于易语言造成每次编译后的文件大小是不一样的,因此很难将这个数值取对,二是这个值放在哪里好,如果放在主程序中的话,那么每次生成的文件大小不一样,就会造成取不准,比较不了的现象。
建议大家在比较时可以将代码写成以下形式:
判断(取文件尺寸(取执行文件名())≥ 900000)
通过以上运算符的改变后,基本上可以知道是否被脱了壳了,因为脱了壳后程序的体积会增加很多。
3.加壳后数据签名验证易语言自带一个“数据操作支持库”,基本可以满足安全加密的需要。如下图所示:
这里较为常用的命令是“取数据摘要()”,这个命令是采用了MD5算法,不同数据的MD5码都不一样,因此本命令可以用作保证重要数据不会被篡改。对于不同的数据,其得出的结果是不一样的。如果奸人将您的软件脱壳了、改动了,那么前后所取得的结果也是不一样的。
“取数据摘要()”得出的结果是返回一段字节集数据的MD5数据摘要编码文本。一般是32位字节的数据。
但这样带来了这样一个问题:即我们取得了加壳后软件的数据摘要,但是放在软件中后再编译再加壳再取数据摘要后,本次取值与前面所取的值是不一致的。
采取的办法一般是将数据摘要文本存放在外部。
一般会采用以下的方式:
第一种方式:加密后存放在一个文件中。
第二种方式:加密后存放在DLL中。
第一种方式可以直接存在一个文件中,也可以夹存在其他文件中,如图片文件中,或音乐文件中,或DLL文件中(硬写在DLL段中)。
第二种方式可取得主程序的数据摘要后,直接在DLL程序的源程序中写比较代码。然后编译为DLL文件,由主程序调用此比较DLL。这样保证了主程序的数据摘要与主程序分离从而加强了主程序的安全性。
4.加壳后CRC验证我们很有必要给自己的软件加上更好的保护。CRC校验就是其中的一种不错的方法。
CRC是什么东西呢?其实我们大家都不应该会对它陌生,回忆一下?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。
CRC有什么用呢?它的应用范围很广泛,最常见的就是在网络传输中进行信息的校对。其实我们大可以把它应用到软件保护中去,因为它的计算是非常非常非常严格的。严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同。呵呵,是不是很厉害呢?所以只要给你的“原”程序计算好CRC值,储存在某个地方,然后在程序中随机地再对文件进行CRC校验,接着跟第一次生成并保存好的CRC值进行比较,如果相等的话就说明你的程序没有被修改/破解过,如果不等的话,那么很可能你的程序遭到了病毒的感染,或者被奸人用16进制工具暴力破解过了。
CRC的本质是进行XOR运算,运算的过程我们不用管它,因为运算过程对最后的结果没有意义;我们真正感兴趣的只是最终得到的余数,这个余数就是CRC值。
易语言用户林子深提供了一个CRC32.EC的易模块,这个模块可以在论坛上或资源网上搜索到。大家可以直接拿过来用,导入易语言后如下图所示:
调用方式可为如下代码: 判断(取循环风俗冗余校验和(读入文件(取执行文件名()))= 18293823767)
其中上述的数字为主程序的CRC码值。
大家可以利用上述特性,即结果是数值的特性,不用进行比较,而是用加减法的方法得出前后两个CRC验的差值,如果为0,那说明两个数字是相等的,主程序没有被改动过。否则就是被改过的。
例如下述代码:
程序被改 = 1
计次循环首(取绝对值(取循环风俗冗余校验和(读入文件(取执行文件名()))- 18293823767),)
程序被改 = 0-
跳出循环()
计次循环尾()
返回(程序被改)
上述代码中,“取绝对值()”是将负数也转换为正数,以方便进行计次循环。
上述代码中,数值型变量“程序被改”为1表示没有被改动过,如果为0表示被改动过。返回的数值就可以进行一些陷阱的计算了。
我的方案的缺点分析:
CRC-32的值其实可以由奸人自行计算得出后,重新写入到程序验证处。这样的话,我们做的工作岂不是没有意义了?
其实解决的方法还是有的,我们可以在计算CRC-32值之前,对参与转换的字符串加点手脚,例如对这个字符串进行移位、xor等操作,或者把自己的生日等信息加入到字符串中,随你的便什么都行,总之不是单纯的文件的内容就行了,然后在最后比较的时候,也用同样的方法反计算出CRC-32值。这样得到的CRC-32就不是由文件的内容计算出来的,相信对破解者的阻力也会加大不少。
总结:
以上的方法大家都可以在软件中采用,最好写到一个DLL文件中,然后多放几个需要验证的子程序,随时以备调用即可。
六.防调试方法1.易语言的花指令加花指令的方法有通用性,即所有的反汇编器都可以用这种方法来抵挡。这种方法主要是利用不同的机器指令包含的字节数并不相同,有的是单字节指令,有的是多字节指令。对于多字节指令来说,反汇编软件需要确定指令的第一个字节的起始位置,也就是操作码的位置,这样才能正确地反汇编这条指令,否则它就可能反汇编成另外一条指令了。并且,多字节,指令长度不定,使得反汇编器在错误译码一条指令后,接下来的许多条指令都会被错误译码。所以,这种方法是很有效的 。
易语言新版本中增加了自动插入花指令的功能,并且插入后虽然文件体积大了一些,但不会造成运行错误。大家可以点击菜单“工具”→“系统配置”。弹出的窗口如下图所示。
不采用花指令时,反编译出来的代码几乎是跟源代码一一对应的,这样一来我们的程序还有什么秘密可言呢?完全可以从反编译的结果中理解程序的功能。 其实花指令就是人为地构造一些“陷阱”和一些无用的字节,起到迷惑破解者和隐藏信息的作用。在这里,易语言为你构造了这些“陷阱”。大家只要将上述配置项打开就可以了。同时也提醒大家,在发布新版本时采用以下的方式:第一周发布的是花指令级别为1,第二周发布的是花指令级别为2,第三周发布的是花指令级别为3,第四周发布的是花指令级别为1……,周而复始,这样破解者根本跟不上你变换的速度。
加密第4定理:每周发布一个新版本,让破解的速度赶不上发布的速度。
2.反调试模块的使用目前易语言论坛上出现了一些模块或支持库,带有反调试的功能,当启用后,就会查看进程中有无调试器,如SOFTICE等调试工具,对易语言的调试也同样有效。
由林子深提供的另一个模块:“星光灭绝”模块大家也可以尝试用一下,为何说是尝试呢,这些模块并不稳定,并且极易造成WIN98下程序死机。并且打开易语言也会认为是调试器,从而会自动退出。
大家自己在易语言论坛上搜索吧。不推荐大家使用。
3.反调试支持库的使用海洋的支持库也提供了反调试的功能,具体是海洋增强支持库。
但要注意兼容性问题,一定要在多个操作系统下进行严格的测试后才能发布。
4.通过检查父进程得知是否被调试了一般情况下,直接运行的程序的父进程是EXPLOER,在易语言中调试运行的父进度是易语言,而在破解人手中运行的父进程是用于破解的调试软件。因此我们就有必要判断程序的你进程是否是EXPLOER或易语言,如果不是,非常有很大的可能是在奸人的调试软件中被调用了,这时就好办了。哈哈。
易语言论坛的用户“笨笨啊”提供了一个取进程与父进程的模块,并且有模块源代码,程序主要是由API取得进程内容。
大家可以搜索易语言论坛,用户名为“笨笨啊”,或关键字为“父进程”可以找到这个源代码。
下图是在易语言中调试程序时,父进程为易语言:
下图是易语言编译后运行,其父进程是EXPLORER.EXE,编号为860:
加密第5定理:一个正常运行的EXE的父进程是EXPLORER.EXE
不过这里要注意的是:奸人有可能将调试程序的名称改为EXPLORER.EXE,这样可以伪装一下吗?不可以,你需要检查一下名称为EXPLORER.EXE的进程有几个,进程ID是不是一样的?如果有两个不同的进程ID,那么这时再判定就可以知道是不是被奸人调试了。
5.使用多线程在Debug的手册里可以看到Debug工具的局限:第一个局限是只能下4个内存区域的断点,每个断点不能控制超过两个字节,这样内存断点不能控制超过16个字节的区域;第二个局限是对多线程只能同时跟踪一个线程。因此利用其的第二个弱点,大家可以多开几个线程进行来回验证。
多线程的编程方法参看易语言手册。
一般开5-8个线程就够奸人忙活的了。
加密第6定理:使用5个以上多线程来回验证注册。
|
|