You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Frida注入脚本报错:无法设置undefined的implementation属性

解决Frida注入时TypeError: cannot set property 'implementation' of undefined错误

问题描述

尝试用Frida注入以下脚本Hook微信的com.tencent.mm.protocal.protobuf.fhs类的da方法:

function main() {
Java.perform(function () {
    let fhs = Java.use("com.tencent.mm.protocal.protobuf.fhs");
    fhs.da.implementation = function (bArr) {
        console.log('da is called' + ', ' + 'bArr: ' + bArr);
        let ret = this.da(bArr);
        console.log('da ret value is ' + ret);
        return ret;
    };
})}setImmediate(main)

执行命令:

frida -U com.tencent.mm -l ./Desktop/a.js --no-pause

抛出错误:

TypeError: cannot set property 'implementation' of undefined
at <anonymous> (/a.js:11)
at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:11)
at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:238)
at <anonymous> (frida/node_modules/frida-java-bridge/index.js:213)
at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:11)
at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:232)
at perform (frida/node_modules/frida-java-bridge/index.js:192)
at main (/a.js:12)
at apply (native)
at <anonymous> (frida/runtime/core.js:45)

目标APK反编译后的da方法代码:

public final fhs da(byte[] bArr) {
    AppMethodBeat.i(2376);
    net.a.a.a.a aVar = new net.a.a.a.a(bArr, unknownTagHandler);
    for (int nextFieldNumber = getNextFieldNumber(aVar); nextFieldNumber > 0; nextFieldNumber = getNextFieldNumber(aVar)) {
        if (!populateBuilderWithField(aVar, this, nextFieldNumber)) {
            aVar.kqf();
        }
    }
    fhs kuW = kuW();
    AppMethodBeat.o(2376);
    return kuW;
}

错误原因

  1. 方法类型混淆:反编译代码显示da是实例方法(非静态),原脚本直接通过类对象fhs.da去Hook是错误的——Frida中类对象的属性仅对应静态方法,实例方法需要通过prototype访问。
  2. 方法签名匹配问题:如果类存在同名重载方法,仅指定方法名可能无法匹配到目标方法,需要明确方法签名。

解决方案

方案1:修正实例方法的Hook方式

将脚本中fhs.da.implementation改为fhs.prototype.da.implementation,实例方法挂载在类的原型上:

function main() {
Java.perform(function () {
    let fhs = Java.use("com.tencent.mm.protocal.protobuf.fhs");
    // 修正:通过prototype访问实例方法
    fhs.prototype.da.implementation = function (bArr) {
        console.log('da is called' + ', ' + 'bArr length: ' + bArr.length); // 打印数组长度更直观
        let ret = this.da(bArr);
        console.log('da ret value: ' + ret);
        return ret;
    };
})}setImmediate(main)

方案2:明确指定方法签名(应对重载场景)

如果fhs类存在多个da重载方法,可通过overload指定参数类型精准匹配:

function main() {
Java.perform(function () {
    let fhs = Java.use("com.tencent.mm.protocal.protobuf.fhs");
    // 明确匹配参数为byte[]类型的重载方法
    fhs.prototype.da.overload("[B").implementation = function (bArr) {
        console.log('da is called' + ', ' + 'bArr length: ' + bArr.length);
        let ret = this.da(bArr);
        console.log('da ret value: ' + ret);
        return ret;
    };
})}setImmediate(main)

额外注意事项

  • 确保类名com.tencent.mm.protocal.protobuf.fhs完全正确,混淆后的类名可能存在大小写或拼写差异。
  • 如果目标方法名称动态变化,可通过方法特征(参数类型、返回值、内部逻辑)结合Java.enumerateLoadedClasses遍历定位。

内容的提问来源于stack exchange,提问作者alcule

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:15:45