首页
社区
课程
招聘
关于加密锁算法的反推
发表于: 2006-3-2 14:44 9193

关于加密锁算法的反推

2006-3-2 14:44
9193
现在加密锁的硬件复制是越来越多了,到电脑城去给朋友找配件,结果发现软件摊位上到处是复制狗

版的专业软件的列表.于是最近就研究了一下ROCKEY4玩.如何改基本密码之类的我不再说了,反正我

也不知道芯片的具体型号,之后无非就是单片机的写入什么的了,我这里就只介绍一下推导数据的

思路。
其实行业软件使用的智能加密锁并不神秘,简单的说其实就是里面有CPU和单片机的程序(里面带有几

段计算用的公式)可以把软件程序输入的数值计算转换(这个过程为数据加密)然后返回给程序验证(

有些是非对称加密方式的还原,也就是我们说的RSA,有些干脆就来个MD5的比较).就ROCKEY4来说,写

在加密锁里面的有三种数据,一种是找出读口令就可以读取的,象用户内存区的数据和用户ID号.一种

是模块数据共16个,这个无法直接读取,但可以通过指定算法的输入输出来直接计算出来,一是找个锁

,跟踪或反编译找出加密锁的算法的条数和每条算法开始的位置,在编辑器里面使用指定算法开头、

模块号、A、B、C、D的值在锁里面计算,根据返回数据就可以得出,二是先确定算法,然后用算法3(

开发手册上有程序,现成的)计算得出。还有一种数据就是指加密锁里的算法了,这个得先推出算法

的条数以及每条算法开头的位置,由于为了加密和解密数据提供给软件验证的需要,所以对于相同

的输入(指同一条算法开头,指定算法开头后,会从开头标记处执行到结尾标记结束。计算,同一

个模块号,同样的A、B、C、D的值),其输出是相同的,于是我们可以把相同输出的地方看作算法

的开头。然后根据种子码和模块号的变换输出数据,看一看算法是否用到模块字、种子码。然后指

定找出的算法开头、指定模块、指定几种ABCD的值(简单一些,最好有规律可循),把数据计算输

出。根据输出的数据,反推出实际的这条算法或同结果的算法(能得出同样结果的可能有几种算法

)这里暂时先简单的介绍到这里,说的太直白了就没味道了,毕竟这些东西要自己去嚼才有味道。千万不要回贴“帮我解个狗”之类的帖子,我不是专门搞PJ的,也不是学计算机专业的,玩这些纯属个人兴趣,说白了也就是个半斤八两的主。

至于算法的具体反推过程、技巧和经验,以及例子。大家有兴趣的话可以在这里讨论一下。但请不要具体写出这是XX软件的狗之类的话。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持,大侠们热烈讨论啊!
楼主说的,我还是不明白。已知输入数据和输出数据求运算函数,除了穷举来猜碰还有什么好方法吗?
2006-3-2 14:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ROCKEY不是提供了三段算法调用吗?这个纯粹就是数学问题了,我一般使用P1=0000、P2=0002、P3=0004、P8=0008
P1=0010、P2=0012、P3=0014、P8=0018
P1=0020、P2=0022、P3=0024、P8=0028



P1=00E0、P2=00E2、P3=00E4、P8=00E8
这种类型的数据。
穷举只要输出数据后使用编辑好的算法库(可使用字符串排列组合)可以搞定
但你必须先推出模块数据。
另外对于ROCKEY来说,取模块数据只要把每条算法的开头找到就可以取得了,这个只需要看一下手册上的例程就知道了,上面有的,我这里也就不写了。
我建议主要由人脑来判断推算,这样比较有意思。
2006-3-2 15:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
举个例子,请看下面的数据,看出规律了吗?
使用算法3
算法开头位置4H
以下是不同模块开始位置的输入和输出
模块0
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=2313 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=2313 p2=0012 p3=0014 p4=0018

************************************
模块1
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=335E p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=335E p2=0012 p3=0014 p4=0018

************************************
模块2
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=6D15 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=6D15 p2=0012 p3=0014 p4=0018

************************************
模块3
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=3E32 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=3E32 p2=0012 p3=0014 p4=0018

************************************
模块4
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=D4EB p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=D4EB p2=0012 p3=0014 p4=0018

************************************
模块5
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=704B p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=704B p2=0012 p3=0014 p4=0018

************************************
模块6
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=92DC p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=92DC p2=0012 p3=0014 p4=0018

************************************
模块7
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=627F p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=627F p2=0012 p3=0014 p4=0018

************************************
模块8
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=E156 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=E156 p2=0012 p3=0014 p4=0018

************************************
模块9
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=5413 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=5413 p2=0012 p3=0014 p4=0018

************************************
模块A
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=0002 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=0002 p2=0012 p3=0014 p4=0018

************************************
模块B
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=0012 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=0012 p2=0012 p3=0014 p4=0018

************************************
模块C
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=0012 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=0012 p2=0012 p3=0014 p4=0018

************************************
模块D
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=0113 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=0113 p2=0012 p3=0014 p4=0018

************************************
模块E
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=D1C2 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=D1C2 p2=0012 p3=0014 p4=0018

************************************
模块F
输入 p1=0000 p2=0002 p3=0004 p4=0008
输出 p1=4735 p2=0002 p3=0004 p4=0008

输入 p1=0010 p2=0012 p3=0014 p4=0018
输出 p1=4735 p2=0012 p3=0014 p4=0018

************************************

这下看出使用特殊常数输入的好处了吧。
2006-3-2 15:25
0
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
果然是高手。受教了。不过,我还是不会
2006-3-2 15:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
其实只研究算法的话完全不用去看开发手册里面的关于程序方面的东西,只要清楚每个单元里面的数据间是什么关系,他的使用方式(输入、输出)、每个使用的变量的关系是怎么样的。其他的就只是数学了。
2006-3-2 15:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
另外关于取得读数据后觉的麻烦,用穷举来找算法的话可以写一个这样的子程序,先根据排列组合得出出每句可能的算法(8种类型、8个变量)然后再对组合出的每句算法在程序中根据判断的算法的长度进行排列组合出每条算法(最好动态生成,生成文件的话可能会很大),按输入的数据和模块值等计算结果与之前采集输出的结果对比,相等则成功,不等则循环下一条。以上是流程,程序的话就自己写好了。呵呵!
2006-3-2 16:53
0
雪    币: 153
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 brainli 发布
另外关于取得读数据后觉的麻烦,用穷举来找算法的话可以写一个这样的子程序,先根据排列组合得出出每句可能的算法(8种类型、8个变量)然后再对组合出的每句算法在程序中根据判断的算法的长度进行排列组合出每条算法(最好动态生成,生成文件的话可能会很大),按输入的数据和模块值等计算结果与之前采集输出的结果对比,相等则成功,不等则循环下一条。以上是流程,程序的话就自己写好了。呵呵!


有人多大胆,地有多大产
2006-3-2 17:26
0
雪    币: 10500
活跃值: (2159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
PFPF 真是高人啊 随便一弄就搞出这个来了
2006-3-2 18:52
0
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
楼主说了R4的一些门道,只是有些地方说的并不足,
数学是个好东西,可你试过算法按你的方法是多大的数据量吗?在
设计你的"猜"算法之前,你要评估你的算法的数据量有多大!!
盲目并不解决什么问题的.

R4要是象你那样玩,怕是死的时候更多. R4的硬复制方法并不少
所谓各辟蹊径吧!但楼主说的一些地方,不敢苟同.
有些内容并不你想说的那么简单,也不是你想那么容易,尤其是对于
现大的2.07版的.R4也有一些隐含指令,这些并不是靠说说就行了.

言语不周之处,请海含,以讨论为主!
2006-3-2 21:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼上的朋友,复制R4确实有不少的方法,我这里讨论的只是R4标准版的一个基本的思路,既找出口令后不通过调试软件来跟踪、不通过完全硬件的复制,只通过用户手册的相关内容以及一些数学思维来推导,这样来得出能取得相同输出的算法。这样的工作不能叫拷贝,只能叫推导。您说的数据量大,估计没有注意我前面的说明,后来在7楼写的东西只是根据二楼朋友的思想描述的穷举的思路,所谓穷举,当然数据量大了。所谓只通过手工推导确实可以成功的。为了满足软件的正常使用,并且提高软件的加密程度,并要不会影响软件的正常使用,行业开发者是不会胡乱的采用乱数加密的方法的。由于单片机的一些特性,这样的加密是完全有数学方法可循的。所以,我们可以引入特殊常数的通过找出输出值的规律的方法,揣测开发者的数学思维,通过对于算法过程的敏感思维,猜出相同或替代的算法(为什么叫相同或替代呢?2+1+6等于6,2*3也等于6,优化算法就是这个道理,这里投机取巧了一下,说的那么直白是为了大家好理解一些)。对于楼上朋友说的“现大的2.07版的.R4也有一些隐含指令”我不太懂,能不能请您说明一下?这种说法我不清楚,也并没听说过,因为我也只是应朋友的请求,花了一星期时间来看手册,帮了个小忙而已,同时也和一些朋友讨论了一下。我开头也说了,我并不是个CRACKER,我是个甚至根本就不从事计算机这个行业的“半壶水”。写这个东西也只是一点小兴趣,一时心血来潮的写点帮忙的时候学习的心得体会而已,主要是起个抛砖引玉的作用,有什么不足的地方,还请大家谅解。当然,非常欢迎大家提出完善的方法,暂时没有意见的也请多多讨论提问(以把作者问的哑口无言为要,呵呵!)。
楼上的朋友有什么另外的思路不妨说来听听,让我们大家都来讨论学习一下。

(PS:顺便说一句,最近在http://bbs.sftime.net/ 翻译新的科幻连续剧,有兴趣的朋友可以来捧场啊)
2006-3-2 22:56
0
雪    币: 229
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
本想说二句的,但NIG大牛已经开口,我就不再说了,楼上的朋友,我很佩服你,你知道的,但是R4我想有些细节并不象你想的那样,希望我们大家坐在一起研究透了,再出来给朋友们抛砖引玉,你意下如何?
2006-3-3 08:52
0
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
13
BRAINLI 兄弟,您好,上面的发言言语有些过激,别见怪。
因狗本身是商业的东西,有些内容我无法全部说明,报歉,这里就兄弟的一些想法我来简单
说一下我的意见。

R4标准版只有3功能中,会返回一个锁的类型,这个有参考意义。

8功能中只是种子数而已,有一把锁就知道一切了。

E功能来设计算法,如果按照简单的推理,那么几行的算法是可以推出来的,甚至直接用猜
就可以解决问题,但如果算法用的超过6行,那数据量是较大的。
比如说:A=A+B A=A<B C=B+A ………………再乱写几行的话,这里面我没有用到常数,如果再
加上常数63个,并不轻松了。大约是8*8*72  一条语句的数据量。首行和末行去掉不算。
6行去2行,4608的4次方吧,已经不小了。这是指全部数据,如果再精简也不会小多少,再就
是去精简指令。  再排除算法 次序的无关性,和冗余的指令 再将有效评估的算法按O/2来进
行计算,差不多也得4608的3次方吧。这里估算的并不准确,具体的记录放在家里。

再说优化算法和替代算法,B=B+B  B=B*2  B=B<1 (B高位无值)是等同的,但是分析出来的
算法如果要拿来用,那么你就得评估算法的稳定性,换句话来说你就要用大量的数据来测试
你得出的算法到底对不对。要是不对。还有何意义?

另外,在算法猜的过程中会出现计算过程冲突的事,往往中间的数据我们并不知道,但带到
结果中的数据可能会为我们的分析带来干扰,所以测试是必要的,如果只是3,4条语句当然没
有多少难度。

R4的复制,或许只要有一把锁也就足够了,1级密码可以找到的。

说的言语很乱,能明白多少就是多少吧。有时间我再好好组织一下!
2006-3-3 14:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
都是牛人,R4的锁其实还是比较又研究的,里面包含的内容较多,一下子是很难完全领悟,况且江湖之大,高手居多!
2006-3-3 14:53
0
游客
登录 | 注册 方可回帖
返回
//