Android数据库加密与破解(Xposed hook SQLCipher 密码)
Posted 666小奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android数据库加密与破解(Xposed hook SQLCipher 密码)相关的知识,希望对你有一定的参考价值。
Xposed hook SQLCipher 密码
什么是SQLCipher
SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的读写效率、资源消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如android、ios)。Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作,具体就不详细说明了。
然而,Android平台自带的SQLite有一个致命的缺陷:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。如果是普通的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的应用就会面临严重的安全漏洞隐患。
目前最好且唯一的方案就是SqlCipher对sqlite3整体加密,微信也用的它。开源,且支持很多平台。
HOOK加密的原理
介绍
具有安全意识的开发人员经常使用SQLCipher来加密存储在设备文件系统中的内容。 SQLCipher是SQLite的稍微扩展的版本,它允许透明地使用256位AES加密,因此开发人员不必处理加密内部和其他抽象。
SQLCipher接受输入到PBKDF2算法中的密码,以得出加密密钥,该密钥最终用于加密数据库。如果开发人员由于对用户体验的负面影响而不想提示用户输入密码短语,则可以使用一种算法来导出密码
原理
例如,假设静态密钥为“ password1”,则以下是对openOrCreateDatabase API的有效使用:
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, “password1”, null);
创建一个简单的应用程序“ MyEncryptedApp”以生成特定于设备的密码后,我们可以使用以下代码创建一个加密的数据库:
String id = new DeviceIdentity(this).generateDeviceIdentifier();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, id, null);
database.execSQL(“create table t1(a, b)”);
database.execSQL(“insert into t1(a, b) values(?, ?)”, new Object[]{“one for the money”,“two for the show”});
即设备ID被用作数据库的密码。
这将创建一个加密的数据库,如下所示:
使用此信息,可以编写一个简单的CydiaSubstrate应用程序来挂接JVM中的方法,然后调用指向原始方法的指针,以允许执行继续。
为了实现这一点,我们可以使用MS.hookClassLoadmethod,它将等待我们要挂接的类加载以获得对它的引用。 在这种情况下,openOrCreateDatabase方法位于net.sqlcipher.database.SQLiteDatabase类中,因此我们将其用作MS.hookClassLoad的参数,以指示这是我们关注的类
static void hookCryptoKey() {
MS.hookClassLoad(“net.sqlcipher.database.SQLiteDatabase”,
new MS.ClassLoadHook() {
public voidclassLoaded(Class<?> arg0) {
Log.d(“MDSecHook”, “##### Class Loadedn”);
加载回调后,我们随后通过MS.MethodHook实例代理实现,该实例允许我们用自己的代码替换方法的实现:
new MS.MethodHook() {
public Object invoked(Object arg0, Object… args)
throws Throwable { Log.d(“MDSecHook”, “##### Error: “ + Thread.currentThread().getStackTrace());
Log.d(“MDSecHook”, “###### Method hooked, stealing key: “ + args[1]);
return old.invoke(arg0, args);
}
}, old);
CydiaSubstrate并不总是在所有设备上都可以工作,并且总体上似乎不如Xposed框架那样维护,该框架可以实现大致相同的目标。将测试设备从Lollipop降级到Jelly Bean并安装了MDSec Cydia调整后,即使MDSec提供的测试应用程序运行正常,他仍然无法获取要在日志缓冲区中打印的密钥。是什么赋予了?
事实证明,自MDSec创建它们的调整以来,SQLCipher库已进行了一些更改,并且现在有“ openOrCreateDatabase”方法的新的重载变体,这是MDSec尝试挂钩的(您可以在此处看到当前方法)。根据所测试的应用程序使用SQLCipher API的方式,您可能会看到记录在日志中的密钥。
开始使用
下载安装模块
1.下载这个APK,并进行安装,然后激活
GitHub: MyEncryptedApptest
2.之后将设备连接到电脑,打开USB调试,确任电脑端ADB可以连接到要调试的设备
运行ADB命令
adb logcat SqlCipherHook:D *:S
启动待解密的APP
此时命令窗口会将密码显示出来
在Windows下解密
首先要将软件的DB文件从Data用户数据文件夹拷贝到电脑中
下载windows sqlcipher
下载地址:
解密时要用与加密时相同的版本
https://github.com/sqlcipher/sqlcipher/releases
用CMD 打开到BIN文件夹
执行命令
创建加密数据库
$ sqlcipher encrypted.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> PRAGMA key = 'thisiskey';
sqlite> create table encrypted (id integer, name text);
sqlite> .schema
CREATE TABLE encrypted (id integer, name text);
sqlite> .q
打开加密数据库
$ sqlcipher encrypted.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> PRAGMA key = 'thisiskey';
sqlite> .schema
CREATE TABLE encrypted (id integer, name text);
修改数据库密码
sqlite> PRAGMA rekey = 'newkey';
加密已有的数据库
$ sqlcipher banklist.sqlite3
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'thisiskey';
sqlite> SELECT sqlcipher_export('encrypted');
sqlite> DETACH DATABASE encrypted;
解密数据库(生成无密码的数据库: plaintext.db)
$ sqlcipher-shell32 encrypted.db
sqlite> PRAGMA key = 'thisiskey';
sqlite> ATTACH DATABASE 'plaintext.db' AS plaintext KEY '';
sqlite> SELECT sqlcipher_export('plaintext');
sqlite> DETACH DATABASE plaintext;
查看与修改
使用 Navicat 软件可以直接打开没有加密的DB文件
引用来源
https://www.mdsec.co.uk/2014/02/hooking-sqlcipher-crypto-keys-with-cydiasubstrate/
http://blog.thecobraden.com/2015/05/hooking-sqlcipher-with-xposed.html
以上是关于Android数据库加密与破解(Xposed hook SQLCipher 密码)的主要内容,如果未能解决你的问题,请参考以下文章