bigbigban21 发表于 2022-11-10 10:42

Frida hook 方法问题

本帖最后由 bigbigban21 于 2022-11-10 10:47 编辑

小白一枚,最近正在学习安卓逆向,由于前阵子旁观大佬用frida hook目标app的加解密流程后挖到许多高危,所以现在也在照猫画虎学用frida,在hook某方法时遇到问题
app的部分源代码如下:
public static String getAppVerifyValue(WWidgetData curWData, long timeStamp) {
    String md5 = getMD5Code(curWData.m_appId + ":" + curWData.m_appkey + ":" + timeStamp);
    String value = "md5=" + md5 + ";ts=" + timeStamp;
    return value;
}

public static String getMD5Code(String value) {
    if (value == null) {
      value = "";
    }
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.reset();
      md.update(value.getBytes());
      byte[] md5Bytes = md.digest();
      StringBuffer hexValue = new StringBuffer();
      for (byte b : md5Bytes) {
            int val = b & 255;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
      }
      return hexValue.toString();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
      return null;
    }
}
现在想要拿到每次计算得到的md5值,我目前的脚本如下:
Java.perform(function () {
    var CommClass = Java.use('xxx.xxx.xxx.xxx.xxx.xxx')
    CommClass.getAppVerifyValue.implementation = function(curWData, timeStamp){
      let md5 = getMD5Code(curWData.m_appId + ":" + curWData.m_appkey + ":" + timeStamp)
      console.log("md5=" + md5 + ";ts=" + timeStamp)
      return "md5=" + md5 + ";ts=" + timeStamp
    }
})
疑问主要有两点:
1、传入的curWData是一个类的实例化对象,能否直接使用curWData.m_appkey获取类属性?
2、hook的方法中调用了另一个方法getMD5Code,脚本中能否直接使用getMD5Code?如果不能该如何调用?再hook一个getMD5Code方法吗?

bigbigban21 发表于 2022-11-10 13:34

关于第一个问题,已经试过了,如果传入参数是一个类的实例化对象,可以通过.XXX获取类属性。关于第二个问题目前还没找到解决办法,希望大佬们帮忙看下如何解决

jayfox 发表于 2022-11-10 13:51

标记一下一会回来看

bigbigban21 发表于 2022-11-10 14:26

目前已经拿到MD5值了,直接hook下面的getMD5Code方法就行了,现在的代码如下:
Java.perform(function () {
    var CommClass = Java.use('xxx.xxx.xxx.xxx.xxx')
    CommClass.getMD5Code.implementation = function (value){
      console.log(value);
      const result = this.getMD5Code(value);
      console.log(result)
      return result
    }
})
但还是想知道hook的方法中调用了另一个方法,如何去获得调用方法的返回值?

debug_cat 发表于 2022-11-10 15:44

直接hook get md5 code就行了,你直接找到md5code这个方法所属的类,然后hook就行。

kof21411 发表于 2022-11-10 20:37

bigbigban21 发表于 2022-11-10 14:26
目前已经拿到MD5值了,直接hook下面的getMD5Code方法就行了,现在的代码如下:


你想用的应该是RPC吧

bigbigban21 发表于 2022-11-11 08:35

kof21411 发表于 2022-11-10 20:37
你想用的应该是RPC吧

对对对,就是这个意思,主动调用方法获取返回值

kof21411 发表于 2022-11-11 18:51

bigbigban21 发表于 2022-11-11 08:35
对对对,就是这个意思,主动调用方法获取返回值

import frida
import sys

rdev = frida.get_usb_device()
session = rdev.attach("com.yuanrenxue.onlinejudge2020")# 包名

js_code = """
rpc.exports = {
    getsign: function(i) {
      Java.perform(function() {
            console.log("get_sign");
            var my_class1 = Java.use("com.yuanrenxue.onlinejudge2020.OnlineJudgeApp");
            var reslut = my_class1.getSign1(i);
            console.log(reslut);
            send({ "sign": reslut, "num": i })
            return reslut;
      });
    },
};
"""

script = session.create_script(js_code)


def on_message(message, data):
    sign = message.get("payload").get("sign")
    num = message.get("payload").get("num")


script.on("message", on_message)
script.load()

script.exports.getsign(1) # 调用的函数

sys.stdin.read()
页: [1]
查看完整版本: Frida hook 方法问题