Frida Hook User类getTimeZone方法未生效触发Android应用空指针崩溃
Frida Hook getTimeZone方法崩溃问题原因及解决方案
问题原因
核心问题为两点:
- 返回值类型不匹配:原
com.myapp.models.User.getTimeZone()方法的返回类型为String,你编写的Hook逻辑返回了数字类型的12。Java是强类型语言,无法自动转换Frida传递的Number类型为预期的String类型,会触发类型转换异常,部分Android ROM的异常日志会将该类错误误显示为NullPointerException。 - 若你确认应用未Hook前运行正常,没有空指针报错,则日志中的空指针提示为类型转换异常的误报;如果未Hook前也有同类报错,则说明调用
getTimeZone的User实例本身为空,属于应用原有逻辑问题。
解决方案
1. 修正返回值类型
将Hook逻辑中的返回值改为字符串类型,匹配原方法的返回要求,示例如下:
Java.perform(function () { var User = Java.use("com.myapp.models.User"); User.getTimeZone.implementation = function() { console.log("timezone requested"); // 加引号将返回值转为字符串类型 return "GMT+8:00"; }; });
2. 增加原方法调用逻辑方便排查
如果需要保留原有逻辑或者排查原有返回值,可先调用原方法获取结果再修改返回值:
Java.perform(function () { var User = Java.use("com.myapp.models.User"); User.getTimeZone.implementation = function() { // 调用原方法获取原有返回值 var originalTimeZone = this.getTimeZone(); console.log("timezone requested, original value: " + originalTimeZone); // 返回自定义的字符串类型时区 return "Asia/Shanghai"; }; });
3. 实例为空的额外处理
如果确认是调用方的User实例为空导致的原生空指针,可Hook调用位置的方法排查空实例原因:
Java.perform(function () { var Presenter = Java.use("com.myapp.features.home.logs.Presenter"); Presenter.updateChart.implementation = function() { // 打印该类中持有的User实例,确认是否为空,mUser需替换为实际的User成员变量名 console.log("User instance in updateChart: " + this.mUser); // 调用原方法 return this.updateChart.apply(this, arguments); }; });
内容的提问来源于stack exchange,提问作者toothpick
相关产品推荐
相关产品推荐

