day08 8.4 Hook重载方法补充

发布时间 2023-07-16 15:27:06作者: Chimengmeng

【一】什么是重载

名字一样,但是参数不一样

【1】重载介绍

  • 在Java中,重载(Overloading)指的是在同一个类中可以定义多个方法(函数)具有相同的名称,但参数列表不同的情况。

  • 换句话说,重载允许在同一个类中使用相同的方法名执行不同的操作,提供了更多的灵活性。

【2】重载的规则如下:

  1. 方法名称必须相同。
  2. 参数列表必须不同,要么是参数的数量不同,要么是参数类型不同,或者两者都不同。
  3. 返回类型可以相同也可以不同,但不能仅仅基于返回类型来进行重载方法的区分。
  4. 重载的方法可以有不同的访问修饰符。
  5. 重载的方法可以抛出不同的异常。

【3】重载方法的执行

当程序调用一个被重载的方法时,编译器会根据传递的参数选择合适的方法执行。选择过程会按照以下规则进行:

  1. 如果能够精确匹配到参数数量和类型完全一致的方法,则选择该方法。
  2. 如果没有找到精确匹配的方法,编译器会自动进行类型转换来寻找最佳匹配的方法。类型转换的优先级为:小范围类型向大范围类型转换;自动装箱与拆箱;子类向父类类型转换。
  3. 如果有多个方法都可以匹配到,但没有一个方法是明显地更具体的,编译器将会报错。

重载的好处在于可以根据方法功能的不同来使用相同的方法名,提高代码可读性和灵活性。但过度使用重载可能会导致代码难以理解和维护,因此需要合理使用。

【二】Hook重载的方法

【1】手机端启动server服务

  • 进入shell命令窗口
adb shell
  • 切换到管理员权限
su
  • 切换到 frida-server 文件位置
cd /data/local/tmp/
./frida-server-16.0.19-android-arm64 
  • 端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

【2】Python Hook代码编写

import frida
import sys

# 连接手机设备
rdev = frida.get_remote_device()

session = rdev.attach("油联合伙人")
# hook的是update这个重载方法,不写overload,会有错误提示,告诉你有几个,你想hook那个,复制过去即可  
scr = """
Java.perform(function () {
    // 包.类
    var MessageDigest = Java.use("java.security.MessageDigest");
    MessageDigest.update.overload('byte').implementation = function(data){
        var res = this.update(data);
        return res;
    }
});
"""
script = session.create_script(scr)

def on_message(message, data):
    print(message, data)

script.on("message", on_message)
script.load()
sys.stdin.read()

【3】Python Hook代码改写

  • 构造方法可能有多个
  • hook构造方法
import frida
import sys

# 连接手机设备
rdev = frida.get_remote_device()

session = rdev.attach("油联合伙人")

scr = """
Java.perform(function () {
    // 包.类   项目中字符串拼接,都会用这个,hook它,很多地方会用到   StringBuilder sb =new StringBuilder()  触发构造方法,就好hook到
    var StringBuilder = Java.use("java.lang.StringBuilder");
    // hook构造方法,固定加入  .$init.overload('int')  
    StringBuilder.$init.overload('int').implementation = function(num){
        console.log(num);
        return res;
    }

});
"""

script = session.create_script(scr)

def on_message(message, data):
    print(message, data)

script.on("message", on_message)
script.load()
sys.stdin.read()