一个网上学来的验证方法(附C#加密算法)
2008-03-13 10:44
309 查看
做软件开发的人,尤其是做共享软件的,最终都要对自己的软件加以保护。《加密与解密》上说网上80%的软件,都是通过序列号来实现保护的,具体做法是根据一个私人信息(如用户名、邮箱、硬件序列号等),经过一定的加密算法,得到软件注册号(序列号)。这种方式的缺点是,解密者能通过分析加密算法,比较容易写出同样的加密算法,也就是注册机。当然,解密者需要较深厚的编程功底。
个人认为,通过分析别人的加密算法,再应用到自己的程序中,对程序员来讲,不适为一种自我提高的捷径。
以下是我分析破解的某知名通讯软件的用户验证方法:
1、过程分析
因为是网络软件,所以分了服务器端,和客户端。服务器端负责发送随机字串GUID和记录Session,客户端根据GUID进行加密得到EncryptKey,再将EncryptKey发往服务器端进行验证。
分析的切入点是客户端,我们是无法控制服务器端(黑客方法除外)。从客户端,我们能得到接收到的参数GUID和加密过程。
2、加密算法分析
这是我通过多次跟踪后,得到的EXE中的加密函数
0040227B |. 68 B0144300 PUSH Appxxx.004314B0 ; "RandomKey.aspx"返回GUID
200402280 |. 68 0C344300 PUSH Appxxx.0043340C
300402285 |. 52 PUSH EDX
400402286 |. E8 AD990100 CALL Appxxx.0041BC38
50040228B |. 8DAE D4000000 LEA EBP,DWORD PTR DS:[ESI+D4]
600402291 |. 8BCD MOV ECX,EBP
700402293 |. E8 A84B0000 CALL Appxxx.00406E40
800402298 |. 85C0 TEST EAX,EAX
90040229A |. 75 19 JNZ SHORT Appxxx.004022B5
0040229C |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
004022A0 |. C74424 54 FFF>MOV DWORD PTR SS:[ESP+54],-1
004022A8 |. E8 37970100 CALL Appxxx.0041B9E4
004022AD |. 83C8 FF OR EAX,FFFFFFFF
004022B0 |. E9 CA050000 JMP Appxxx.0040287F
004022B5 |> 8D4C24 24 LEA ECX,DWORD PTR SS:[ESP+24]
004022B9 |. E8 F2700000 CALL Appxxx.004093B0
004022BE |. 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
004022C2 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
004022C6 |. C64424 54 01 MOV BYTE PTR SS:[ESP+54],1
004022CB |. 8B40 F8 MOV EAX,DWORD PTR DS:[EAX-8]
004022CE |. 50 PUSH EAX
004022CF |. E8 8B9A0100 CALL Appxxx.0041BD5F
004022D4 |. 50 PUSH EAX ; /Arg1
004022D5 |. 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28] ; |
004022D9 |. E8 D27C0000 CALL Appxxx.00409FB0 ; \ MD5第一次加密
004022DE |. 50 PUSH EAX
004022DF |. 8D4C24 24 LEA ECX,DWORD PTR SS:[ESP+24]
004022E3 |. E8 6A970100 CALL Appxxx.0041BA52
004022E8 |. 6A 05 PUSH 5
004022EA |. 8D4C24 44 LEA ECX,DWORD PTR SS:[ESP+44]
004022EE |. 6A 13 PUSH 13 ; 取19位置5个字符
004022F0 |. 51 PUSH ECX
004022F1 |. 8D4C24 2C LEA ECX,DWORD PTR SS:[ESP+2C]
004022F5 |. C64424 60 02 MOV BYTE PTR SS:[ESP+60],2
004022FA |. E8 D27A0100 CALL Appxxx.00419DD1
004022FF |. 8BD8 MOV EBX,EAX
00402301 |. 6A 05 PUSH 5
00402303 |. 8D5424 40 LEA EDX,DWORD PTR SS:[ESP+40]
00402307 |. 6A 04 PUSH 4 ; 取4位置的5个了符
00402309 |. 52 PUSH EDX
0040230A |. 8D4C24 2C LEA ECX,DWORD PTR SS:[ESP+2C]
0040230E |. C64424 60 03 MOV BYTE PTR SS:[ESP+60],3
00402313 |. E8 B97A0100 CALL Appxxx.00419DD1
00402318 |. 8DBE FC020000 LEA EDI,DWORD PTR DS:[ESI+2FC]
0040231E |. C64424 54 04 MOV BYTE PTR SS:[ESP+54],4
00402323 |. 57 PUSH EDI
00402324 |. 50 PUSH EAX
00402325 |. 8D4424 40 LEA EAX,DWORD PTR SS:[ESP+40]
00402329 |. 50 PUSH EAX
0040232A |. E8 A3980100 CALL Appxxx.0041BBD2
0040232F |. 53 PUSH EBX
00402330 |. 8D4C24 38 LEA ECX,DWORD PTR SS:[ESP+38]
00402334 |. 50 PUSH EAX
00402335 |. 51 PUSH ECX
00402336 |. C64424 60 05 MOV BYTE PTR SS:[ESP+60],5
0040233B |. E8 92980100 CALL Appxxx.0041BBD2
00402340 |. 8D5424 14 LEA EDX,DWORD PTR SS:[ESP+14]
00402344 |. C64424 54 06 MOV BYTE PTR SS:[ESP+54],6
00402349 |. 52 PUSH EDX
0040234A |. 50 PUSH EAX
0040234B |. 8D4424 24 LEA EAX,DWORD PTR SS:[ESP+24]
0040234F |. 50 PUSH EAX
00402350 |. E8 7D980100 CALL Appxxx.0041BBD2 ; 连接字串
00402355 |. 8D4C24 34 LEA ECX,DWORD PTR SS:[ESP+34]
00402359 |. C64424 54 0B MOV BYTE PTR SS:[ESP+54],0B
0040235E |. E8 81960100 CALL Appxxx.0041B9E4
00402363 |. 8D4C24 38 LEA ECX,DWORD PTR SS:[ESP+38]
00402367 |. C64424 54 0A MOV BYTE PTR SS:[ESP+54],0A
0040236C |. E8 73960100 CALL Appxxx.0041B9E4
00402371 |. 8D4C24 3C LEA ECX,DWORD PTR SS:[ESP+3C]
00402375 |. C64424 54 09 MOV BYTE PTR SS:[ESP+54],9
0040237A |. E8 65960100 CALL Appxxx.0041B9E4 ; 往串前加字串了
0040237F |. 8D4C24 40 LEA ECX,DWORD PTR SS:[ESP+40]
00402383 |. C64424 54 08 MOV BYTE PTR SS:[ESP+54],8
00402388 |. E8 57960100 CALL Appxxx.0041B9E4
0040238D |. 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
00402391 |. 8B41 F8 MOV EAX,DWORD PTR DS:[ECX-8]
00402394 |. 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C]
00402398 |. 50 PUSH EAX
00402399 |. E8 C1990100 CALL Appxxx.0041BD5F
0040239E |. 50 PUSH EAX ; /Arg1
0040239F |. 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28] ; |
004023A3 |. E8 087C0000 CALL Appxxx.00409FB0 ; \ MD5第二次 加密
004023A8 |. 50 PUSH EAX
//后期处理
从上面分析看出,这个加密过程用到了两次md5加密,第一次结果的处理后,交由第二次加密。
3、加密算法还原C#代码
弄清楚了过程,写还原代码就简单了,以下是用C#实现的代码
1 public string GetEncrypKey(string strKey, string strID)
8
个人认为,通过分析别人的加密算法,再应用到自己的程序中,对程序员来讲,不适为一种自我提高的捷径。
以下是我分析破解的某知名通讯软件的用户验证方法:
1、过程分析
因为是网络软件,所以分了服务器端,和客户端。服务器端负责发送随机字串GUID和记录Session,客户端根据GUID进行加密得到EncryptKey,再将EncryptKey发往服务器端进行验证。
分析的切入点是客户端,我们是无法控制服务器端(黑客方法除外)。从客户端,我们能得到接收到的参数GUID和加密过程。
2、加密算法分析
这是我通过多次跟踪后,得到的EXE中的加密函数
0040227B |. 68 B0144300 PUSH Appxxx.004314B0 ; "RandomKey.aspx"返回GUID
200402280 |. 68 0C344300 PUSH Appxxx.0043340C
300402285 |. 52 PUSH EDX
400402286 |. E8 AD990100 CALL Appxxx.0041BC38
50040228B |. 8DAE D4000000 LEA EBP,DWORD PTR DS:[ESI+D4]
600402291 |. 8BCD MOV ECX,EBP
700402293 |. E8 A84B0000 CALL Appxxx.00406E40
800402298 |. 85C0 TEST EAX,EAX
90040229A |. 75 19 JNZ SHORT Appxxx.004022B5
0040229C |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
004022A0 |. C74424 54 FFF>MOV DWORD PTR SS:[ESP+54],-1
004022A8 |. E8 37970100 CALL Appxxx.0041B9E4
004022AD |. 83C8 FF OR EAX,FFFFFFFF
004022B0 |. E9 CA050000 JMP Appxxx.0040287F
004022B5 |> 8D4C24 24 LEA ECX,DWORD PTR SS:[ESP+24]
004022B9 |. E8 F2700000 CALL Appxxx.004093B0
004022BE |. 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
004022C2 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
004022C6 |. C64424 54 01 MOV BYTE PTR SS:[ESP+54],1
004022CB |. 8B40 F8 MOV EAX,DWORD PTR DS:[EAX-8]
004022CE |. 50 PUSH EAX
004022CF |. E8 8B9A0100 CALL Appxxx.0041BD5F
004022D4 |. 50 PUSH EAX ; /Arg1
004022D5 |. 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28] ; |
004022D9 |. E8 D27C0000 CALL Appxxx.00409FB0 ; \ MD5第一次加密
004022DE |. 50 PUSH EAX
004022DF |. 8D4C24 24 LEA ECX,DWORD PTR SS:[ESP+24]
004022E3 |. E8 6A970100 CALL Appxxx.0041BA52
004022E8 |. 6A 05 PUSH 5
004022EA |. 8D4C24 44 LEA ECX,DWORD PTR SS:[ESP+44]
004022EE |. 6A 13 PUSH 13 ; 取19位置5个字符
004022F0 |. 51 PUSH ECX
004022F1 |. 8D4C24 2C LEA ECX,DWORD PTR SS:[ESP+2C]
004022F5 |. C64424 60 02 MOV BYTE PTR SS:[ESP+60],2
004022FA |. E8 D27A0100 CALL Appxxx.00419DD1
004022FF |. 8BD8 MOV EBX,EAX
00402301 |. 6A 05 PUSH 5
00402303 |. 8D5424 40 LEA EDX,DWORD PTR SS:[ESP+40]
00402307 |. 6A 04 PUSH 4 ; 取4位置的5个了符
00402309 |. 52 PUSH EDX
0040230A |. 8D4C24 2C LEA ECX,DWORD PTR SS:[ESP+2C]
0040230E |. C64424 60 03 MOV BYTE PTR SS:[ESP+60],3
00402313 |. E8 B97A0100 CALL Appxxx.00419DD1
00402318 |. 8DBE FC020000 LEA EDI,DWORD PTR DS:[ESI+2FC]
0040231E |. C64424 54 04 MOV BYTE PTR SS:[ESP+54],4
00402323 |. 57 PUSH EDI
00402324 |. 50 PUSH EAX
00402325 |. 8D4424 40 LEA EAX,DWORD PTR SS:[ESP+40]
00402329 |. 50 PUSH EAX
0040232A |. E8 A3980100 CALL Appxxx.0041BBD2
0040232F |. 53 PUSH EBX
00402330 |. 8D4C24 38 LEA ECX,DWORD PTR SS:[ESP+38]
00402334 |. 50 PUSH EAX
00402335 |. 51 PUSH ECX
00402336 |. C64424 60 05 MOV BYTE PTR SS:[ESP+60],5
0040233B |. E8 92980100 CALL Appxxx.0041BBD2
00402340 |. 8D5424 14 LEA EDX,DWORD PTR SS:[ESP+14]
00402344 |. C64424 54 06 MOV BYTE PTR SS:[ESP+54],6
00402349 |. 52 PUSH EDX
0040234A |. 50 PUSH EAX
0040234B |. 8D4424 24 LEA EAX,DWORD PTR SS:[ESP+24]
0040234F |. 50 PUSH EAX
00402350 |. E8 7D980100 CALL Appxxx.0041BBD2 ; 连接字串
00402355 |. 8D4C24 34 LEA ECX,DWORD PTR SS:[ESP+34]
00402359 |. C64424 54 0B MOV BYTE PTR SS:[ESP+54],0B
0040235E |. E8 81960100 CALL Appxxx.0041B9E4
00402363 |. 8D4C24 38 LEA ECX,DWORD PTR SS:[ESP+38]
00402367 |. C64424 54 0A MOV BYTE PTR SS:[ESP+54],0A
0040236C |. E8 73960100 CALL Appxxx.0041B9E4
00402371 |. 8D4C24 3C LEA ECX,DWORD PTR SS:[ESP+3C]
00402375 |. C64424 54 09 MOV BYTE PTR SS:[ESP+54],9
0040237A |. E8 65960100 CALL Appxxx.0041B9E4 ; 往串前加字串了
0040237F |. 8D4C24 40 LEA ECX,DWORD PTR SS:[ESP+40]
00402383 |. C64424 54 08 MOV BYTE PTR SS:[ESP+54],8
00402388 |. E8 57960100 CALL Appxxx.0041B9E4
0040238D |. 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
00402391 |. 8B41 F8 MOV EAX,DWORD PTR DS:[ECX-8]
00402394 |. 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C]
00402398 |. 50 PUSH EAX
00402399 |. E8 C1990100 CALL Appxxx.0041BD5F
0040239E |. 50 PUSH EAX ; /Arg1
0040239F |. 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28] ; |
004023A3 |. E8 087C0000 CALL Appxxx.00409FB0 ; \ MD5第二次 加密
004023A8 |. 50 PUSH EAX
//后期处理
从上面分析看出,这个加密过程用到了两次md5加密,第一次结果的处理后,交由第二次加密。
3、加密算法还原C#代码
弄清楚了过程,写还原代码就简单了,以下是用C#实现的代码
1 public string GetEncrypKey(string strKey, string strID)
8
相关文章推荐
- C#后台验证身份证号码的一个方法
- 一个验证IP范围内权限的C#方法,支持 ? * -
- 一个验证IP范围内权限的C#方法,支持 ? * -
- C#后台验证身份证号码的一个方法
- 今天在网上找到的一个清楚c盘垃圾文件的方法
- c#文件流读取编码问题(转)新增加一个方法解决不带BOM的问题
- 想到一个对于灵魂是否存在的简单可行的验证方法
- 定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
- C#在一个解决方案下怎么在一个窗体中调用另一个窗体中的方法
- 深入理解 c# 第五章 从匿名方法返回一个值 求余数
- C# B/S程序中使用DropDownList出现System.ArgumentOutOfRangeException: “DropDownList1”有一个无效 SelectedValue,因为它不在项目列表中的解决方法
- C#程序(含多个Dll)合并成一个Exe的简单方法
- 一个用户实体应该有它自己的实体验证,即一个实体应该有它的属性,方法,扩展属性及验证机制组成
- 一个例子帮你搞懂C#语言高级特性系列(03) --- 方法扩展
- (转)网上找到的学习C#的方法
- 一个C#类多态与隐藏(new)方法的结果分析
- C#一个DataSet中存入多个DataTable的方法
- C#一个产生随机不重复数组的方法
- 一个简单方法完成C#时间间隔的计算
- 分享一个格式化文件大小的 C# 方法(转)