Frida Hook String构造函数

前言

在实际Android应用开发中,无论是使用多么复杂的算法对字符串进行加密,然而开发者常常会构造出字符串的实例。因此,我们可以通过使用Frida hook String类的构造函数来追踪这些实例的构造位置,然后可以通过构造实例的地方栈回溯出关键位置。

Hook String类的构造函数

首先,我们使用Frida hook String类的构造函数,代码如下:

function hook_string_init() {
    Java.perform(function () {
        var StringClass = Java.use("java.lang.String");
        StringClass.$init.overload('[B').implementation = function (arg) {
            console.log("String  StringClass.$init.overload('[B')");
            return this.$init(arg);
        }
        StringClass.$init.overload('[C').implementation = function (arg) {
            console.log("StringClass.$init.overload('[C')");
            return this.$init(arg);
        }
    });
}
function main () {
    hook_string_init();
}
setImmediate(main);

接下来,将我们的代码进行注入,执行Frida命令:

frida -UF -l .\demo.js

然而在我们进行输入账号和密码的时候,某嘟牛的应用会崩溃,如下所示:
在这里插入图片描述
这里报错的原因是因为String类的构造是通过StringFactory进行的,下面可以通过追踪一下Android源码,如下所示:

 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
	 public String(char value[]) {
  // Android-changed: Constructor unsupported as all calls are intercepted by the runtime.
  throw new UnsupportedOperationException("Use StringFactory instead.");
  }
}

源码中明确指出String类的构造被拦截,并抛出了UnsupportedOperationException异常,提示使用StringFactory类。因此,直接Hook String构造函数会导致报错。

Android源码处理字符串构造函数

通常查看app的smali指令,可以得知在进行构造函数调用的时候,会使用invoke指令。此时我们的虚拟机设置在解释模式下执行,继续查看源码中是如何进行处理:
在这里插入图片描述
在Execute()函数会执行ExecuteSwitchImpl解释器函数,最后系统会调用ExecuteSwitchImplCpp()函数,这个函数中会处理每一条smali指令,通过追踪最后DoCall()会处理构造函数的替换:
在这里插入图片描述
我们已经知道原理,Hook代码就简单了,代码如下:

function hook_string_init() {
    Java.perform(function () {
        var StringFactory = Java.use("java.lang.StringFactory");
        StringFactory.newStringFromString.implementation = function (arg) {
            var retval = this.newStringFromString(arg);
            console.log("StringFactory.newStringFromString: ", retval);
            return retval;
        }
        StringFactory.newStringFromChars.overload('[C').implementation = function (arg) {
            var retval = this.newStringFromChars(arg);
            console.log("StringFactory.newStringFromChars: ", retval);
            return retval;
        }
    });
}
function main () {
    hook_string_init();
}
setImmediate(main);

执行结果如下:
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值