debug_wechat_send5.js 1.77 KB
/**
 * Frida debug script v5 — get proper Java stack trace
 * Usage: frida -U -p PID -l debug_wechat_send5.js
 */

function log(tag, msg) {
    console.log("[" + tag + "] " + msg);
}

function printJavaStack(tag) {
    try {
        var Thread = Java.use("java.lang.Thread");
        var stack = Thread.currentThread().getStackTrace();
        var lines = [];
        for (var i = 0; i < stack.length; i++) {
            lines.push("  at " + stack[i].toString());
        }
        console.log("[" + tag + " STACK]\n" + lines.join("\n") + "\n[END STACK]");
    } catch (e) {
        console.log("[" + tag + " STACK] failed: " + e + "\n[END STACK]");
    }
}

Java.perform(function () {
    log("MAIN", "Installing WCDB insert hook with proper stack trace...");

    try {
        var SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase");

        SQLiteDatabase.insert.overload('java.lang.String', 'java.lang.String', 'android.content.ContentValues').implementation = function(table, nullCol, values) {
            if (table && table.toLowerCase().indexOf("message") !== -1) {
                var isSend = values ? values.getAsInteger("isSend") : null;
                var talker = values ? values.getAsString("talker") : null;
                var content = values ? values.getAsString("content") : null;
                log("INSERT", "table=" + table + " isSend=" + isSend + " talker=" + talker + " content=" + (content ? content.substring(0, 40) : "null"));
                if (isSend && isSend == 1) {
                    printJavaStack("INSERT_SEND");
                }
            }
            return this.insert(table, nullCol, values);
        };

        log("MAIN", "Hook installed. Send a message manually.");
    } catch (e) {
        log("MAIN", "Hook failed: " + e);
    }
});