样本链接: https://pan.baidu.com/s/11fzO6Zlgsk8FOa24yZ4b0w?pwd=k3su 提取码: k3su
安装好apk并打开。需要输入数字,点击提交,不正确的话会提示“Try again”
mobsf扫描一下apk(如果没有搭建,可以利用fofa等搜title=”mobsf”,注意事项自行分析),并搜索“Try again”查看MainActivity:
在MainActivity.class的 onCreate方法中,有一个button的点击监听:
关键代码:
MainActivity.this.check(i, Integer.parseInt(obj));
这里传进去的i在onCreate方法中已经声明了:
final int i = get_random();
而get_random()方法,返回的是一个0-99随机的整数。:
int get_random() {
return new Random().nextInt(100);
}
并将用户输入的数一并传入check方法:
void check(int i, int i2) {
if ((i * 2) + 4 == i2) {
Toast.makeText(getApplicationContext(), "Yey you guessed it right", 1).show();
StringBuilder sb = new StringBuilder();
for (int i3 = 0; i3 < 20; i3++) {
char charAt = "AMDYV{WVWT_CJJF_0s1}".charAt(i3);
if (charAt < 'a' || charAt > 'z') {
if (charAt >= 'A') {
if (charAt <= 'Z') {
charAt = (char) (charAt - 21);
if (charAt >= 'A') {
}
charAt = (char) (charAt + 26);
}
}
sb.append(charAt);
} else {
charAt = (char) (charAt - 21);
if (charAt >= 'a') {
sb.append(charAt);
}
charAt = (char) (charAt + 26);
sb.append(charAt);
}
}
this.t1.setText(sb.toString());
return;
}
Toast.makeText(getApplicationContext(), "Try again", 1).show();
}
在check方法中可以看到app输入错误时弹出的Toast,这里i就是随机0-99的整数,i2就是用户输入的数,将这两个数进行比对,当:
(i * 2) + 4 == i2
就会弹出“Yey you guessed it right”的字符串。
因此,在这里有2个思路去实现这个功能,一个思路是,先知道i的值是多少,再将i乘以2加4得出的结果就是要输入的结果;另一个思路是通过对check进行重载,固定传进去让(i * 2) + 4 与i2相等的值,使得输入什么都将返回“Yey you guessed it right”。
思路一:
Java.perform(function() {
var a = Java.use("com.ad2001.frida0x1.MainActivity");
a.get_random.implementation = function() {
console.log("成功Hook获取0-99随机整数的方法");
var ret_val = this.get_random();
console.log("随机数为:" + ret_val);
return ret_val;
}
});
frida -U -f com.ad2001.frida0x1 -l hook_getrandom.js
输入67*2+4的值138:
成功弹出:Yey you guessed it right
可以继续完善这个脚本,让它自己计算好直接告诉我们需要输入多少即可:
Java.perform(function() {
var a = Java.use("com.ad2001.frida0x1.MainActivity");
a.get_random.implementation = function() {
console.log("成功Hook获取0-99随机整数的方法");
var ret_val = this.get_random();
console.log("随机数为:" + ret_val);
console.log("答案是:" + (ret_val * 2 + 4 ))//TO bypass the check
return ret_val;
}
});
思路二:
Java.perform(function() {
var a = Java.use("com.ad2001.frida0x1.MainActivity");
a.check.overload('int', 'int').implementation = function(a, b) {
console.log("你输入的是:" + b);
this.check(8, 20);
}
});
原文始发于微信公众号(赛哈文):Frida Hook Android method(一)