使用 frida hook Android app

Frida:

一种基于动态插装(dynamic instrumentation)技术的工具包,它主要是为测试人员、开发人员和逆向工程爱好者创建,在目标程序运行时,允许用户将 JavaScript代码注入其中,实现动态修改和调试。

支持修改多个平台的应用: Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD and QNX.

Github:frida/frida
frida 官方文档:frida doc


调试 Android app:

与同样出名的 Xposed 相比,Frida 不仅可以 Hook Java 层,同样支持 native 层。下面我们来具体操作:

1.安装 frida python 库:

pip install frida-tools
pip install frida        #可通过 pip install frida == 版本号 安装最佳适配自己手机的版本

虽然 JavaScript是用来编写实际注入和修改逻辑的语言,但官方提供了 Python库来管理 javascript 脚本和提供执行环境。输入 frida --version ,出现版本号即安装成功。

frida 
这个问题涉及的代码比较多,我尽可能提供完整的代码实现。 首先,需要使用FridaHook目标APP中的encrypt函数并将参数发送给Python处理。以下是Frida脚本的代码示例: ```javascript // Hook encrypt function Interceptor.attach(Module.findExportByName("libnative-lib.so", "encrypt"), { onEnter: function(args) { // args[0] is JNIEnv pointer, args[1] is jobject instance, args[2] is jbyteArray paramData var paramData = Java.array('byte', Memory.readByteArray(args[2], args[3].toInt32())); // Send paramData to Python script for further processing send(paramData); } }); ``` 接下来,需要编写Python脚本来处理收到的参数并返回处理结果。以下是Python脚本的代码示例: ```python import frida import binascii # Connect to the target device and start the target app device = frida.get_usb_device() pid = device.spawn(["com.example.app"]) session = device.attach(pid) device.resume(pid) # Attach to the target app and load the Frida script script = session.create_script(open("hook.js", "r").read()) script.load() # Receive paramData from the target app and process it def on_message(message, data): if message['type'] == 'send': paramData = message['payload'] # Process paramData here, for example, decrypt it with SM4 result = sm4_decrypt(paramData) # Send the result back to the target app session.post_message(result) # Register the message handler script.on('message', on_message) # Wait for the script to finish raw_input() ``` 最后,在Frida脚本中添加处理结果的代码。以下是完整的Frida脚本的代码示例: ```javascript // Hook encrypt function Interceptor.attach(Module.findExportByName("libnative-lib.so", "encrypt"), { onEnter: function(args) { // args[0] is JNIEnv pointer, args[1] is jobject instance, args[2] is jbyteArray paramData var paramData = Java.array('byte', Memory.readByteArray(args[2], args[3].toInt32())); // Send paramData to Python script for further processing send(paramData); } }); // Receive the result from Python script and replace the return value of encrypt function rpc.exports = { setResult: function(result) { // Convert the result to a byte array var resultByteArray = Java.array('byte', result); // Replace the return value of encrypt function with the result Memory.writeByteArray(this.context.x0, resultByteArray); } }; ``` 这样,当Python脚本处理完参数后,会将结果发送回到Frida脚本,Frida脚本再将结果替换到encrypt函数的返回值中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值