第二部分 由于帖子超长只能分段发了
还是那句话,萌新总结,如有错误请轻喷,我受不了网络暴力~_~
由于lamda中自带了frida,本节分为使用lamda与不使用lamda两种方式讲解(可惜不能兼容真机模拟器,不然是想默认使用lamda讲解的)
Frida与Drozer一样,也是基于python的分布式框架。分为服务端与客户端两个。客户端(本机)使用pip安装:
服务端(安装过lamda的手机不需要安装,也就是可以跳过下面的内容直接到使用部分)访问github页面选择下载:https://github.com/frida/frida/
服务端和客户端的版本要一致,由于pip安装时会自动选择版本,我们这里以客户端版本为准。
获取架构,然后选择对应的frida-server,如:
解压文件,adb push到/data/local/tmp,对frida-server-xxx文件chmod 777然后执行即可。
以当前最新的lamda版本(3.150)为例。首先,需要运行命令:
pip3 install -U --force-reinstall lamda[full]
然后,确定frida版本为15.X,frida-tools为12.1.X。
否则将会出现frida命令执行反复横跳,一会成功一会提示版本不匹配的问题。
使用lamda中的frida与普通情况相似,但是需要在每一条frida命令下添加参数:-H 192.168.0.2:65000(ip请改成手机ip),而原生frida需要让adb转发frida端口出来:
adb forward tcp:27043 tcp:27043
adb forward tcp:27042 tcp:27042
使用命令(如果程序太多,考虑使用frida-ps -Ua,它只会显示运行中APK)
frida -H 192.168.3.61:65000 -f com.busuu.android.enc
import lamda from lamda.client import * device=Device("192.168.3.61") fridar=device.frida #以下使用frida命令 fridar.enumerate_processes() #一个示例,枚举进程
· 如果要搜索被混淆过的、被编码的,反正很长的文件,最好复制出来在第三方编辑器中查找,不然很容易卡死
如果读者做过android开发,可以发现apk的结构和它作为源代码的结构基本类似,只是明文代码变成了编译后的文件。
最新版本中,可以右键选择函数,然后复制为frida片段(在反混淆开启时此选项生成的代码是错误的):
Java.perform(function(){ //当作主函数 var Course=Java.use('com.busuu.android.api.course.model.ApiCourse'); //这句获取类 Course.getLevels.implementation=function(){ //这里开始是Hook函数,前面的getLevels为要Hook的函数名 console.log("Hook start"); var level=this.getLevels(); //获取下返回值 console.log(level.toString()); return level; //返回函数执行结果,否则这就不是一个纯正的Hook了 } })
然后我们再写一个python脚本,使frida挂上Hook:
import frida,sys appPacknName = "com.busuu.android.enc" #请填写对应要调试APK的包名 scriptFile = "1.js" #JS文件名 HOST="192.168.3.61:65000" #frida 位置 # 输出日志的回调方法 def on_message(message, data): if message['type'] == 'send': print("[*] {0}".format(message['payload'])) else: print(message) manager = frida.get_device_manager() device = manager.add_remote_device(HOST) # spawn模式,找到目标包名并重启,在启动前注入脚本 pid = device.spawn([appPacknName]) session = device.attach(pid) device.resume(pid) #以上两行的顺序不能错 with open(scriptFile, encoding='UTF-8') as f : script = session.create_script(f.read()) script.on("message", on_message) script.load() #把js代码注入到目标应用中 #设置一直监听 sys.stdin.read()