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; }
错误原因
- 方法类型混淆:反编译代码显示
da是实例方法(非静态),原脚本直接通过类对象fhs.da去Hook是错误的——Frida中类对象的属性仅对应静态方法,实例方法需要通过prototype访问。 - 方法签名匹配问题:如果类存在同名重载方法,仅指定方法名可能无法匹配到目标方法,需要明确方法签名。
解决方案
方案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
相关产品推荐
相关产品推荐

