debug_wechat_send6.js 3.62 KB
/**
 * Frida debug script v6 — inspect u01.f2 and related classes
 * Hooks u01.f2 constructor + run, u01.r1, messenger.foundation.a2
 */

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

function inspectObject(obj, tag) {
    if (!obj) {
        log(tag, "object is null");
        return;
    }
    var cls = obj.getClass();
    log(tag, "class=" + cls.getName());

    var fields = cls.getDeclaredFields();
    for (var i = 0; i < fields.length; i++) {
        var f = fields[i];
        f.setAccessible(true);
        try {
            var val = f.get(obj);
            var valStr = val ? val.toString() : "null";
            if (valStr.length > 100) valStr = valStr.substring(0, 100) + "...";
            log(tag, "  field: " + f.getName() + " = " + valStr);
        } catch (e) {
            log(tag, "  field: " + f.getName() + " [error: " + e + "]");
        }
    }
}

Java.perform(function () {
    log("MAIN", "Hooking u01.f2 and related classes...");

    // Hook u01.f2.run
    try {
        var f2 = Java.use("u01.f2");
        f2.run.implementation = function() {
            log("F2", "===== u01.f2.run() called =====");
            inspectObject(this, "F2");
            log("F2", "===== running original =====");
            this.run();
            log("F2", "===== u01.f2.run() done =====");
        };
        log("MAIN", "u01.f2.run hooked");
    } catch (e) {
        log("MAIN", "u01.f2 hook failed: " + e);
    }

    // Hook u01.f2 constructor (if any)
    try {
        var f2cls = Java.use("u01.f2");
        var constructors = f2cls.class.getDeclaredConstructors();
        for (var i = 0; i < constructors.length; i++) {
            var ctor = constructors[i];
            var params = ctor.getParameterTypes();
            var sig = "";
            for (var j = 0; j < params.length; j++) {
                sig += params[j].getName() + ",";
            }
            log("MAIN", "u01.f2 constructor: (" + sig + ")");
        }
    } catch (e) {
        log("MAIN", "u01.f2 constructor inspect failed: " + e);
    }

    // Hook messenger.foundation.a2.a() to see args
    try {
        var a2 = Java.use("com.tencent.mm.plugin.messenger.foundation.a2");
        var methods = a2.class.getDeclaredMethods();
        for (var i = 0; i < methods.length; i++) {
            var m = methods[i];
            if (m.getModifiers() & 0x0001) { // public
                var params = m.getParameterTypes();
                var sig = m.getName() + "(";
                for (var j = 0; j < params.length; j++) sig += params[j].getName() + ",";
                sig += ") -> " + m.getReturnType().getName();
                log("MAIN", "a2 method: " + sig);
            }
        }
    } catch (e) {
        log("MAIN", "a2 inspect failed: " + e);
    }

    // Also hook WCDB insert to confirm
    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;
                if (isSend && isSend == 1) {
                    log("WCDB", "INSERT SEND talker=" + talker);
                }
            }
            return this.insert(table, nullCol, values);
        };
        log("MAIN", "WCDB hook installed");
    } catch (e) {
        log("MAIN", "WCDB hook failed: " + e);
    }

    log("MAIN", "All hooks installed. Send a message manually.");
});