安卓逆向7,frida小练习,hook java 层密码校验函数,绕过密码验证,进入下一个界面
###
具体怎么使用这个frida来逆向,来hook?
下面讲解一个案例:
##
###
分析这个题目:
第一步:这个是打开apk进入了这个页面,主界面有一个输入框,输入按钮,所以这个按钮应该是在apk的主界面,
第二步,我就要进入主界面的源码,看看源码,
第三步,既然要看源码,所以先apk反编译,拿到源代码,如果有壳,要先脱壳,才能拿到源代码,这个小app是没有加固的,
第四步,拿到源代码之后去找application文件,看看主界面是在哪一个java文件,看看这个逻辑是什么,点击按钮是发生了什么?
onCreate方法,这个就是进入一个页面首先执行这个方法,然后就是生成页面
onclick方法,先拿到了输入框的密码,和他自己的密码对比,就是if里面校验成功,就是return,否则就是校验失败,
securityCheck,这个就是检查密码是否一直,如果是真就是进入这个分支,否则就是校验失败的分支,
另外native securityCheck,这个就是说明securityCheck这个函数不是在java代码里面的,是在so库里面的,
而且你放到这个方法右键,是找不到这个java代码的来源的,是封装到so库里面的,这种需要另外的方法hook,
###
我们的目的是什么,
拿到判断的逻辑,我们让if里面的值一直都是TRUE,不让他FALSE进入另一个分支,
这样不管是我们输入什么,都是正确的,
所以我们要hook到这个函数,修改这个函数,
就是这个思路,
###
hook这个securitycheck的方法,强行改成TRUE,
代码解释,因为是java应用层的hook,所以要使用java模块 ,
怎么找这个类名,可以通过jadx,右键复制类名就可以了com.yaotong.crackme.MainActivity
java.use就是使用这个类,
把类赋值给一个变量,
然后这个变量再去调用方法,securityCheck
然后重写这个方法,从写赋值这个函数,参数要看你要hook的函数是不是有参数,
没有参数会报错的,
这样就hook成功了,然后你输入任意的内容,就会直接打印出来i am here 就是hook成功了,
不用管这个方法里面做了什么,我们只管输出,
这样就绕过了
###
上面讲的都是方法论,
这个案例比较简陋,不具有实战性,但是这个展示了frida的应用,这个是方法论,具体的应用,还需要不断实践才可以,
另外就是这个最重要的,是分析java代码,梳理出hook的思路,
###
上python代码
import frida import sys def on_message(message,data): if message["type"] == "send": print("[*]{0}".format(message["payload"])) else: print(message) jscode = """ Java.perform(function(){ var TestSig = Java.use("com.yaotong.crackme.MainActivity") // var mystr = Java.use('java.lang.String'); 这一句可以不要, TestSig.securityCheck.implementation = function(str){ send("i am here"); return true; } }) """ process = frida.get_usb_device().attach("自毁程序密码") script = process.create_script(jscode) script.on("message",on_message) print("[*] running CIF") script.load() sys.stdin.read()
###
#####