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

Frida分析setImageBitmap参数及Bitmap创建的技术咨询

关于Frida Hook Android setImageBitmap及Bitmap创建的问题解答

问题1解答

你的解读是正确的。frida-trace的日志1明确显示AppCompatImageView.setImageBitmap("<instance: android.graphics.Bitmap>"),说明这个方法确实只需要1个android.graphics.Bitmap类型的实例作为参数,父类ImageView的同名方法参数类型也一致。

问题2解答

你的解读完全错误:

  • 日志2里的androidx.appcompat.widget.AppCompatImageView{e9b4cb7 V.QD..... ......MA 681,37-992,344 #7f0a05ee app:id/whatever}是当前调用setImageBitmap方法的对象实例(也就是那个ImageView控件本身),不是方法的参数。
  • 方法的实参是arg : android.graphics.Bitmap@6099c24这一行的内容,是单个Bitmap实例。
  • 创建Bitmap时的报错和frida-trace无关,frida-trace的结果没问题。报错是因为你直接调用bm.$new()来创建Bitmap的方式不对——Android中Bitmap的公开构造方法不是直接暴露的,不能用new Bitmap()的方式创建,需要用Bitmap.createBitmap()这类静态方法,你看到的重载报错是Frida找不到你传入参数对应的Bitmap构造方法导致的。

问题3解答

android.graphics.Bitmap@6099c24不是指针,这是Java对象的默认字符串表示,格式是类名@对象哈希码。要查看Bitmap的内部值,直接调用它的公开成员方法即可,示例代码如下:

Java.perform(() =>{
    const cl = Java.use('androidx.appcompat.widget.AppCompatImageView')

    cl.setImageBitmap.implementation = function(arg) {
        // 获取Bitmap基础属性
        console.log("Bitmap宽度: " + arg.getWidth())
        console.log("Bitmap高度: " + arg.getHeight())
        console.log("Bitmap配置格式: " + arg.getConfig().toString())
        
        // 获取像素数据(示例:获取前10个像素值)
        const width = arg.getWidth();
        const height = arg.getHeight();
        // 创建对应长度的int数组接收像素
        const pixels = Java.array('int', new Array(width * height));
        arg.getPixels(pixels, 0, width, 0, 0, width, height);
        console.log("前10个像素值: " + pixels.slice(0,10).join(','))

        // 执行原方法
        this.setImageBitmap(arg)
    }
})

另外补充:你之前创建Bitmap的正确方式应该用静态方法,示例:

const bm = Java.use('android.graphics.Bitmap');
// 创建100x100、ARGB_8888格式的空Bitmap
let newBitmap2 = bm.createBitmap(100, 100, bm.Config.ARGB_8888);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:10:38