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
相关产品推荐
相关产品推荐

