记一次解密刷题程序数据库

发布于 / Python / Comments Off on 记一次解密刷题程序数据库

得到了一个PC端刷题的程序

image.png

有大量的题库,点进去可以刷题

image.png

可以说是考证党的神器了。

但是看了一下,这个程序只能在Windows下运行,题目不能导出。遂想到,能不能通过一些手段,将全部题目导出呢?

翻了一下目录,没有db文件

image.png

但是看到这里的CL.EXL.dll文件特别大

image.png

用16进制查看器010Editor查看一下

image.png

Standard Jet DB。应该是Access数据库没跑了,只不过改了个后缀,mdb改成了dll。改回mdb,用Access打开,一个个表分析,找到了一个数据量最大的表,应该是存放题库数据的

image.png

然而题目选项和答案居然是 加密的!!!??。。。

这些加密数据看上去应该是Base64编码过的,用Base64解码,发现是乱码。用其他多种加密算法测试,均无法成功解密。

继续分析余下的dll

发现一个ICSharpCode.SharpZipLib.dll,百度一下这个库,发现是一个压缩库,其中一个功能就是将字符串压缩成Base64,也可以将Base64解压成字符串。但是经过分析这个库,这个库能解压的Base64字符串,decode后的前4个字节必须是规定的4个字节,随意找了数据库中几个Base64字符串,用Base64 decode后发现,他们的前4个字节并不一致,因此判断,源程序删掉了前4个字节,或者使用了二次加密。

继续分析其他的dll,由于判断程序是C#写的,将dll拖入Visual C#中,看看里面都有什么函数。

当分析到CL.Utility.dll这个动态链接库时,发现了几个可疑类

image.png

CL.Utility.DEncrypt.DEncrypt这个函数名有解密的意思,返回类型为string,参数为string,很有可能就是解密函数!

新建一个项目,引用这个dll文件,糊一段C#测试一下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CL.Utility.DEncrypt;

namespace TestDEncrypt
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                try
                {
                    Console.Write("输入待解密字符: ");
                    string s = Console.ReadLine();
                    string result = DEncrypt.Decrypt(s);
                    Console.WriteLine("解密结果:\n" + result);
                }
                catch (Exception)
                {
                    Console.WriteLine("ERROR!");
                }
            }
        }
    }
}

运行结果:

image.png

解密成功!

尝试用Python调用这个dll,实现解密:

#pip install pythonnet
import clr
import System
import sys
sys.path.append('PATH_TO_DLL')
clr.FindAssembly('CL.Utility.dll')
from CL.Utility.DEncrypt import *
DEncrypt.Decrypt("19Kt3KD6VNRBzUqsMf67+zip8Jkplu14p0pcnNS7bMtJLEyaMWMqxh/yGsaUqOq7")

image.png

成功实现解密。

接着只需让Python读取这个Access数据库,并将字符串依次解密,即可实现题库导出。

转载原创文章请注明,转载自: 斐斐のBlog » 记一次解密刷题程序数据库
评论已关闭