本文章基于 Android 微信 8.0.3
データベースファイルの検索#
まず、uin
を検索します。これは/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml
ファイルにあります:
WeChat のチャットデータベースの名前は EnMicroMsg.db で、data/data/com.tencent.mm/MicroMsg/
ディレクトリの特定のフォルダにあります。ファイル名はmd5_32_low(imel + uin)
です:
WeChat のデータベースのパスワードは IMEI 番号と WeChat の uin を連結し、md5 で暗号化して 32 桁の小文字にし、最初の 7 桁をパスワードとして使用します。
注意:パスワードが正しくない場合、特定の状況では、WeChat が IMEI 番号を取得できない場合、固定値 1234567890ABCDEF がデフォルトで使用されます。
最初は、さまざまな SQLCipher ビューアを使用して Mac プラットフォームで開くことができませんでした。アルゴリズムが変更されたと思いましたが、分析してみると間違っていませんでした。Windows プラットフォームの SQLCipher.exe を使用すると開くことができました。
分析プロセス#
WeChat は wcdb というデータベースを使用しており、WCDB ドキュメントの Android 接続を通じて、データベースを開く方法を知ることができます:
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(
"path/to/database", // DBのパス
passphrase.getBytes(), // WCDBのパスワードはbyte[]型です
cipher, // 上記で作成した暗号化記述子
null, // CursorFactory
null // DatabaseErrorHandler
// SQLiteDatabaseHookのパラメータは、cipherでパラメータを指定することで同じ目的を達成できます
);
jadx を使用して分析すると、openOrCreateDatabase
には多くのオーバーロードメソッドが存在し、すべて内部でSQLiteDatabase.openDatabase
メソッドを使用しています。
Frida を使用してこの関数をフックし、呼び出しスタックを追跡してパスワードの生成ルールを見つけます。
呼び出しスタック#
呼び出しスタックを上に追跡し、パスワード生成の場所を見つけます。
com.tencent.mm.storagebase.a.b:
this.key = C7959g.getMessageDigest((C8811q.m22244dJ(true) + j).getBytes()).substring(0, 7);
this.kiF = C67989f.m106126E(str, this.key, z);
getMessageDigest メソッドをフックして取得すると:
パラメータ: 1234567890ABCDEF-156*****65 (1234567890ABCDEF + uin)ここでの j は uin であり、異議はありません。続いて C8811q.m22244dJ (true) を分析します。
戻り値:552**********************ac9fbb6
public static String m22244dJ(boolean z) {
AppMethodBeat.m18334i(155720);
String str = gXe.get();
if (!Util.isNullOrNil(str)) {
AppMethodBeat.m18335o(155720);
return str;
} else if (z) {
AppMethodBeat.m18335o(155720);
return "1234567890ABCDEF";
} else {
AppMethodBeat.m18335o(155720);
return "";
}
}
gXe はデバイス情報を取得するクラスであり、分析が複雑になるため、ここで終わりにします。
関連ファイル: https://pan.baidu.com/s/1WIZ_wdAFn_9tMZNxzC5i5Q 抽出コード:xpnk
参考資料#
1、记一次安卓微信数据库电脑端打开查看的问题
2、Android 逆向分析实例 (三)- 解密微信 EnMicroMsg.db 数据库