摘要:iwesun 是第一个破解Protel (DXP2004sp2) 的中国人。也是我所知道的世界上第一个破解Protel (DXP2004sp2)的人。我有幸是他的朋友,所以有机会在和他的交谈中了解到这次成功破解的思想和过程。
本文是我们交谈时的记录整理,主要涉及 RSA算法的含义和及破解的主要过程。
iwesun: hi
winter: hi
iwesun: 你在干嘛?
winter: 准备做个基于无线数传模块的板子
iwesun: 你用什么?
winter: 我用Linux下免费的
iwesun: 什么?
winter: 给你一个截屏看看。
winter: Protel2004对硬件要求太高
iwesun: 1G 内存就行
winter: 我的机子太破
iwesun: Linux下的太粗糙,比DXP2004,粗糙多了。
winter: 习惯问题,你被Window惯坏了。
iwesun: 没办法。
winter: 不过,Windows的确很精美
iwesun: 那你还不如用DOS
winter: 用DOS那是有毛病
iwesun:
网络应该是自由和免费的!
---蓝波运动-----
Net must to be free and free!
-----LanBo Movement----
iwesun: 这句话翻译的对么?
winter: 也许吧,看着中文看英文可以知道你在说什么。
iwesun: free and free?不成了越来越便宜
iwesun: 或者,不成了越来越自由
winter: 意义都不错。
iwesun: LanBo 这个词好不好?
winter: BlueWave?
iwesun: 我想发音一样
iwesun: 现在我是大虾了。
winter: 是啊,你是我所知道的第一个破解Protel2004的中国人,也是世界上第一个吧。
iwesun: 地球的。
iwesun: 你来起草一个蓝波运动宣言吧,封你个“大护法”,你干不干。
winter: 好啊,只是当个护法,没一点技术含量。
iwesun: 小郑的事你干么?
winter: 不干了,我手头有一个项目
iwesun: 能听见我么?
winter: 听不见,我在Linux下,没法和你语音交谈。
winter: 你怎么破解的?说来听听。
iwesun: 你看我的帖子,你是本帖的第 13178 位读者
winter: 哦,还是你厉害,好像由国人自己破的,还不多
winter: 我指的是EDA方面的
iwesun: 所以这次名气大振
winter: 说说思路
iwesun: 什么?Debug还要有什么思路
winter: 你的破解思路
iwesun: 替换密钥。
winter: 替换密钥是什么意思?
iwesun: DXP.exe里面有一个Protel 的公开密钥呀
winter: 替换公开密钥?
iwesun: 就是用这个去验证license文件的数字签名呀
iwesun: 你没看呀,http://www.avrw.com/BBS/showbbs.asp?topage=69&bd=15&id=48523&totable=1
winter: DXP2004本身的加密技术,是什么?
iwesun: 就是用公开密钥去验证license文件的数字签名呀
winter: 不理解
iwesun: protel的license文件,这个词理解么?
winter: 理解
winter: 就是说,如果有这个license文件就可以使用protel
iwesun: 你能伪造这个文件么?
winter: 伪造的能通过protel的检测吗?
iwesun: 就是呀,protel用什么技术保证你不能伪造?
iwesun: 你知道了这个技术就可以伪造了呀
winter: 那就是用一个数字签名,来验证这个文件的合法性
iwesun: 数字签名本身就是干这事的,数字签名,这些词理解么?
winter: 理解
iwesun: 那就是了,还有什么不理解的?
winter: protel的公钥和这个lience文件是什么关系
iwesun: 公开密钥算法和数字证书,这些词理解么?
winter: 知道,但没有具体用过
iwesun: 你拿到的微软的更新文件,你怎么能保证它是微软发布的?
winter: 文件摘要,数字签名呀。
iwesun: 摘要是可以篡改的
winter: 但摘要改了以后,很容易被发现
iwesun: 什么不能改,都能改
iwesun: 我写一个木马,摘要说是微软发布的,那你怎么发现呀?
winter: 改过的摘要和摘要的再计算是不符合的
iwesun: 我连摘要的再计算也改 (winter注:摘要的计算是一个计算hash的过程)
iwesun: 但我没有改DXP.exe的代码
winter: 不明白。
iwesun: 这就是数字签名要解决的事。
iwesun: 不就是MD5么,我自己生成一个,你咋办?我连摘要的再计算也改
winter: 云里雾里
iwesun:看来你根本不懂公开密钥算法的思想。
iwesun:我什么都能改,我改了,你怎么发现我改过?
iwesun: 我说得很明白的。你到底理解不理解数字签名?你理解数字签名就明白了。
iwesun: 你给我说说数字签名吧,详细点,对一个文件签名的几个步骤
iwesun: 以及和公开密钥算法的关系
winter: 最简单的就是把整个文件的所有字节作某种运算,得到一个数值
iwesun: 这个步骤叫Hash,这个步骤任何人都可以做
iwesun: 然后呢?
winter: 这个数值就可以叫做这个文件的数字签名
iwesun: 那完蛋了,任何人都可以轻易的伪造你的签名
winter: 所以还要把这个数值加密
iwesun: 怎么加密?大的步骤。
winter: 用一个密钥,把那个数值再算一遍
iwesun: 用什么密钥?
winter: 随便,只要别人不知到
iwesun: 你知道这里为什么必须采用RSA(公开密钥算法)的道理么?
iwesun: 那好,你随便搞一个加密算法,和一个密钥对你的hash值加密了,人家真么验证
iwesun: 你是把你的加密算法和你用的密钥,告诉人家,还是不告诉?
winter: 不告诉
iwesun: 不告诉,没人能验证,那还不如,你也别用什么hash乐,直接对文件加密吧。反正就你一个人看。
iwesun: 只有你自己能验证。
winter: 算法是公开的
iwesun: 算法是公开的。密钥不公开,还是验证不了。
iwesun: 现在假设你选用的是对称加密。
iwesun: 先讨论一下你对称加密的方法是否可行?你明白对称加密这个词么?
winter: 应该是可以算过去,还能算回来
iwesun: 不对
iwesun: 加密都能算过去,还能算回来。散列不能,散列就是hash。
winter: 这个我理解,hash算不回来
iwesun: 那你再说说,对称加密这个词
winter: f(k1+明文)=密文,f(k2+密文)=明文, 我理解的是这个意思
iwesun: 解释一下
winter: f是算法,k1,k2是密钥
iwesun: 为什么要k1,k2
winter: k1可以等于k2,也可以不等
iwesun: f在两个式子里是相同的么?为什么?
winter: f应该是相同的,我想,但也许不同。我不太清楚
iwesun: k1=k2有什么意义,k1<>k2有什么意义?
winter: 不知道
iwesun: 我和你进行私人通信,约定1234是我们两个得密钥,采用的算法k1=k2
iwesun: 这样我两个的通话就不能被第三者且听了
winter: 对的,但是如果第三者(信使)用1234加密另外的内容给我怎么办
iwesun: 废话,前提是第三者不知道我们用的是1234
iwesun: 要是第三者知道了,还谈什么叫加密
iwesun: 第三者也许这能从密文反推1234,但这是困难的
winter: 但算法是公开的,反推1234也许不困难
iwesun: 那时加密强度的问题,不在目前的讨论范围中,任何加密算法都有加密强度的问题。
iwesun: 任何加密都是基于这个前提的第三者不知道密钥。
iwesun: 我们讨论的是基于另一个假设,加密强度足够高
iwesun: 加密强度足够高,第三者这能从密文反推1234是困难的
winter: 那这个时候,k1=k2有意义
iwesun: 那就是了,所谓对称加密就是k1=k2
winter: 这就叫对称? 我还以为是算过去再算回来
iwesun: 而且单从加密强度来说k1=k2的加密算法,可以很容易达到很大
iwesun: 那你再说说非对称加密
winter: 那我的理解就是算过去,很难算回来,
iwesun: 又想当然了
winter: 没有看过这方面的书
iwesun: 没有密钥,对称加密,也很难算回去
iwesun: k1<>k2,就叫非对称加密
iwesun: 一个设计良好的加密系统,其加密强度,不依赖预算法的保密性,而要依赖于密钥
iwesun: 数学家追求的就是这样的加密算法,k1<>K2
iwesun: 那你就应该明白了,人类一开始都采用的是对称加密,加密仅仅局限于“朋友”之间
winter: 理解
iwesun: 朋友----相互约定好密钥的人
winter: 非朋友之间就不能采用对称
iwesun: 那陌生人如何实现加密通信?
iwesun: 你设计一下,陌生人如何实现加密通信?
winter: 不清楚
iwesun: 简单的说,是这样的。我:有Kg和Ks。(winter注:Kg公钥,Ks私钥)
iwesun: 我把Kg公布在网上
iwesun: 全世界任何人都有我的Kg
winter: 这就叫公钥,怎么用呢
iwesun: 这样全世界任何人都可以用我的这个Kg加密生成一封信
iwesun: 这封信只有我能用我的Ks解密
winter: 哦,Kg和Ks是一对。
iwesun: 这样一个陌生人可以给我发一封只有我看得懂的信。
iwesun: 我收到这封信后,打开了,里面有陌生人的email和他的Kg
iwesun: 我也一样,用他给我的Kg来加密给他的信,这样他就能用他的Ks来解密这封信了。
iwesun: 明白了么?这就是RSA在通信的应用
winter: 哦,你要用他公布的他的Kg来加密只有他的Ks可以打开的信。每个人都得有自己的Kg和Ks。
iwesun: 对喽。
iwesun: Kg和Ks都是自己生成的,给对方发信,用对方的Kg加密,并把自己的Kg高诉对方。
iwesun: 你自己的Ks永远不告诉任何人
winter: 这个当然。那如何生成自己的Kg和Ks呢?
iwesun: 我给你一个例子
iwesun: 两个非常大的质数
iwesun: 乘起来是一个合数
winter: 对
iwesun: 乘很容易
iwesun: 但对他进行分解,就非常困难了
iwesun: 因为只有一个解
winter: 那是很难找到解
winter: 用这两个非常大的质数如何做出Kg和Ks
iwesun: 我的数是两个本来就是两个质数的积
iwesun: 我公布那个乘积作为Kg
iwesun: 我自己手里拿着两个质数,作为Ks
iwesun: 公开密钥算法都是用这种唯一,但困难的数学问题构造的
winter: 那质数要多大
iwesun: 512bit以上
iwesun: Protel用的是2048bit
winter: 如何找这种质数
iwesun: 费马大定理,2的(2n)次方 -1是质数的可能性非常大
iwesun: 费马大定理,还未被推翻,但也没被证明。
winter: 哦,原来如此。
iwesun: 那,加密通信你该明白了。
iwesun: 另一个应用,就是数字签名,和这有点不一样。
iwesun: 其实,还有一点我没提
iwesun: 就先把加密通信讲透把
iwesun: RSA加密算法的运算量通常很大,因此速度较慢
winter: 理解
iwesun: 因此采用RSA算法作为全部的加密算法是不可行的
iwesun: 通常,两个陌生人也就是在第一次通信时,使用这个算法
winter: 第二次呢
iwesun: 在通信的内容中,约定一个相同的对称密钥
iwesun: 比如1234,以后的通信就用1234
winter: 可以理解,就变成对称加密了。
iwesun: 明白了么。
winter: 明白
iwesun: 你说说数字签名,根据上面的情况设计数字签名
iwesun: 数字签名的要求你应该明白吧?
winter: 用自己的Ks加密自己的身份,对方用我的Kg解密
iwesun: 你差不多明白了,好,现在讨论破解Protel。
iwesun: 那你明白Protel的Lience文件了么?
winter: 不太明白
iwesun: protel公司生成了一对Kg何Ks
iwesun: 你交钱的时候,Protel公司用它的Ks生成一个Liense文件
iwesun: 你拿着这个Liense文件,你的Protel2004里有Kg,用Kg来检验你的协议文件是否有效
winter: 所谓有效,是一个什么结果呢?
iwesun: 有效就是能够正确解密。
iwesun: 从原理上说,这个协议文件是“不可伪造”
winter: 对,否则Kg验证不来哦,不过是不是可以同时伪造Liense和Kg
iwesun: Protel2004SP2比以前的版本有许多重大的更新,功能上加强很多,完全可以称得上是2005版
iwesun: 这样,Protel公司对它采用了史无前例的保护,采用了2048为的公开密钥
iwesun: 那你明白了,我为什么要替换他的Kg了么?
winter: 我明白,但得先伪造那个Liense文件。
iwesun: 我自己生成一对Ks和Kg
iwesun: 我把我的Kg写到Protel程序中,替换它的Kg
iwesun: 这样我有与之相对应的Ks
iwesun: 我可以任意生成License文件,根本就不需要他的License文件
winter: 说如何生成那个Liense文件,我关心的是那个Lience加密前的内容
iwesun: 很简单,其本质就是一个ini文件
winter: 你是说,那个Liense文件实际上是一个ini文件
iwesun: 就是包里的ini文件,你自己想怎么写就怎么写。
winter: 什么叫自己想怎么写就怎么写?
iwesun: 我看你完蛋了,我说为什么,你怎么这么费尽。
winter: 没有搞过这东西
iwesun: 我以前也没搞过,就是听听概念,也没详细看过。
winter: 我更是听都没有听过,不过今天算是搞明白了一点
iwesun: 明白个屁。
winter: 还有一个问题,你如何保正你的加密算法,和Protel的解密算法一致
iwesun: 废话。debug
winter: 你debug的是他的解密算法呀
iwesun: 是呀
winter: 加密算法和解密算法是一样的?
iwesun: 它还发明自己的算法不成?
winter: 也许呀,难道不可以吗?
iwesun: 我早都说了,加密强度不依靠算法的保密性
winter: 这个我也理解
iwesun: 你自己设计的算法,从数学上将肯定没有数学家搞的完善
iwesun: 搞不好,会漏洞百出。数学家搞得都有严格的证明
iwesun: 加密和解密是不同的,但是都是公开的
winter: 但是有多种算法吧
iwesun: 就两种,看到他如何解密,就知道他如何加密了
iwesun: 而且常用的就一种,一看就知道,跑不掉的。
winter: 啊,那我就清楚了,说说如何做那个Liense文件。
iwesun: 首先,得破解Liense文件的格式。
iwesun: 文件的第一个DWORD,即头4字节是ini文件的长度。
iwesun: 接着是ini文件的内容。
iwesun: 最后是256字节的数字签名。
winter: 等等,数字签名如何产生的?
iwesun: 就是ini内容的hash后用Ks产生啊。
winter: 是啊,Protel用你的Kg解密后,它怎么验证那个hash是否合法?
iwesun: 在对ini内容hash啊。
winter: 是呀,你怎么保证你的hash算法和他的hash算法一样。
iwesun: 都是调用MS的库方法。
winter: 哦,这样。
winter: 那,加密和解密也是MS的库方法?
iwesun: 有关签名的过程全都调MS的CSP的API。
iwesun: 最后还要对这个文件从要把[256]空间映射到[64]空间,完成一个转换。
winter: base64编码?
iwesun: base64编码,你说说,我不知道。
winter: 2(6次方)=64
winter: 用6bit编码8bit的信息。4x6=3x8,最后是把0x00-0xFF的内容用文本0-9A-Za-z/表示。
iwesun: 对了。
iwesun: 上面的文件用base64编码后,就是最后的alf文件,也就是Liense文件。
winter: 那那些激活码都是障眼法
iwesun: 也不完全是
winter: 怎么说?
iwesun: protel是网上激活的,这些是网上的数据库的值
winter: 这些东西都加到ini文件里?
iwesun: 对呀,
iwesun: 记录你的身份
winter: 那现在做的,就是自己写一个ini文件,自己往里面加任意的东西--按它的格式,
winter: 然后,用这个ini文件作数字签名。
winter: 然后先生成一个二进制的文件,最后base64这个文件得到最终的alf文件。
iwesun: 基本上说法成立。
iwesun: 但ini的内容也不能完全任意,他的每个项都有意义
winter: 我知道,我指的是那几个码
iwesun: 那几个码现在看来也是有意义的
winter: 也就是说,哪几个码不能乱写
iwesun: 乱写也能用
iwesun: 但不是正式板的license
iwesun: 正式板的license 的码应满足一定的关系
iwesun: 乱写的就像是无限期的全功能实用版
winter: 那你这次工作的总结可不可以是这样:1。确定解密算法,2。确定alf文件的生成方法
iwesun: 是吧
winter: 今晚算是上了一课,对加密和解密有了新的认识
iwesun: 你怎么连这些常识都知道得太少了
winter: 我的工作中并不需要这些,几乎没有碰过
iwesun: 还是跟微软跑吧
winter: 那到没有必要
iwesun: protel现在看来紧跟微软,VS2003公布,他就用他改写一遍。
iwesun: 界面超级华丽
winter: 可以想象
iwesun: 这次破解,学了学VC。
winter: 我准备把今天我们的交谈整理一下,发布出来。
iwesun: 好的
iwesun: 我还是习惯C#,但这次没办法,C#调不了这些函数。
winter: 我习惯了Java
winter: 不过我要删除一些影响我形象的对话,我不能表现的那么笨,毕竟是和高手对话
iwesun: 啊,哈哈。随你
winter: 哈哈
iwesun: 这一仗,至少让我以后,讨饭的时候,有人能聘我了
iwesun: 混口饭吃,应该不成问题了。
winter: 你是高手啊
iwesun: 你是
winter: 如果你是福尔摩斯,我愿做华生,跟在你身边
iwesun: 你是如来佛,我是迦南
iwesun: 我要把你供起来
iwesun: 有可能的话,推动一下蓝波运动
iwesun: 网络自由化运动
winter: 我准备以这篇对话加入
iwesun: 叫什么?题目
winter: 普通一点,就叫《关于这次成功破解ProtelDXP的对话》
iwesun: 好的。
winter: 对了,还有一个问题,关于base64。
iwesun: base64是Protel自己编的
winter: 那base64,你是用protel的代码,是吗?
iwesun: 我自己编的
winter: 但是base64编码和解码也得一样呀
iwesun: base64编码和解码我用了两个映射表
winter: 你得先得到Protel的base64的map吧
iwesun: 对,Debug是可以看到
winter: 好,基本上整个过程我都清楚了,等会可以写了。
iwesun: 我还把这个表贴出来过
winter: 你觉得论坛上有多少人理解
iwesun: 其实我一开始就找到了核心的地方,希望大家一起做,但回应寥寥无几。
iwesun: stefan0n@hotmail.com 这个意大利人我一说RSA,他就明白了
iwesun: 我睡觉了。
iwesun has closed the conversation window.
iwesun logged out.
670

被折叠的 条评论
为什么被折叠?



