得到了一个PC端刷题的程序
有大量的题库,点进去可以刷题
可以说是考证党的神器了。
但是看了一下,这个程序只能在Windows下运行,题目不能导出。遂想到,能不能通过一些手段,将全部题目导出呢?
翻了一下目录,没有db文件
但是看到这里的CL.EXL.dll文件特别大
用16进制查看器010Editor查看一下
Standard Jet DB。应该是Access数据库没跑了,只不过改了个后缀,mdb改成了dll。改回mdb,用Access打开,一个个表分析,找到了一个数据量最大的表,应该是存放题库数据的
然而题目选项和答案居然是 加密的!!!??。。。
这些加密数据看上去应该是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这个动态链接库时,发现了几个可疑类
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!");
}
}
}
}
}
运行结果:
解密成功!
尝试用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")
成功实现解密。
接着只需让Python读取这个Access数据库,并将字符串依次解密,即可实现题库导出。
朋友很秀啊,不过最近在网上看到了这个软件的破解版,是否可以尝试破解软件,输入任意激活码之类的。毕竟导出题库可视化效果不太好。