Firda框架在进行Hook脚本编写时,存在固定的规范, 函数主体需要被包含在Java.perform方法之中 ,参数是一个匿名函数,在匿名函数内编写具体的Hook代码。Hook静态方法和实例方法时,不需要花费精力处理修饰符,也不需要区分静态方法和实例方法,一律使用Java.use进行Hook。只有在主动调用时,才需要区分静态方法和实例方法。
接下来,以第1章中安装的Android测试应用为例进行Hook讲解。使用jadx反编译工具对APK进行反编译可以查看到具体源代码,这里对Money类里的静态方法setFlag和非静态方法getInfo进行Hook,Android应用中的代码如下:
首先来Hook其中的静态方法setFlag,因为静态方法setFlag属于Money类,因此需要 使用Java.use先定位到类,定位类使用类所属的package.类名的方式,之后可以通过implementation方法直接覆写静态方法 setFlag。当Android应用在执行静态方法setFlag时,调用执行的将会是这里覆写的代码。静态方法setFlag包含一个字符串参数,在这里覆写的函数的签名中要添加一个参数, Hook代码中的参数是不需要指定类型的,只要求数量上能够对应 。原静态方法setFlag是没有返回值的,但覆写的方法是可以添加返回值的,这里直接使用this.setFlag调用原方法进行返回。
接着Hook应用中的非静态方法getInfo,这与刚才的静态方法setFlag的Hook方法类似,直接使用this.getInfo作为原方法的返回值,在中间进行console打印,输出返回值。
具体Hook代码如下所示:
在注入上述代码时,可以不手动启动Android应用,而是选择让Frida框架主动启动Android应用,这样可以在Android应用加载之初就将代码注入,否则应用已经加载完毕,Hook代码就不会起作用了。
下边介绍几个常用的Frida框架命令行参数。
·-U:连接USB设备。
·-F:附加最前面的应用。
·-f:主动启动进程。
·-l:加载script脚本文件。
·-o:输出日志。
·-no-pause:启动主线程运行应用。
根据上述命令行参数,可以构建出通过Frida框架启动Andorid应用的命令:
运行上述命令后,即可看到Frida框架主动启动了USB连接的手机中的应用com.xiaojianbang.app,并且加载了刚刚编写的JavaScript脚本,在命令行中打印输出了静态方法setFlag的参数和非静态方法getInfo的返回值。
想要修改方法的参数和返回值也较为容易,如修改setFlag的参数,只需要将上边的JavaScript脚本稍作修改,在最后调用原方法返回的过程中,自定义一个字符串作为参数传入:
再次运行脚本,就可以发现Money类中的setFlag参数已经发生了改变。