Frida是一款基于Python + JavaScript的Hook与调试框架。从Java层到Native层的Hook无所不能。我们分析app的参数加密的时候,经常使用他来帮助分析我们分析调试。
在hook我们的关键函数的时候,我们经常会把参数打和函数调用栈印出来,方便我们分析app的加密行为。
下面是总结的一些常用的方法:
参数打印问题
当参数是不是string类型的时候(HashMap、Map等),那我们打印出来查看的时候很可能显示[object Object]
。
下面的一些方法可以帮助我们把他们转成string来打印。
- HashMap和Map类型
var Map = Java.use('java.util.HashMap');
var args_x = Java.cast(x, Map);
send(args_x.toString());
- byte[]类型
var arr = Java.use("java.util.Arrays");
var JavaString =Java.use("java.lang.String");
send("参数对应数组:" + arr.toString(x))
send("参数对应字符串:" + JavaString.$new(x))
打印函数调用栈
我们hook一些关键函数的时候,有时候很想看一下这个函数的调用栈,我们有两种方法可以打印函数调用栈:
第一种方法:
var jAndroidLog = Java.use("android.util.Log");
var jException = Java.use("java.lang.Exception");
var threadef = Java.use('java.lang.Thread');
var threadinstance = threadef.$new();
function Where(stack){
for(var i = 0; i < stack.length; ++i){
send(stack[i].toString());
}
}
在hook函数里调用上面定义的方法
var stack = threadinstance.currentThread().getStackTrace();
send("Full call stack:" + Where(stack));
第二种方式:
直接在hook函数里send:
send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
手动构造参数时候常用的方法
我们hook app的时候,可以通过注入参数,来修改app的行为,下面是一些非常有用的方法帮助我们来注入参数:
- string转byte[]
function stringToBytes(str) {
var ch, st, re = [];
for (var i = 0; i < str.length; i++ ) {
ch = str.charCodeAt(i);
st = [];
do {
st.push( ch & 0xFF );
ch = ch >> 8;
}
while ( ch );
re = re.concat( st.reverse() );
}
return re;
}
- 获得context
有时候参数可能是context,那我们可以通过下面的方式获得context
var currentApplication= Java.use("android.app.ActivityThread").currentApplication();
var context = currentApplication.getApplicationContext();
上面的一些方法是我们在利用app经常会用到的一些方法,希望在逆向分析的时候对大家有所帮助