admin管理员组

文章数量:1575522

Xposed hook SQLCipher 密码

  • 什么是SQLCipher
  • HOOK加密的原理
    • 介绍
    • 原理
  • 开始使用
    • 下载安装模块
    • 运行ADB命令
    • 启动待解密的APP
  • 在Windows下解密
    • 下载windows sqlcipher
    • 用CMD 打开到BIN文件夹
    • 执行命令
      • 创建加密数据库
      • 打开加密数据库
      • 修改数据库密码
      • 加密已有的数据库
      • 解密数据库(生成无密码的数据库: plaintext.db)
  • 查看与修改
  • 引用来源

什么是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/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/2015/05/hooking-sqlcipher-with-xposed.html

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

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

本文标签: 密码数据库androidXPosedSQLCipher