You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Frida技术问题:如何将字节数组从JavaScript发送至Python

解决Frida send()传递Java字节数组时的"expected a pointer"错误

在使用Frida将Android Bitmap的字节数组从JavaScript环境传递到Python环境时,调用send()函数会抛出Error: expected a pointer错误。这是因为send()的第二个参数要求是原生指针(NativePointer),而通过ByteArrayOutputStream.toByteArray()获取的是Java层的byte[]对象,并非原生内存指针,不符合API要求。


解决方案

需要将Java的byte[]转换为Frida JavaScript环境能识别的原生内存缓冲区,以下是两种可靠实现方式:

方式1:直接利用Java数组的buffer属性

Java数组对象在Frida中暴露了buffer属性,指向其底层的原生内存区域,直接传递这个缓冲区给send()即可:

// 替换原send语句
send({ type: "bitmap", page: 1 }, byteArray.buffer);

方式2:手动复制到原生Uint8Array(兼容旧版Frida)

如果遇到buffer属性不可用的情况,可以手动将Java字节数组复制到Frida的原生Uint8Array中,再传递其指针:

// 转换Java byte[]为原生Uint8Array(处理Java byte的有符号特性)
const nativeArray = new Uint8Array(byteArray.length);
for (let i = 0; i < byteArray.length; i++) {
    nativeArray[i] = byteArray[i] & 0xff;
}
// 传递原生数组的指针
send({ type: "bitmap", page: 1 }, nativeArray.buffer);

修改后的完整代码示例

JavaScript脚本部分

JS_SCRIPT = '''
setTimeout(function () {{
  Java.perform(function () {{
      // 声明依赖类
      const Bitmap = Java.use("android.graphics.Bitmap");
      const BitmapCompressFormat = Java.use("android.graphics.Bitmap$CompressFormat");
      const BitmapConfig = Java.use("android.graphics.Bitmap$Config");
      const ByteArrayOutputStream = Java.use("java.io.ByteArrayOutputStream");

      // 创建测试Bitmap
      const bitmap = Bitmap.createBitmap(100, 100, BitmapConfig.ARGB_8888.value);

      // 压缩为PNG字节流
      const stream = ByteArrayOutputStream.$new();
      const saved = bitmap.compress(BitmapCompressFormat.PNG.value, 100, stream);
      console.log("[*] Compressed as PNG:", saved);

      // 获取Java字节数组
      const byteArray = stream.toByteArray();
      console.log("[*] Byte array length:", byteArray.length);

      // 修正:转换为原生缓冲区后发送
      send({ type: "bitmap", page: 1 }, byteArray.buffer);
      stream.close();
  }});
}}, 1000);
'''

Python代码补充注意事项

  • 需提前定义pid(目标进程ID)和OUTPUT_FILENAME(输出文件路径):
pid = 12345  # 替换为实际目标进程ID
OUTPUT_FILENAME = "output.png"
  • 原on_message函数逻辑无需修改,data参数会自动接收传递的字节数据,直接写入文件即可。

内容的提问来源于stack exchange,提问作者Jugdish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:22:21