此文也就是给木有太多.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:这两天发帖那哥们不见人了,莫非已经?…………

本文到此结束。

source

无节操吐槽:

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 感谢了一下。

留言评论(旧系统):

佚名 @ 2013-04-27 22:27:42

谢谢核总

本站回复:

you are welcome.

佚名 @ 2013-04-28 16:53:14

其实我一直挺好奇的……核总会享受生活,技术又研究的深,到底怎么做到的?时间安排得那么好

本站回复:

每天花巨量时间用在计算机上,现在想想确实挺浪费的,生活多姿多彩,应该多花点时间用于其他事情……

剑走偏锋 @ 2013-05-17 10:34:12

- -

本站回复:

- -

pi @ 2013-07-30 15:54:14

其实正方有个上传漏洞的 但是看了下网上貌似没有说 可能大家都对着玩意儿失去兴趣了吧╮( ̄▽ ̄")╭

本站回复:

好吧……

佚名 @ 2013-12-06 05:19:35

大侠 我现在的是要链接数据库才能取到 zfkey能否逆向?

本站回复:

对这个程序不太了解……