首页
社区
课程
招聘
[原创]一个高难度CrackMe的制作过程
发表于: 2009-11-8 16:04 30357

[原创]一个高难度CrackMe的制作过程

2009-11-8 16:04
30357

由于上次发的CrackMe至今无人破解,特将制作过程发出来,水平有限,如果写得不好,请各位朋友见谅。

原帖可点以下链接,还想尝试破解的朋友,可以先不看以下内容,附件里是CrackMe,注册码见第1节
http://bbs.pediy.com/showthread.php?p=709225&posted=1#post709225

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

1.首先是注册码的构成
w+WfnhqrasT6ZIRJMs1UKBAahI3XeY5uGumgsa2MygwapvFjjjZxBcXmLRI3/0gkVA/xjSkGz0xDkXatHHcYGBkeMliN4BtCtiSj0chWoUX5ujFK6skG6SLYKQ4PnV8sbXNDdqTXBPYAjS6cujddDR8adKkxAI2MnQlxT2JxYTZ2ajEPo0/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值作为密钥去加密另一段代码,形成逐级守护,修改任何一段都无法解密另一段代码


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (38)
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
站楼 先看CM
2009-11-8 16:45
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看了一下,实在是太经典了,不支持都不行
2009-11-9 00:13
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
4
大概看了看,加密的思路类似壳的保护机制。
太耗时间了。。。
我有这时间,不如循序渐进地练习手动脱壳,打好基础。

谢谢LZ,收藏。。。以后有时间琢磨。。。
2009-11-9 08:56
0
雪    币: 319
活跃值: (49)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
同间LS的说法,这么复杂的东西一般人不会去玩的,一个Crackme而已,又不是做软件,何必要那么复杂呢。。

如果可以的话我觉得里面不加RSA算法在里面,而算法不要太过长或复杂,我想这样应该会有人玩玩的。。。。。。。。
2009-11-9 09:08
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
6
这个要顶,感谢分享
2009-11-9 09:38
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
好文。~~~~~顶个
2009-11-9 10:08
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
做成软件就有人搞了。
2009-11-9 10:29
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
LZ发个代码出来吧,或者单独QQ传我一份,我好向你学习
2009-11-9 10:41
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
向你学习,感谢分享
2009-11-9 16:52
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
学习一下思路
2009-11-9 21:40
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
要是把源码放出来就比较直观了
2009-11-9 21:48
0
雪    币: 422
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
强烈要求楼主能发出代码,让我能好好学习。
2009-11-25 10:22
0
雪    币: 123
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
很多朋友问我如何加密代码的,另开一贴,给不懂得朋友分享一下吧
2009-12-23 10:31
0
雪    币: 234
活跃值: (83)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
15
就似就似,能不能发个代码瞧瞧?~~ 喝喝···
2009-12-23 22:17
0
雪    币: 201
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
赶紧开源哦,让大家看看
2009-12-23 22:57
0
雪    币: 292
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你的程序,win7下无法运行
2009-12-24 01:37
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
同上,WIN7下无法运行
2009-12-25 12:31
0
雪    币: 231
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
强烈请求开源!!!
2009-12-30 08:59
0
雪    币: 5303
活跃值: (3694)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
21
设计的好复杂啊
2010-2-26 00:20
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
这个不得不顶 那么复杂  !

                 我什么时候才能看懂
2010-3-5 00:06
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
23
sms4+RSA256+md5+base64+自定义算法……单是算法复杂性上讲就已经很BT了哦。要是现在的共享软件都这么搞的话,就不会看到满天飞的破解版和注册机了。
2010-3-5 08:41
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢,提供思路
2010-8-12 17:11
0
雪    币: 196
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
现在的软件有这样的保护的话,破解到的应该很少了~~

真的很像加密壳~
2010-8-12 22:45
0
游客
登录 | 注册 方可回帖
返回
//