- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对一个公司加密模块进行破解的感想和思考
这个是对一个公司的加密模块进行的破解性分析过程,如果您对编程非常感兴趣,您可以看看。同时也是对这个烂公司的鄙视。
这本身是新上的二手房交易系统的加密模块,模块由公司提供。只给了动态连接库的目标码。公司不提供源码。只让使用。前期我是对公司给的加密模块不感兴趣的。但拿到程序后我进行测试,发现不同的机器运行后的加密结果不同。又与公司进地联系。对方说不同也没问题,但我心里虚。我在想。为何加密后的东西不同的机器不同呢?公司会不会在库里加入了木马之类,在传输数据的同时取走我行的系统资料?
因为完成了测试,我们给房管局联系,对方让我们与他们的开发公司联系。开发公司的人牛B得不得了。说:“你们测试加密解密通过了我们来继续谈接口和专线的事”,我感觉比较新鲜,一般公司是房管局的合同乙方,应该把房管局当成上帝啊。这个公司牛B得象中央发改委,更象中国红十字会。而且将来的生产密钥等均由公司来提供。我心里更晕了。
我对他们给的这个动态库进行检查,发现还真是有趣,从表现上看不出什么。但无论如何,我发现加密后的第一个字符和最后两个字符永远不变。但换台机器会变。我更害怕了。我想如果这个该死的公司把我们银行的系统资料从交易中取走可不是好事。我就用DEBUG开始慢慢检查检查。
报文样例:
加密前数据“ABCDE”,密钥:“1234”
加密后数据“BDLHHMJKHEOOGRJFEJHOMCLMEPOBG”
把密钥和数据的内容变更后,最后的两字符永远是“BG”。这个BG是做什么呢?
1.于是装入调试,发现起初这个申请先申请了30000字节的空间。这个我基本明白是因为这个接口中没有用户返回地址。地址是由这个程序进行返回的,所以要申请空间。然后他们又调了一层。
PUSH EBP
MOV EBP,ESP
MOV EAX,7530
CALL 10001B40
PUSH 7530
PUSH 0
LEA EAX,DWORD PTR SS:[EBP+FFFF8AD0]
PUSH EAX
CALL2.第一个子程序用一个参数0x7530,第二个子程序用了堆栈空间,大小也是30000,所以我推断CALL 10001B40应该是个分配空间过程。下面的子程序用了三个参数EAX,0,30000),我想可能是变量置0的操作,应该是memset的系统涵数。我进入函数分析确认了自己的判断。于是一点点向下进行。
3.然后我发现,把清过零的空间地址,密钥,明文,一起当成三个参数进入另一个函数
我就跟踪这个函数了。
4.函数内部是这样的
PUSH EBP
MOV EBP,ESP
MOV EAX,15FA4
CALL 10001B40
这里又调了 10001B40的子过程,显然仍然是分配内存。这次更吓人,直接分配了90020字节,暂时不管它了。继续
MOV EAX,DWORD PTR SS:[EBP+8]
PUSH EAX
CALL 100019C0
5.这里明显是把明文的址当做参数了,而且是取的地址,我就猜测是把明文串进行加工的。我又跟踪进去看看,原来只是个简单的取长度的操作。就当成是strlen()函数的功能吧。
就这样一点点跟踪,其实还是非常培苦的。最后研究了约两天时间,终于把这个程序给完成分析出来了。
6.其实过程就是(以明文”ABCDE”,密钥为”1234”为例):
把明文和密钥连接到一起
得到ABCDE1234
7.然后按ASCII方式得到字符串的ASCII值串。
上面的‘A’就是065,‘B’就是066…
于是得到065066067068069049050051052
8.接着把这个字符串分别按奇数位和偶数位进行分割,然后再接到一起。
奇数位05607609400502
偶数位6066086095015
再接起来得到056076094005026066086095015
9.上述的字符串拆并进行7次最后得到字符串
006025065086096014055076096
10.接着按位把密钥串中的字符一对一的字符取出,并对7进行取余,再加上数据位的序号本身的序号与7的取余结果相加,再加上17得到新的字符串
如第一个字符为”0”
上面密钥第一个字符为’1’
取新的字符为48(0的ASCII值)+第一个密钥字符ASCII值除7的余数+序号除7的余数+17
为:48+(49 %7)+0+17=48+0+0+17=65 而65就是A的ASCII值。
同样,第二个字符为
48+(50 % 7)+1+17=48+1+1+17=67 而67就是C的ASCII值。
以此类推,全部进行好后,得到新的字符串
ACKGGLIJGDNNFQIEDIGNLBKLDON
11.然后程序取了一个伪随机数这里为23,可能不同
把这个数 乘 214
文档评论(0)