系列文章目录
第一章 frida操作
文章目录
- 系列文章目录
- 前言
- 一、两种模式
- 二、frida命令行执行及参数
- 三、frida使用python执行
- 四、动静态域调用
- 1. 静态域调用
- 2.动态域调用
- 五. 远程rpc调用
- 六. 补充
- 总结
前言
熟悉frida操作,hook手机app的关键位置进行逆向操作
一、两种模式
- attach:应用运行过程中hook, 有壳也可以
- spawn:创建进程时就hook(类还没有加载), 有壳话就不行
二、frida命令行执行及参数
frida -UF -l agent/HelloWorld.js
-U usb模式
-F 最前台的应用
-l 加载脚本
-o 输出到文件
-f spawn模式
--no-pause 进程启动之后立即执行,不用暂停
三、frida使用python执行
import time
import frida# 连接安卓机上的frida-server
device = frida.get_usb_device() # USb连接
# device =frida.get_device_manager().add_remote_device('192.168.199.199:5555') # ip连接
# 获取前台运行的应用
print(device.get_frontmost_application())
pid = device.get_frontmost_application().pid
# attach模式
session = device.attach(pid)
# 加载s1.js脚本
with open("agent/20220531.js") as f:script = session.create_script(f.read())
script.load()# 脚本会持续运行等待输入
input()
四、动静态域调用
1. 静态域调用
指的是在代码中直接引用类的字段,不需要创建类的实例。
// 打印设备指纹信息, 修改指纹信息
function FingerPrint(){Java.perform(function(){var BUILD = Java.use("android.os.Build");BUILD.DEVICE.value = "sailfish";console.log("Device is =>", BUILD.DEVICE.value);console.log("ID is =>", BUILD.ID.value);console.log("MODEL is =>", BUILD.MODEL.value);console.log("SERIAL is =>", BUILD.SERIAL.value);// console.log("SERIAL is =>", BUILD.getSerial());console.log("sdk is =>", BUILD.getString("ro.build.version.sdk"));})
}
2.动态域调用
使用Frida的JavaScript API,在运行时通过类的实例引用字段。这意味着可以修改字段的值,甚至访问私有字段。
function InstanceDemo(){Java.perform(function(){Java.choose("com.example.junior.CalculatorActivity", {onMatch:function(instance){console.log("found instance =>", instance);console.log("instance showText is =>", instance.showText.value);console.log("found instance =>", instance.clear("456"));},onComplete:function(){console.log("Search Complete!")}})})
}
五. 远程rpc调用
- https://www.freebuf.com/articles/system/190565.html
- javascript代码
function callSecretFun() { //定义导出函数Java.perform(function () { //找到隐藏函数并且调用Java.choose("com.roysue.demo02.MainActivity", {onMatch: function (instance) {console.log("Found instance: " + instance);console.log("Result of secret func: " + instance.secret());},onComplete: function () { }});});
}
rpc.exports = {callsecretfunction: callSecretFun //把callSecretFun函数导出为callsecretfunction符号,导出名不可以有大写字母或者下划线
};
- py代码
import time
import fridadef my_message_handler(message, payload):print messageprint payloaddef read_rpc_code():with open("s3.js") as f:script = session.create_script(f.read())script.on("message", my_message_handler)script.load()return script# 连接
device = frida.get_usb_device()
pid = device.spawn(["com.roysue.demo02"])
device.resume(pid)
time.sleep(1)
session = device.attach(pid)# rpc调用
script = read_rpc_code()
script.exports.callsecretfunction()
六. 补充
frida-ps -Uai : 列出当前手机的进程,可以看到进程id
然后可以通过
objection -g 进程id explore 进行注入
总结
frida学习资料