Android数据库加密与破解(Xposed hook SQLCipher 密码)

什么是SQLCipher

SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的读写效率、资源消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如Android、iOS)。Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作,具体就不详细说明了。

然而,Android平台自带的SQLite有一个致命的缺陷:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。如果是普通的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的应用就会面临严重的= 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被用作数据库的密码。
这将创建一个加密的数据库,如下所示:
Android数据库加密与破解(Xposed hook SQLCipher 密码)
使用此信息,可以编写一个简单的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

此时命令窗口会将密码显示出来
Android数据库加密与破解(Xposed hook SQLCipher 密码)

在Windows下解密

首先要将软件的DB文件从Data用户数据文件夹拷贝到电脑中

下载windows sqlcipher

下载地址:
解密时要用与加密时相同的版本
https://github.com/sqlcipher/sqlcipher/releases

用CMD 打开到BIN文件夹

Android数据库加密与破解(Xposed hook SQLCipher 密码)

执行命令

创建加密数据库

$ 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

https://blog.csdn.net/jiyafeng/article/details/89634681

https://blog.csdn.net/qq_36699930/article/details/100744874

版权声明:玥玥 发表于 2021-05-24 9:10:11。
转载请注明:Android数据库加密与破解(Xposed hook SQLCipher 密码) | 女黑客导航