本文只分享编程技术,不涉及具体软件。
涉及具体软件的文章或工具出现很多年了,到处都是。头条上也有很多,这里我们不讨论。
有用户问我:登录后才能解密,输入密码后才能备份出数据库,这些本来就是我自己可以查看的自己的记录,那么解密有什么作用呢?
对的,首先这样的操作是无害的。
解密以后就可以用程序自己分析、提取、整理数据 —— 这会带来实际的好处。菜刀有没有用?当然用来切菜也是极好的。
下面的代码使用 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+)");
原文地址:http://www.golangw.com/post/6390.html