鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站安全 > 加密解密 > >

CrackMe的制作及安全性分析

来源:互联网 作者:佚名 时间:2015-10-09 06:19
用到的加解密算法及编解码主要有:sms4,RSA256,md5,base64,另外还有一个自定义的简单加解密算法 1.首先是注册码的构成 w+WfnhqrasT6ZIRJMs1UKBAahI3XeY5uGumgsa2MygwapvFjjjZxBcXmLRI3/0gkVA/xjSkGz0xDkXatHHcYGBkeMliN4BtCtiSj0chWoUX5ujFK6skG6SLYKQ4P
  

用到的加解密算法及编解码主要有:sms4,RSA256,md5,base64,另外还有一个自定义的简单加解密算法

1.首先是注册码的构成
w+WfnhqrasT6ZIRJMs1UKBAahI3XeY5uGumgsa2MygwapvFjjjZxBcXmLRI3/0gkVA/xjSkGz0xDkXatHHcYGBkeMliN4BtCtiSj0chWoUX5ujFK6skG6SLYKQ4PnV8sbXNDdqTXBPYAjS6cujddDR8adKkxAI2MnQlxT2JxYTZ2a

jEPo0/yUv+iTUS6W4cEcDwiCmX+lcu/gMRd1UbZHh7qOIIeirp5R3NxxwHEgSJnpLi147NSoTdo2G39Rqkr

以上是一组注册码,其原始结构为:

| A:32字节代码 | B:32字节代码 | C:16字节密码 | D:16字节随机密钥 |

生成注册码过程:
(1)生成16位随机密钥
(2)用随机密钥加密A,B,C
(3)用自定义加密算法加密ABCD
(4)用RSA算法,私钥加密ABCD,得到192字节密文(由于是RSA私钥加密,因此没有私钥是无法写出注册机的)
(5)为了将上一步中不可见字符转换为可见字符,用Base64编码,得到以上256字节的注册码
(6)通过改变随机密钥,即可得到不同的注册码

2.安全性分析
(1)注册机编写的可能性

    由于注册码使用了RSA非对称加密算法,因此理论上无法写出注册机,如果你说能破解RSA256,我可以用RSA1024,能破解RSA1024,不用往下看了,我承认你可以破解这个CrackMe

(2)暴力破解的可能性

    A和B为组成PE文件的关键代码的密文,而且使用另一段关键代码的MD5值作为密钥进行SMS4加密。PE运行时,会首先计算关键代码的MD5,用sms4解密A,B,然后将A和B恢复到PE文件中。PE中原来对应的这两段代码使用随机数据填充,因此不分析注册码的情况下,无法暴力破解,除非你能用机器码手动恢复这64字节数据。这样也同时保护了关键代码,关键代码的任何修改都将造成解密A,B的错误,造成PE无法正常运行。

3.其它的保护手段

(1)两个保护线程

     保护线程有四个作用。
     一是反OD。我用了很简单的思路。OD中断时会把所有的线程也中断,我在线程中会不断GetTickCount,Sleep为200ms,在不中断的情况下,两次间隔不会超过1秒。如果你用OD中断超过4秒,会导致线程中检测到两次间隔超过4秒,运行退出代码。
     二是检查关键代码是否被修改。发现被修改立即退出程序。
     三是将解密代码的方法放到线程里。主要作用是防止调试者简单的杀线程绕过反OD。杀掉线程或nop CreateThread之后会导致很多代码无法解密,运行出错。这也就是很多人问我,为啥杀掉线程后也不行。
     四是用两个线程互守,比一个线程的保护作用更强。

(2)密码分段存储
    
     C(密码)的MD5被分段放到了三个地方,避免调试者很容易跟出来,这个保护作用不是很强,但有一定的误导作用。有些人把大量时间花在这里,以为把三段密码找齐就完成破解,其实误导作用更胜保护作用。

(3)多段代码加密

     共加密了5段关键代码,运行时解密。一个作用是反静态汇编,不运行的情况下,静态汇编出的很多代码都是错误的。二是反动态汇编。有3段代码互锁,1,2,3代表三段加密后的代码,其中2的解密密钥为1的MD5值,3的解密密钥为2的MD5值。如果你修改了1,则2不能解密,如果你改了2,则3不能正常解密。如果你不改1,无法运行到2,不改2,无法运行到3。

4.破解方法
   
    尽管上面写了这么多,也不是不能破的。我只能说,不给出一组正确注册码的情况下无法破解,因为注册码里有构成PE文件的必要代码。
    我的破解思路是这样的:首先改线程函数,去掉反调试,让OD发挥作用。然后的突破口就在于正确的注册码。输入正确注册码之后,所有的加解密都会正常运行,被修改的代码会变成明文。跟出加解密的起点和终点,把各段明文copy出来。最后将明文恢复到exe中,去掉所有的解密过程,禁止两个保护线程。最终修改一些跳转,完成破解。

5.总结
   
    各位看过之后,也许会认为这个CrackMe写得很变态。我也承认这一点,从思路设计,编写CrackMe主程序,编写PeModify辅助修改程序,修改调试,到最终完成,大概花了40个小时。破解这个程序可能会花费更多的时间,有些大牛朋友可能是不想在没什么价值的程序上花费太多的时间,才没有完成破解,而不是不具备破解的能力。
    对于有些人质疑如此多的加解密是否会影响运行效率。这个程序里,大部分的代码加解密都是只执行一次,对于频繁调用的代码段,不做任何处理,线程函数的Sleep(200)也保证了程序运行效率不受线程影响。实际中,程序是瞬间启动,CPU占用率也始终是0,比那些为了防破解使用VB-PCode的效率要高多了。
    个人认为也许会对某些朋友有用的三点:
    (1)将PE部分代码分出来放到注册码当中,有效防止无注册码的暴力破解
    (2)注册码生成使用非对称加密技术,防止注册机的编写
    (3)使用关键代码的MD5值作为密钥去加密另一段代码,形成逐级守护,修改任何一段都无法解密另一段代码

网友评论
<