免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵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 sys
def 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, sys
jsCode = """
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()