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方法吗? 关于第一个问题,已经试过了,如果传入参数是一个类的实例化对象,可以通过.XXX获取类属性。关于第二个问题目前还没找到解决办法,希望大佬们帮忙看下如何解决 标记一下一会回来看
目前已经拿到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的方法中调用了另一个方法,如何去获得调用方法的返回值? 直接hook get md5 code就行了,你直接找到md5code这个方法所属的类,然后hook就行。 bigbigban21 发表于 2022-11-10 14:26
目前已经拿到MD5值了,直接hook下面的getMD5Code方法就行了,现在的代码如下:
你想用的应该是RPC吧 kof21411 发表于 2022-11-10 20:37
你想用的应该是RPC吧
对对对,就是这个意思,主动调用方法获取返回值 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]