尝试主动调用CGContextDrawImage,无效果

使用frida,主动构造了CGContextDrawImage函数:

var CGContextDrawImagePtr = Module.findExportByName(null, 'CGContextDrawImage')
var CGContextDrawImage = new NativeFunction(CGContextDrawImagePtr, 'void', ['pointer', 'pointer', 'pointer'])
var rect = Memory.alloc(32);
rect.writeByteArray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7E, 0x40, 0, 0, 0, 0, 0, 0, 0x84, 0x40]);
console.log('rect:', hexdump(rect, {length:32}))
CGContextDrawImage(context, rect, imageRef)

但是调用后并没有报错,但是也没有效果,怀疑是结构体传参导致的问题,CGContextDrawImage传入的第二个参数不知道是不是有什么问题,请看到的大佬不吝赐教,提前跪谢!

确实有问题。你这样的写法相当于

CGContextDrawImage(context, &rect, imageRef) (而期望的是 CGContextDrawImage(context, rect, imageRef)

结构体的用法参考:

所以应该用


const CGFloat = (Process.pointerSize === 4) ? 'float' : 'double';
const CGSize = [CGFloat, CGFloat];
const CGPoint = [CGFloat, CGFloat];

以下部分我记得是这么写,但没亲测过

按理说 CGRect 应该可以写成

const CGRect = [CGPoint, CGSize];

然后直接 [[0.0, 0.0], [480.0, 640.0]]

不过我忘了 frida 在这里到底有没有递归处理结构里的结构了,建议楼主直接试一下

3 Likes

不好意思,我把问题po上来之后就一直没过来看了,后面直接去问了大胡子,确实是这么解决的,不过也非常感谢你的解答!