涉及具体软件的文章或工具出现很多年了,到处都是。公众号上也有很多,这里我们不讨论。 有用户问我:登录后才能解密,输入密码后才能备份出数据库,这些本来就是我自己可以查看的自己的记录,那么解密有什么作用呢?
对的,首先这样的操作是无害的。 解密以后就可以用程序自己分析、提取、整理数据 —— 这会带来实际的好处。菜刀有没有用?当然用来切菜也是极好的。 下面的代码使用 aardio 开发环境。 aardio 非常小只有几 MB,绿色软件不用安装,打开就可以用,下面的代码复制粘贴就可以运行,一键可以生成独立无依赖的 EXE 执行程序(生成的 EXE 体积也很小)。
在内存中搜索与查看数据库密钥:
import console.int;
//内存搜索扩展库 import process.util;
//打开目标软件进程,没运行返回 null var prcs = process.util('执行程序文件名.exe');
//搜索模块内存 var memory = prcs.searchModuleMemory('模块名称.dll','ID 写在这里',-2);
//获取密钥内存地址 var addr = memory.address - (prcs.isX64() ? 偏移量1 : 偏移量2 )
//读取字符串指针,再读取指针指向的字符串 var key = prcs.readStringPtr(addr,字符串长度);
//转换为 16 进制格式 var hexKey = string.hex(key,'')
//输出结果 console.log( hexKey )
以上代码兼容 64 位与 32 位目标程序,兼容 64 位与 32 位操作系统。
很多东西都是提供两个版本,64 位一个,32 位一个。aardio 的风格基本上是做到全兼容,而且这个也没有什么难度,64 位与 32 位本来就可以相互调用,也非常方便。
尽量简单一些,不求完美。
下面演示解密手机备份出来的,SQLCipher 加密的数据库。仅作概念演示,不涉及具体软件。 var dir = '这里指定备份文件目录'
import console.int; console.showLoading('正在获取账号配置');
//自动搜索要处理的文件 import fsys; var dbPath = fsys.searchFile('数据库文件名.db',dir,true); var xmlPath = fsys.searchFile('配置文件名.xml',dir,true); var javaObjectPath = fsys.searchFile('Java配置文件名.cfg',dir,true);
//解析 XML 配置文件 import string.xml; var xmlDoc = string.xml( string.load(xmlPath)) var ele = xmlDoc.queryEle( tagName='改为标记名',name='改为属性名'); var uid = ele.value;
//反序列化 Java 对象 var imei = '默认值'; if(#string.load(javaObjectPath)){ //很方便很小的嵌入 JAVA 虚拟机。 import java.jre.v6; var jvm = java();
imei = jvm.loadFileObject(javaObjectPath) .get( jvm.int(258)) }
//计算密钥 import crypt; var key = crypt.md5(imei++uid,false,改为密钥位数); console.showLoading('正在解密数据库,密钥:',key)
//打开数据库 import process.sqlCipher; var db = process.sqlCipher(dbPath);
//输入密钥 db.write('PRAGMA key = '',key,''; ') //写入 SQL 指令并关闭输入 db.writeClose(` PRAGMA cipher_compatibility = 3; PRAGMA cipher_use_hmac = OFF; PRAGMA cipher_page_size = 1024; PRAGMA kdf_iter = 4000;
ATTACH DATABASE 'Test.db' AS DeTest KEY ''; SELECT sqlcipher_export('DeTest'); DETACH DATABASE DeTest; `)
//回显输出 db.logResponse();
//在资源管理器打开解密数据库 process.exploreSelect('/DeTest.db')
下面再演示用 aardio 调用 Python 编程语言的版本,不涉及任何具体软件,所以项目路径是虚拟的概念名称:
import process.python; process.python.path = 'python.exe';
import process.python.pip process.python.pip.github('/用户名/项目名/blob/master/requirements.txt')
//这里指定用户 ID 就可以了 var python = process.python.github('/用户名/项目名/blob/master/获取密钥.py',{ '--id':'这里指定用户 ID 就可以了' })
//获取数据库密钥 var key = python.expect('数据库密钥:(\N+)');
如果有任何关于编程技术的问题可以留言,我尽量解答。但是请不要提及任何具体软件,谢谢!
|