书接上回,我写了正射影像拼接和AI实例分割系统,但缺少数据集。
公司有人已经使用 D疆智图 做了面积测量的标注,我希望这个数据能够直接导出到我的系统。但据说这软件不支持导出。
于是我装了破解版实际测试,发现确实导不出呢
那怎么办呢?
从它的文件下手,直接自己提取出来。
确定数据库位置
简单通过在 Everything 中搜索软件名称,找到了数据存储在 C:\Users\FFeng\Documents\DJX\DXTX\default
这里为每个项目保存了一个文件夹。
通过手动标注一个多边形然后保存发现,多边形并不保存在对应文件夹中,而是应该在目录中的 mission.db 文件中。
这种文件不容置疑,是 Sqlite 数据库文件,但打不开,加密了。
以下操作全部都是聪明的 AI 所为
初步逆向
通过静态分析,发现了 SQLCipher确定了它的加密规格如下:
AES-256-CBC + PBKDF2-HMAC-SHA1
page_size = 1024
HMAC 关闭
至于密钥嘛,似乎是动态生成的,在负责加密的DLL中有使用 GetHardwareKey 和 SerialNumber 。
WebSocket 连接尝试
尝试连接后端的 19870 端口,能够正常连接并升级 Websocket。
发
null→ 收到 128 字节 base64 → 96 字节 AES-GCM 加密响应发
{}/[]/ JSON 命令 → server 立刻断开连接
猜测是有加密层,不可行。
Frida hook
通过运行时往软件上加钩子,试图这样获取到密钥。
此处费了很大的力气,内部生成Key很复杂。
但最终分析过后,hook OpenSSL 的 PKCS5_PBKDF2_HMAC_SHA1,拿到 Key : 7nbzvVEqDJIMGnSC@!UkS 注:后续测试发现虚拟机上也是这个Key,不清楚是不是固定的。
这大概是根据机器动态生成的 Key,不是通用的。
解密数据库
拿到 Key 了,但是在 Python 中使用 SQLCipher 无论如何也解不开。
灵机一动,直接调了原程序的 sqlite3.dll ,成功执行SQL语句读取到了数据。
我想要的面积测量标注就明文躺在 mapping_info.area_2d_measure_list
逆向小结
导出数据分两步:
动态 Hook 原程序,获得 Key。
加载
sqlite3.dll,执行SQL语句。
需要注意的是,对于其他一台机器,需要事先确定已经安装了 D疆智图 ,需要 Hook 它。
写自动导出程序
做这种事情的程序当然是 C++ 啦,但是不想用 C++,那就GO啦。
获取 Key,我采用的方法是,启动 D疆智图,然后注入一个线程加载我的一个DLL(C写的)。
DLL内部通过共享内存与我的程序通信。
DLL给 PKCS5_PBKDF2_HMAC_SHA1 开头加了断点,能将传入的参数读出来。
完事后 DLL 连同D疆智图进程一起杀掉,然后我的程序去调 sqlite3.dll 解密数据库读取信息···















