此文也就是给木有太多.NET编程基础的同学一个最最最简单的思路,遇到加密的连接字符串、加密的密码的时候怎样用一种比较简单的方式去解决掉他。
突然会去看这个东西是因为乌云zone上有人发了一个求助:
此洞主还绕了半圈去联系到了我,然后吗预感觉得不会特别特别难,就当再学习下看看了。
相关的dll:zjdx.dll,文件大小:13.3 MB (14,036,992 字节),反编译一看内容就是正方的东西。
随便找一个可以反编译C#的DLL的工具就可以开始了(为什么是C#?因为正方就是.NET写的啊!),不多说。直入主题。
首先肯定先找和dll名字一样的命名空间内的信息:
里面内容非常的多,肯定找重点,既然要找和数据库连接相关的信息,肯定先找涉及登录的页面,比如过去出过洞的default5:
到这什么都不用想,直接先奔往打开页面必须要执行的方法:
private void Page_Load(object sender, EventArgs e)
里面大大的一句:
OracleConnection oracleConnection = new OracleConnection(ConfigurationSettings.get_AppSettings().get_Item("MyConn") + Module1_sjf.jiemi(ConfigurationSettings.get_AppSettings().get_Item("MyPwd"), Module1_sjf.str_jm));
所以从这看出,数据库连接字符串的构成主要是web.config里面的MyConn和MyPwd。
这里的MyPwd是作为参数传递到 “jiemi”这个方法里面的(一看就是解密啊),然后在调用的这地方就可以看见有两个参数,先看看jiemi方法的定义(点击jiemi就可以跳转过去了):
public static string jiemi(string PlainStr, string key)
第一个参数不说了,第二个参数肯定是解密的密钥了。
再点击Module1_sjf.str_jm的str_jm看看:
public static string str_jm = "Acxylf365jw";
到这就基本可以知道怎么解密了。先看一下原版的jiemi方法:
public static string jiemi(string PlainStr, string key) { int num = 1; checked { if (Strings.Len(PlainStr) % 2 == 0) { string text = Strings.StrReverse(Strings.Left(PlainStr, (int)Math.Round((double)Strings.Len(PlainStr) / 2.0))); string text2 = Strings.StrReverse(Strings.Right(PlainStr, (int)Math.Round((double)Strings.Len(PlainStr) / 2.0))); PlainStr = text + text2; } int arg_6C_0 = 1; int num2 = Strings.Len(PlainStr); string text5; for (int i = arg_6C_0; i <= num2; i++) { string text3 = Strings.Mid(PlainStr, i, 1); string text4 = Strings.Mid(key, num, 1); if ((Strings.Asc(text3) ^ Strings.Asc(text4)) < 32 | (Strings.Asc(text3) ^ Strings.Asc(text4)) > 126 | Strings.Asc(text3) < 0 | Strings.Asc(text3) > 255) { text5 += text3; } else { text5 += StringType.FromChar(Strings.Chr(Strings.Asc(text3) ^ Strings.Asc(text4))); } if (num == Strings.Len(key)) { num = 0; } num++; } return text5; } }
这个方法里面调用了个别VB库里面才有的东西。程序本身出了一些简单的奇偶判断就是一些位运算,想看懂可能不难,但是想理解整个算法原理、为什么可逆,也不在我们今天讨论的范围内了。
在使用上面这段代码之前还有一些工作:
1.添加引用Microsoft.VisualBasic:
2.修改一处代码:
text5 += Strings.Chr(Strings.Asc(text3) ^ Strings.Asc(text4)).ToString(); //其实只是避免再添加其它引用,反正都是string,其它个别要修改的地方自己看看咯,其实其它不改也可以。
也可以完全修改成只用.NET默认库里面的东西,这个不提,相信大家都可以。
那位洞主给出的加密后密码是这样的:
Z%+6*2l~q2.
而key已经知道是Acxylf365jw(个人感觉这个可能针对不同版本、不同授权可能会有不同,如果哪天只是获取到了web.config,未必可以正确进行解密的工作),附上一个解密后的截图(原帖已经有人发出来了):
实际上整个过程预计3到5分钟应该可以完成了,对于大家来说也不是是没特别难的事情,就当一个小小的交流!
改后的程序也附上吧,虽然没什么特别大的意义:
public static string jiemi(string PlainStr, string key) { int num = 1; checked { if (Strings.Len(PlainStr) % 2 == 0) { string text = Strings.StrReverse(Strings.Left(PlainStr, (int)Math.Round((double)Strings.Len(PlainStr) / 2.0))); string text2 = Strings.StrReverse(Strings.Right(PlainStr, (int)Math.Round((double)Strings.Len(PlainStr) / 2.0))); PlainStr = text + text2; } int num2 = Strings.Len(PlainStr); string text5=""; for (int i = 1; i <= num2; i++) { string text3 = Strings.Mid(PlainStr, i, 1); string text4 = Strings.Mid(key, num, 1); if ((Strings.Asc(text3) ^ Strings.Asc(text4)) < 32 | (Strings.Asc(text3) ^ Strings.Asc(text4)) > 126 | Strings.Asc(text3) < 0 | Strings.Asc(text3) > 255) { text5 += text3; } else { text5 += Strings.Chr(Strings.Asc(text3) ^ Strings.Asc(text4)).ToString(); } if (num == Strings.Len(key)) { num = 0; } num++; } return text5; } }
PS:这两天发帖那哥们不见人了,莫非已经?…………
本文到此结束。
无节操吐槽:
1#
wefgod (求大牛指点) | 2013-04-26 15:47
@xsser 求感谢,哈
2#
啦绯哥 | 2013-04-26 16:55
推荐加精
3#
pangshenjie (whoami) | 2013-04-26 17:04
其实几行代码就搞定了。直接调用原版的zjdx.dll 的jiemi()函数机可以了。
using System.Collections.Generic; using System.ComponentModel; using System.Data; using zjdx; //要添加一下这个引用,在vs中吧zjdx.dll添加进去 using System.Linq; using System.Text; using Microsoft.VisualBasic; using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { zjdx.mmtp test=new zjdx.mmtp(); Console.WriteLine("----- Fuck Zf ----\n"); string inpt = Console.ReadLine(); string outprint = test.jiemi(inpt, "Encrypt01"); //Encrypt01是那个解密的向量Key Console.WriteLine(outprint); } } }
其实用c#写核心也超不过5行就ok了,不过还是赞一个撸主。。。
4#
wefgod (求大牛指点) | 2013-04-26 17:19
@pangshenjie 那个dll里面的密码,和你这个程序里面的不一样啊。还是要懂去找才可以,就怕他的每个dll不一样。不过好像之前那个帖子把解密的贴出来好像就是你啊。莫非其它dll里面的key也都是一样的吗?
5#
wefgod (求大牛指点) | 2013-04-26 17:23
@pangshenjie 其实引用dll吗确实很好。但是有的东西自己找找可能还是相对比较好点,看过详细的方法比较好理解。另外,using Microsoft.VisualBasic; 在调用那个zjdx.dll的时候还是要添加这个引用吗? 而且我手上的dll,Runtime: .NET 1.1 。在4.0还不知道可以调用吗,我这是VS2008
6#
冷冷的夜 (从前有个人,他不喜欢我;后来,他死了) | 2013-04-26 17:29
@wefgod 不用调用dll,直接把dll方法copy就好了,以前写过个,不知道丢那去了
7#
老树 | 2013-04-26 20:30
534539198 求交流
8#
wefgod (求大牛指点) | 2013-04-26 20:43
@冷冷的夜 我文章上面就是那么说的。不过最好简单修改几个地方。
9#
wefgod (求大牛指点) | 2013-04-26 20:45
@老树 王老师,我木有挂科……
10#
pangshenjie (whoami) | 2013-04-26 21:04
@wefgod 正方所有的key都是通用的,其实这种情况一般能搞到数据库直接下载bin目录下的相关dll 就可以,下载回来还是要分析一下看看具体是怎么算的,我说直接引用dll 某些情况下可能比较省事~不过思路差不多,直接copy出来也可以,如果算法设计dll其他地方的一些方法的话直接引用就方便了
11#
pangshenjie (whoami) | 2013-04-26 21:06
@wefgod 引用的时候要在工程中添加一下,我用4.0的可以成功,vs2010
12#感谢(1)
Lmy (话说名字太长容易被人关注) | 2013-04-26 21:20
@wefgod @pangshenjie Python3的飞过
def squarer(value, key): if len(value) % 2 == 0: p = int(round(len(value)) / 2.0) value = reversed(value[-p:]) + reversed(value[:p]) k = 0 result = '' for v in value: if ord(v) ^ ord(key[k]) < 32 | ord(v) ^ ord(key[k]) > 126 | ord(v) < 0 | ord(v) > 255: result += v else: result += chr(ord(v) ^ ord(key[k])) k = 0 if k == len(key) else k + 1 return result if __name__ == '__main__': print(squarer('Z%+6*2l~q2.', 'Acxylf365jw'))
13#
wefgod (求大牛指点) | 2013-04-26 21:26
@pangshenjie 4.0可以成功啊,不过为了缩减程序的体积,其实比较好还是自己把那部分弄出来。调用dll肯定要在工程里面添加引用的,这个自不必说。印象中好像闪电大牛倒是有写过一个工具,集成了这些所有相关的解密
14#
廷廷 (想法最重要) | 2013-04-27 06:27
@wefgod 用来解密正方数据库?不懂啊
15#
wefgod (求大牛指点) | 2013-04-27 08:28
@廷廷 正方的数据库连接是加密的,在web.config
16#
wefgod (求大牛指点) | 2013-04-27 08:28
@Lmy 感谢了一下。
留言评论(旧系统):