免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵Python学院
工具下载:
链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89
提取码:zy89
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:9.安卓逆向2-frida hook技术-frida基本使用-frida-ps指令
frida的hook主要是学习下图红框的参数,也并不需要全部学习,常用的就那几个
-U
使用usb线连接
frida -U
-f
指令app包名
-p
使用app的pid
-l
加载 hook脚本
-o
把脚本输出的信息保存到文件中
frida两种操作模式
cli命令行,javascript脚本注入进程
rpc,Python进行javascript脚本注入
frida两种操作app的方式
spwan模式,不管app运不运行它都会重启,然后注入,它的注入比较早,就是可以拦截app启动时执行的代码
attach模式,给一个正在运行的app进行注入,也就是说只有app运行了它才能进行注入,它比较晚,app启动时的代码没办法拦截(运行之后才注入怎么可能拦截启动时的代码)
到底是用spwan模式还是attach模式,-f指定包名 使用spwan模式,加了-f就会使用spwan模式,加-F使用attach模式
frida脚本都是使用JavaScript语言编写,它有个固定格式
Java.perform(function () {});
首先启动一下手机里的 frida-server
attach模式注入脚本 frida -UF -l .\FridaHook初体验.js
Java.perform(function () {// 获取当前应用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 获取包名var packageName = context.getPackageName();// 输出包名console.log("当前应用的包名是: " + packageName);send(packageName)
});
直接写exit然后按回车键(Enter键)退出hook
使用Python启动脚本
核心是通过 frida.get_usb_device()获取frida功能
然后使用device.get_process("com.xxx.frodo").pid 获取app进程id
然后写JavaScript的hook脚本
js_cpde = ''' Java.perform(function () {// 获取当前应用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 获取包名var packageName = context.getPackageName();// 输出包名console.log("当前应用的包名是: " + packageName); }); '''
然后使用 session.create_script(js_cpde) 加载脚本
然后使用 script.load() 把脚本注入到app中并执行脚本
spwan模式
指令 frida -Uf com.XXX.frodo -l .\FridaHook初体验.js
执行了上面的指令后会卡主,然后输入 %resume让app继续运行
![]()
Python使用spwan模式,,主要修改了下图红框的两行代码
# -*- coding: utf-8 -*-
import frida
import sysdef on_message(message, data):print("message", message)print("data", data)# 通过Spawn模式启动一个新的应用程序进程,并在该进程中加载Frida脚本
device = frida.get_usb_device()pid = device.spawn(["com.trs.xxxx.xxx"])
# 恢复应用程序的执行
device.resume(pid)session = device.attach(pid)js_cpde = '''
Java.perform(function () {// 获取当前应用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 获取包名var packageName = context.getPackageName();// 输出包名console.log("当前应用的包名是: " + packageName);send(packageName)
});
'''script = session.create_script(js_cpde)
# 设置监听
script.on("message", on_message)
script.load()
# 阻塞主线程,以保持脚本运行
sys.stdin.read()
还有如下图红框
使用 script.on("message", on_message)设置监听message消息,然后通过 send(packageName)的send函数触发on_message函数,这样就可以在Python代码中获取JavaScript里的数据
frida远程模式,一般不使用,它有点麻烦
首先使用把刚刚启动的frida-server按CTRL+C进行退出,然后使用 ./frida-server-14.2.18-android-arm64 -l 0.0.0.0:8881指定frida-server的端口为8881启动
然后使用 adb forward tcp:8881 tcp:8881 指令映射端口(或者理解为开启端口)
然后这时的客户端指令,不是-U使用-H了,别的没变化
Python使用frida的远程模式
# -*- coding: utf-8 -*-import frida, sysjsCode = """
Java.perform(function () {// 获取当前应用的上下文var currentApplication = Java.use('android.app.ActivityThread').currentApplication();var context = currentApplication.getApplicationContext();// 获取包名var packageName = context.getPackageName();// 输出包名console.log("当前应用的包名是: " + packageName);
});
"""def message(message, data):if message['type'] == 'send':print(f"[*] {message['payload']}")else:print(message)# 远程连接服务端
device = frida.get_device_manager().add_remote_device('127.0.0.1:8881')
# 附着到已运行的应用
process = device.attach('com.trs.xxx.newsclient')
script = process.create_script(jsCode)
script.on("message",message)
script.load()