方法重载是一个类的多态性的表现,重载方法在一个类中方法名字相同,而参数不同,返回值也可以不同。由此可以确定,重载方法的独特性在于其独一无二的参数类型列表,因此在Hook时也需要额外注意其参数类型列表。
在测试应用的Utils类中存在重载方法getCalc,它拥有三个不同的重载,源代码如下所示:
这三个方法的名字是一样的,在Android应用的onCreate方法中存在调用。 因为重载方法存在不同的参数签名,要对重载方法进行Hook需要分为两步,通常借助Frida框架的提示进行代码编写。第一步,先对重载方法的不同参数签名视而不见,直接进行重载方法的覆写,并加载Hook脚本。 编写的代码如下:
可以发现,脚本的覆写方法里没有添加任何参数,当Frida框架加载了上述脚本代码之后,会有报错提示,这正是第一步要达到的目的, 让Frida框架告诉开发者重载方法的参数应该怎么编写。 命令行中的报错代码如下:
可以清晰地看到,Frida框架提示开发者从三个不同参数签名的重载方法中进行选择,而且指明使用overload方法。这三个overload中存在不同的参数签名,分别对应Android应用源代码中的三个重载方法。
第二步,借助刚才的报错提示,编写正确的Hook代码, 这里使用Frida框架提示的overload方法覆写拥有两个int参数的重载方法:
Hook重载方法和Hook一般方法是大相径庭的,开发者不需要死记硬背,在需要使用的时候,回忆上述两步走的方案即可。
掌握了两步走的方案之后,如果想要Hook getCalc全部的重载方法,代码的编写只是一种重复性的体力工作。具体Hook代码如下所示: