启动frida服务 包名附加 1 2 3 4 5 6 7 8 9 10 11 import fridaimport sys jscode = ''' ''' device = frida.get_usb_device() process = device.attach("设置" ) script = process.create_script(jscode) script.load() sys.stdin.read()
PID附加 由于有的应用是多进程,这个时候使用包名附加就会冲突,因此可以使用PID附加。PID附加同样使用attach()
方法。
1 frida.get_usb_device().attach(pid)
spawn方式启动 1 2 3 4 5 6 7 8 9 10 11 12 13 import fridaimport sys jscode = ''' ''' device = frida.get_usb_device() pid = device.spawn(['com.android.settings' ]) process = device.attach(pid) script = process.create_script(jscode) script.load() device.resume(pid) sys.stdin.read()
因为是以挂起的方式启动进程(相当于动调时的附加),程序处于暂停状态,所以需要resume()
恢复进程运行
非标准端口启动frida-server的连接 如果使用非标准端口启动手机端frida-server时,
1 ./frida-server -l 0.0 .0 .0 :port
则python中的设备获取的代码如下:
1 device = frida.get_device_manager().add_remote_device("ip:port" )
连接多个设备 通过frida.get_device_manager().add_remote_device()
依次添加。
js与python的交互 数据从js到python 在js代码中,我们经常使用console.log()打印我们想要知道的值,但是这个值并不能交给python使用,因此在js代码中需要用到send(message[, data])
方法将值传递给python处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import fridaimport sys jscode = ''' function main(){ Java.perform(function(){ console.log("nihao123") send(11111111) }) } setImmediate(main) ''' def onMessage (message, data ): print (f'message = {message} ' ) if message['type' ] == 'send' : print (f"value = {message['payload' ]} " ) device = frida.get_usb_device() process = device.attach('设置' ) script = process.create_script(jscode) script.on("message" , onMessage) script.load() sys.stdin.read()""" nihao123 message = {'type': 'send', 'payload': 11111111} value = 11111111 """
数据从python到js python要向js发送数据则需要使用script.post()
方法,js中则使用recv([type, ]callback)
来接收。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import fridaimport sys jscode = ''' function main(){ Java.perform(function(){ recv(function(obj){ console.log(obj.data) }).wait() }) } setImmediate(main) ''' device = frida.get_usb_device() process = device.attach('设置' ) script = process.create_script(jscode) script.load() script.post({"data" : "111111" }) sys.stdin.read()
rcp转发 js 端使用rpc.exports = { key: value}
导出函数供python使用,其中键指定方法名称,值是导出的函数。
python端调用script.exports_sync.func()
执行js中的函数。
注: 如果 js 导出函数中包含驼峰命名,则 python 需要将大写替换成_小写,如 getUser => get_user
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import fridaimport sys jscode = ''' function add(a, b){ return a + b; } function sub(a, b){ return a - b; } rpc.exports = { add: add, sub: sub } ''' device = frida.get_usb_device() process = device.attach('设置' ) script = process.create_script(jscode) script.load() result = script.exports_sync.add(3 , 5 )print (result)
使用 fastapi 搭建服务端接口 超全面整理fastAPI(从入门到运用),进来看十秒钟再走不迟-CSDN博客
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import fridaimport sysimport fastapiimport uvicorn jscode = ''' function getUserData(uid){ return {"username": "gal2xy", "uid": uid, token: "asldhoinzponpnasdf"} } rpc.exports = { getUserData: getUserData } ''' app = fastapi.FastAPI()@app.get("/getUserData" ) async def getUserData (uid ): result = script.exports_sync.get_user_data(uid) return result uvicorn.run(app, port=8080 ) device = frida.get_usb_device() process = device.attach('设置' ) script = process.create_script(jscode) script.load()
在本地访问127.0.0.1:8080/getUserData?uid=123 就可以得到userdata。
参考:
Frida Python库使用 | 愧怍的小站 (kuizuo.cn)
超全面整理fastAPI(从入门到运用),进来看十秒钟再走不迟-CSDN博客