前言
学习一下Frida,跟着frida-labs学
frida-labs:https://github.com/DERE-ad2001/Frida-Labs
frida0x1 (Java层)
打开app看到这样一个页面,看上去是 输入数字,正确的话给flag

打开jadx看看反编译

监听了button的点击,如果点击了会获取输入(obj)判断是不是只包含数字字符,如果是就将obj从string类型转为整数类型,进入check方法与i比较
check方法检验输入的i2是否符合检验标准:i2=2i+4 ,符合的话就会执行解密将flag输出在页面上(textView)

但i是get_random随机获取的,若要获得flag就要使得i2=2i+4,才能继续往下执行解密


方法1:hook get_random方法
可以hook get_random方法,返回它获取的数字,再将符合检查标准的i2值计算并输出,届时在界面手动输入即可获得flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Java.perform(function() {
var hook = Java.use("com.ad2001.frida0x1.MainActivity"); hook.get_random.implementation = function(){
console.log("成功hook"); var i = this.get_random(); console.log("返回值是 " + i) console.log("输入 " + (i * 2 + 4 )) return i;
}
})
|


或者稍微改动一下,将返回值设置成便于计算的数字,再将输入值计算并输出,一样是手动在界面输入获得flag(其实没两样)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Java.perform(function() {
var a= Java.use("com.ad2001.frida0x1.MainActivity"); a.get_random.implementation = function(){
console.log("返回值永为 6") var i2 =2*6+4; console.log("输入值为"+i2); return 6; }
})
|


方法2:hook check方法
check接受两个参数,hook check方法,更改传入的参数,使传入的两个数字恒符合判断标准
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Java.perform(function() {
console.log("hook成功!任意输入数字即可解锁") var aaa=Java.use("com.ad2001.frida0x1.MainActivity"); aaa.check.overload('int','int').implementation=function(a,b){ console.log("i值为"+a); var new_b=2*a+4 console.log("传入的i2值为"+new_b); return this.check(a,new_b); } })
|
