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

