/* * 策略1: hook 系统 libsqlite3 的 sqlite3_key (可能不被调用) * 策略2: 在 WeChat 主二进制里搜索 sqlite3_key 的函数签名并 hook * 策略3: hook CCCryptorCreate (CommonCrypto AES 初始化) */ // 策略1: 系统 libsqlite3 var lib_sqlite3 = Process.findModuleByName('libsqlite3.dylib'); if (lib_sqlite3) { ['sqlite3_key', 'sqlite3_key_v2', 'sqlite3_rekey', 'sqlite3_rekey_v2'].forEach(function(fn) { var sym = lib_sqlite3.findExportByName(fn); if (sym) { Interceptor.attach(sym, { onEnter: function(args) { var n = fn === 'sqlite3_key' ? args[2].toInt32() : args[3].toInt32(); var p = fn === 'sqlite3_key' ? args[1] : args[2]; if (n > 0 && n <= 256) { var hex = Array.from(new Uint8Array(p.readByteArray(n))) .map(b => ('0'+b.toString(16)).slice(-2)).join(''); send({type:'system_sqlite3_key', func:fn, len:n, hex:hex}); } } }); send({type:'hooked_system', func:fn, addr:sym.toString()}); } }); } // 策略3: hook CommonCrypto CCCryptorCreate - 捕获 AES-256 key 设置 // 这能捕获 WeChat 的 AES 密钥初始化,包括 SQLCipher 的数据库加密 key var cc = Process.findModuleByName('libSystem.B.dylib'); var cc_create = null; if (cc) { // CCCryptorCreate(op, alg, options, key, keyLength, iv, cryptorRef) cc_create = cc.findExportByName('CCCryptorCreate'); } if (!cc_create) { // Try directly cc_create = Module.findExportByName(null, 'CCCryptorCreate'); } if (cc_create) { Interceptor.attach(cc_create, { onEnter: function(args) { try { var op = args[0].toInt32(); // 0=encrypt, 1=decrypt var alg = args[1].toInt32(); // 0=AES, 1=DES, etc. var keyLen = args[4].toInt32(); // AES-256 key = 32 bytes if (alg === 0 && keyLen === 32) { var key = args[3].readByteArray(32); var hex = Array.from(new Uint8Array(key)) .map(b => ('0'+b.toString(16)).slice(-2)).join(''); send({type:'aes_key', op:op, len:keyLen, hex:hex}); } } catch(e) {} } }); send({type:'hooked', func:'CCCryptorCreate', addr:cc_create.toString()}); } // 策略4: 在 WeChat 主二进制中搜索 sqlite3_key 函数 // ARM64/x86_64 下 sqlite3_key 的典型开头字节 var wechat = Process.findModuleByName('WeChat'); if (wechat) { send({type:'info', msg:'WeChat module base: ' + wechat.base.toString() + ' size: ' + wechat.size.toString()}); } send({type:'ready'});