吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 912|回复: 7
收起左侧

[Android 求助] Frida hook 方法问题

[复制链接]
bigbigban21 发表于 2022-11-10 10:42
本帖最后由 bigbigban21 于 2022-11-10 10:47 编辑

小白一枚,最近正在学习安卓逆向,由于前阵子旁观大佬用frIDA hook目标app的加解密流程后挖到许多高危,所以现在也在照猫画虎学用frida,在hook某方法时遇到问题
app的部分源代码如下:
[Java] 纯文本查看 复制代码
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值,我目前的脚本如下:
[JavaScript] 纯文本查看 复制代码
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方法就行了,现在的代码如下:
[JavaScript] 纯文本查看 复制代码
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方法就行了,现在的代码如下:
[mw_shl_code=javascript,t ...

你想用的应该是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
对对对,就是这个意思,主动调用方法获取返回值

[Python] 纯文本查看 复制代码
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()
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-15 06:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表