加密算法运用不当的后果

                                   加密算法运用不当的后果

                                           lnn1123[BCG][DCM][DFCG][D.4s]

看题目就知道这次的目标软件里用到了加密算法,哈哈,现在的软件用加密算法的真的是不少,软件作者已经不象以前那样的不重视加密软件了,但是用加密算法失败的例子也有不少的哦,这期我为大家带来的就是运用不好的加密算法,现在的软件很多是加的猛壳或者什么变态的加密算法,使得小菜门看了就跑,为了给大家学习破解的信心,我带了一个击败加密算法的例子.

软件介绍:

房地产开发项目经济评价可行性研究及概预决算管理系统 专业版 6.36,可实现项目成本(造价)、销售收入、投资计划、资金筹措计划、土地拍卖多方案经济分析、敏感性分析(风险性分析)电算化,可以以最快速度准确地计算出项目的造价(成本)、销售收入计算、投资计划、资金筹措计划、土地拍卖多方案经济分析、敏感性分析(风险性分析)等有关数据,并可撰写可行性报告,为房地产开发或固定资产投资企业(单位)的项目投资决策,项目实施过程中成本核算、成本控制和项目竣工后的财务决算提供依据,是土地拍卖招投标报价的好助手。


  呵呵,软件功能好像满强大的,但是注册算法的保护是不是很强大呢,

呵呵,软件功能好像满强大的,但是注册算法的保护是不是很强大呢,

呵呵 , 软件功能好像满强大的 , 但是注册算法的保护是不是很强大呢 ,

初步观察:

破解工具:

PEID 0.93

Ollydbg 1.10(下面简称OD)

2个工具是每个喜欢破解的人必备的软件啊

先用PEID看看有没有加壳,现在的软件加壳的真的是不少啊,查看情况如图1所示

(1)

看到没有壳,delphi编写的,情况还比较好哦 ^_^

运行软件看看如图2所示

(2)

发现窗口上方有尚未注册的提示,看起来真的不爽啊,决定把它给干了

跟踪过程:

试着注册一下

机器码: ACA9B-B9EEC-324A3-02A00

注册码:78787878

点注册后就是注册失败(如果不是建议买彩票 ^_^ )如图3所示

(3)

 刚才看到有错误提示,那么我的第一个想法就是找字符参考,用老罗大牛的插件(支持中文的哦)

Ultra String Reference,项目 2986

 Address=0061C6A7

 Disassembly=MOV EDX,EEV.0061C7D4

 Text String=注册失败,请再次注册!

现在好了,下断在

0061C508   . 55             PUSH EBP       //下断处

0061C509   . 8BEC           MOV EBP,ESP

0061C50B   . 83C4 D4        ADD ESP,-2C

算法分析:

0061C592   . E8 3D56E6FF    CALL EEV.00481BD4                               ;  得到机器码

0061C597   . 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]                    ;  机器码

省略代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

0061C5E4   . E8 EB55E6FF    CALL EEV.00481BD4                               ;  得到假码

0061C5E9   . 8B55 F0        MOV EDX,DWORD PTR SS:[EBP-10]                   ;  假码

0061C5EC   . A1 D4D36C00    MOV EAX,DWORD PTR DS:[6CD3D4]

省略代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

0061C618   . B8 A8C76100    MOV EAX,EEV.0061C7A8                            ;  ASCII "75EA2-2D12A-AA55A-FBCC7"

0061C61D   . E8 9E88DEFF    CALL EEV.00404EC0                               ;  要进去,因为涉及到注册

0061C622   . 85C0           TEST EAX,EAX                                    ;位测试

0061C624   . 74 0A          JE SHORT EEV.0061C630                           ;必须跳

0061C626   . E8 257DDEFF    CALL EEV.00404350

0061C62B   . E9 B3000000    JMP EEV.0061C6E3

0061C630   > 8D55 DC        LEA EDX,DWORD PTR SS:[EBP-24]                   ;  机器码

0061C633   . A1 10D76C00    MOV EAX,DWORD PTR DS:[6CD710]

0061C638   . 8B00           MOV EAX,DWORD PTR DS:[EAX]

0061C63A   . E8 49B3F8FF    CALL EEV.005A7988                               ;  要跟进,对机器码进行MD5运算

0061C63F   . 8D45 DC        LEA EAX,DWORD PTR SS:[EBP-24]

0061C642   . 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]

0061C645   . E8 1A090000    CALL EEV.0061CF64                               ;  产生的注册码,好像可以做内存注册机哦

0061C64A   . 8B45 EC        MOV EAX,DWORD PTR SS:[EBP-14]                   ;  MD5后的前8个字符连接,****-****这个样子

0061C64D   . 8B15 D4D36C00  MOV EDX,DWORD PTR DS:[6CD3D4]                   ;  EEV.006CF42C

0061C653   . 8B12           MOV EDX,DWORD PTR DS:[EDX]                      ;  假码

0061C655   . E8 6688DEFF    CALL EEV.00404EC0                               ;  重要CALL,要进去

0061C65A   . 85C0           TEST EAX,EAX                                    ;不能够让它返回EAX=0

0061C65C   . 7E 2E          JLE SHORT EEV.0061C68C                          ;  关键跳转,跳就注册失败

0061C65E   . 6A 40          PUSH 40                                         ;注册成功的提示

0061C660   . 8D55 D8        LEA EDX,DWORD PTR SS:[EBP-28]

0061C663   . A1 24D86C00    MOV EAX,DWORD PTR DS:[6CD824]

0061C68C   > 6A 10          PUSH 10                                         ;  注册失败的提示

0061C68E   . 8D55 D4        LEA EDX,DWORD PTR SS:[EBP-2C]

0061C691   . A1 24D86C00    MOV EAX,DWORD PTR DS:[6CD824]

0061C696   . 8B00           MOV EAX,DWORD PTR DS:[EAX]

0061C698   . E8 AB73E8FF    CALL EEV.004A3A48

省略代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

比较的方式:

=============================== CALL EEV.00404EC0================================

00404EC0  /$ 85C0           TEST EAX,EAX                                    ;  是否为空

00404EC2  |. 74 40          JE SHORT EEV.00404F04

00404EC4  |. 85D2           TEST EDX,EDX                                    ;  是否为空

00404EC6  |. 74 31          JE SHORT EEV.00404EF9

00404EC8  |. 53             PUSH EBX

00404EC9  |. 56             PUSH ESI

00404ECA  |. 57             PUSH EDI

00404ECB  |. 89C6           MOV ESI,EAX

00404ECD  |. 89D7           MOV EDI,EDX

00404ECF  |. 8B4F FC        MOV ECX,DWORD PTR DS:[EDI-4]

00404ED2  |. 57             PUSH EDI

00404ED3  |. 8B56 FC        MOV EDX,DWORD PTR DS:[ESI-4]

00404ED6  |. 4A             DEC EDX

00404ED7  |. 78 1B          JS SHORT EEV.00404EF4

00404ED9  |. 8A06           MOV AL,BYTE PTR DS:[ESI]                        ;  取一个字节

00404EDB  |. 46             INC ESI

00404EDC  |. 29D1           SUB ECX,EDX                                     ;  假码的长度减运算得到的字符的长度

00404EDE  |. 7E 14          JLE SHORT EEV.00404EF4                          ;  假码长度不能小于8位

00404EE0  |> F2:AE          /REPNE SCAS BYTE PTR ES:[EDI]                   ;  串扫描

00404EE2  |. 75 10          |JNZ SHORT EEV.00404EF4

00404EE4  |. 89CB           |MOV EBX,ECX

00404EE6  |. 56             |PUSH ESI                                       ;  比较的参数

00404EE7  |. 57             |PUSH EDI                                       ;  比较的参数

00404EE8  |. 89D1           |MOV ECX,EDX                                    ;  比较的位数

00404EEA  |. F3:A6          |REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]  ;  串比较

00404EEC  |. 5F             |POP EDI

00404EED  |. 5E             |POP ESI

00404EEE  |. 74 0C          |JE SHORT EEV.00404EFC                          ;  串比较是否相等

这里比较的方式是串比较,这里就是看看注册码是不是75EA2-2D12A-AA55A-FBCC7为这个,注册失败,后面最后一次比较注册码也用到这个CALL

MD5计算过程:

======================进CALL EEV.005A7988==========================================

005A79AD  |. E8 AEFEFFFF    CALL EEV.005A7860                               ;  MD5常数初始化

005A79B2  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]                    ;  机器码

005A79B5  |. E8 C2D1E5FF    CALL EEV.00404B7C                               ;  是否为空

005A79BA  |. 50             PUSH EAX

005A79BB  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]

005A79BE  |. E8 B9D3E5FF    CALL EEV.00404D7C

005A79C3  |. 8BD0           MOV EDX,EAX

005A79C5  |. 8D45 A4        LEA EAX,DWORD PTR SS:[EBP-5C]

005A79C8  |. 59             POP ECX

005A79C9  |. E8 C6FEFFFF    CALL EEV.005A7894                               ;  标准的MD5运算

005A79CE  |. 8BD3           MOV EDX,EBX

005A79D0  |. 8D45 A4        LEA EAX,DWORD PTR SS:[EBP-5C]

005A79D3  |. E8 3CFFFFFF    CALL EEV.005A7914

005A79D8  |. 33C0           XOR EAX,EAX

005A79DA  |. 5A             POP EDX

005A79DB  |. 59             POP ECX

005A79DC  |. 59             POP ECX

005A79DD  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX

005A79E0  |. 68 F5795A00    PUSH EEV.005A79F5

005A79E5  |> 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]

005A79E8  |. E8 BFCEE5FF    CALL EEV.004048AC

005A79ED  /. C3             RETN

标准MD5的特征:

==========================进CALL EEV.005A7860=====================================

005A7860  /$ C700 01234567  MOV DWORD PTR DS:[EAX],67452301                 ;  标准MD5的四个常数

005A7866  |. C740 04 89ABCD>MOV DWORD PTR DS:[EAX+4],EFCDAB89

005A786D  |. C740 08 FEDCBA>MOV DWORD PTR DS:[EAX+8],98BADCFE

005A7874  |. C740 0C 765432>MOV DWORD PTR DS:[EAX+C],10325476

005A787B  |. 33D2           XOR EDX,EDX

005A787D  |. 8950 10        MOV DWORD PTR DS:[EAX+10],EDX

005A7880  |. 33D2           XOR EDX,EDX

005A7882  |. 8950 14        MOV DWORD PTR DS:[EAX+14],EDX

005A7885  |. 83C0 18        ADD EAX,18

005A7888  |. BA 40000000    MOV EDX,40

005A788D  |. E8 DA06E6FF    CALL EEV.00407F6C

005A7892  /. C3             RETN

这段的功能就是把机器码用MD5加密算法加密得到一个MD5值,结果为16字节,机器码: ACA9B-B9EEC-324A3-02A00

我这里的机器码MD5值是: d6d11c05c3b225b10d95ec54a4cd7f9c

转化MD5:

=======================进CALL EEV.0061CF64=======================================

省略代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

0061CF6D  |. 33C9           XOR ECX,ECX

0061CF6F  |. 894D D8        MOV DWORD PTR SS:[EBP-28],ECX                   ;  为0

0061CF72  |. 894D E8        MOV DWORD PTR SS:[EBP-18],ECX

0061CF75  |. 894D DC        MOV DWORD PTR SS:[EBP-24],ECX

0061CF78  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX

0061CF7B  |. 8BF0           MOV ESI,EAX

0061CF7D  |. 8D7D EC        LEA EDI,DWORD PTR SS:[EBP-14]

0061CF80  |. A5             MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]      ;  MD5产生的16个字节

0061CF81  |. A5             MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]      ;  MD5产生的16个字节

0061CF82  |. A5             MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]      ;  MD5产生的16个字节

0061CF83  |. A5             MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]      ;  MD5产生的16个字节

省略代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

0061CF9E  |. E8 59AAF8FF    CALL EEV.005A79FC                               ;  MD5产生的16个字节

0061CFA3  |. 8B45 DC        MOV EAX,DWORD PTR SS:[EBP-24]                   ; |MD5值

0061CFA6  |. 8945 E0        MOV DWORD PTR SS:[EBP-20],EAX                   ; |

0061CFA9  |. C645 E4 0B     MOV BYTE PTR SS:[EBP-1C],0B                     ; |

0061CFAD  |. 8D55 E0        LEA EDX,DWORD PTR SS:[EBP-20]                   ; |

0061CFB0  |. 33C9           XOR ECX,ECX                                     ; |

0061CFB2  |. B8 5CD06100    MOV EAX,EEV.0061D05C                            ; |ASCII "%s"

0061CFB7  |. E8 6CDBDEFF    CALL EEV.0040AB28                               ; /转化为字符形式

0061CFBC  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]                   ;  转化为字符

0061CFBF  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]

0061CFC2  |. E8 39C3DEFF    CALL EEV.00409300                               ;  MD5转化后的字符小写转化为大写,跟进

0061CFC7  |. 8BC6           MOV EAX,ESI

0061CFC9  |. E8 DE78DEFF    CALL EEV.004048AC

0061CFCE  |. 33DB           XOR EBX,EBX

0061CFD0  |> 85DB           /TEST EBX,EBX

0061CFD2  |. 75 15          |JNZ SHORT EEV.0061CFE9

0061CFD4  |. 56             |PUSH ESI

0061CFD5  |. 8BD3           |MOV EDX,EBX

0061CFD7  |. C1E2 02        |SHL EDX,2

0061CFDA  |. B9 04000000    |MOV ECX,4                                      ;  从首位开始,取4个

0061CFDF  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]                   ;  转化为大写的MD5字符

0061CFE2  |. E8 F57DDEFF    |CALL EEV.00404DDC

0061CFE7  |. EB 2C          |JMP SHORT EEV.0061D015

0061CFE9  |> FF36           |PUSH DWORD PTR DS:[ESI]                        ;  转化为大写后的前4个字符

0061CFEB  |. 68 68D06100    |PUSH EEV.0061D068

0061CFF0  |. 8D45 D8        |LEA EAX,DWORD PTR SS:[EBP-28]

0061CFF3  |. 50             |PUSH EAX

0061CFF4  |. 8BD3           |MOV EDX,EBX                                    ;  EDX=1

0061CFF6  |. C1E2 02        |SHL EDX,2                                      ;  左移2位得到4

0061CFF9  |. B9 04000000    |MOV ECX,4                                      ;  再取四个,从第四位开始

0061CFFE  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]                   ;  转化为大写的MD5字符

0061D001  |. E8 D67DDEFF    |CALL EEV.00404DDC

0061D006  |. FF75 D8        |PUSH DWORD PTR SS:[EBP-28]                     ;  取的5-8位MD5字符

0061D009  |. 8BC6           |MOV EAX,ESI

0061D00B  |. BA 03000000    |MOV EDX,3

0061D010  |. E8 277CDEFF    |CALL EEV.00404C3C

0061D015  |> 43             |INC EBX                                        ;  用"-"连接字符

0061D016  |. 83FB 02        |CMP EBX,2

0061D019  |.^75 B5          /JNZ SHORT EEV.0061CFD0

0061D01B  |. 33C0           XOR EAX,EAX

0061D01D  |. 5A             POP EDX

0061D01E  |. 59             POP ECX

0061D01F  |. 59             POP ECX

0061D020  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX

0061D023  |. 68 4DD06100    PUSH EEV.0061D04D

0061D028  |> 8D45 D8        LEA EAX,DWORD PTR SS:[EBP-28]

0061D02B  |. BA 02000000    MOV EDX,2

0061D030  |. E8 9B78DEFF    CALL EEV.004048D0

0061D035  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]

0061D038  |. E8 6F78DEFF    CALL EEV.004048AC

0061D03D  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]

0061D040  |. E8 6778DEFF    CALL EEV.004048AC

字母转化:

======================进CALL EEV.00409300===================================

00409329  |> 8B0424         /MOV EAX,DWORD PTR SS:[ESP]                     ;eax指向md5值

0040932C  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]                       ;  依次取MD5值的一个字节

0040932E  |. 3C 61          |CMP AL,61                                      ;  大于97?

00409330  |. 72 06          |JB SHORT EEV.00409338                          ;  不小于就是小写字母了

00409332  |. 3C 7A          |CMP AL,7A                                      ;  是否大于122?

00409334  |. 77 02          |JA SHORT EEV.00409338                          ;  大于就不是字母了

00409336  |. 2C 20          |SUB AL,20                                      ;  AL=AL-0X20,小写转化为大写

00409338  |> 8B5424 04      |MOV EDX,DWORD PTR SS:[ESP+4]

0040933C  |. 8802           |MOV BYTE PTR DS:[EDX],AL                       ;  保存

0040933E  |. FF0424         |INC DWORD PTR SS:[ESP]                         ;  指针下移

00409341  |. FF4424 04      |INC DWORD PTR SS:[ESP+4]

00409345  |. 4B             |DEC EBX                                        ;  计数器减1

00409346  |. 85DB           |TEST EBX,EBX                                   ;  位测试

00409348  |.^75 DF          /JNZ SHORT EEV.00409329                         ;  循环转化

这段的C语言表示:

int a,b;

for(a=0;a<strlen(md5_ID);a++)

{

b=md5_ID([a];

  if(b>97 && b<122)

   b=b-32;

  md5_ID[a]=b

}

 

到这里软件的注册算法已经很清楚了,什么不清楚再看一次,

算法总结:

1;取得软件的机器码,用标准MD5加密一下得到一个值即为MD5_SN,把MD5值转化为字符型,然后把小写转化为大写,结果为SN

2;取SN(1-4),SN(5-8),就是取SN的前4位和SN的(5-8)位,用-连接,得到KEY,即注册码

算法就这样,算法很失败吧,MD5强大的作用好像没发挥哦,^_^我的注册信息:

机器码: ACA9B-B9EEC-324A3-02A00

注册码: D6D1-11C0

这个软件的加密方式是这样的

If(md5(机器码)=注册码)

 注册成功

Else

 注册失败

这是使用MD5最失败的方式;

注册成功的截面如图4所示:

(4)

注册机也很简单,代码我就不弄上来,就一个MD5模块,不然有骗稿费之嫌

我做的注册机界面如图(5):

(5)

声明:笔者水平有限,如有错误请指出,请有能力的朋友支持国产软件,本篇文章只交流技术,如果利用本文的相关技术去做违法的事本人概不负责.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值