各位大佬好,请教一个问题。
arm64位so,如果一个函数返回值的内容比较长,会在调用函数前将一个地址放在x8寄存器中,函数调用结束后,再从那个地址中取出内容当作函数返回值。
比如ArtMethod类中的PrettyMethod方法,art::ArtMethod::PrettyMethod(bool),导出符号是 _ZN3art9ArtMethod12PrettyMethodEb。它在汇编代码中被调用时是这样的:
我想用frida调用这一类的函数,该如何实现?
var ArtMethod_PrettyMethod
=
Module.findExportByName(
"libart.so"
,
"_ZN3art9ArtMethod12PrettyMethodEb"
);
var prettyMethod
new NativeFunction(ArtMethod_PrettyMethod,
"pointer"
, [
"bool"
]);
var tempResult
prettyMethod(ptr(artMethod),
1
console.log(
"tempresult:"
, tempResult);
/
tempResult不是指针,无法取出内容
var result
Memory.alloc(
1024
this.context.x8
result;
"result:"
, hexdump(result));
result内存中全是
0x00
,没有内容
上面两种方法都不行,有没有大佬知道要怎么搞的?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
那个artMethod是我通过hook ArtMethod::RegisterNative函数拿到的ArtMethod对象的this指针,帖子里没有把这部分的代码放进来
不吃早饭 你可以写一个native bridge,用魔法对抗魔法,c/c++的问题用c/c++来解决
万里星河 这个以我的理解哈 arm64的返回值肯定是在x0里 不会在x8里 我感觉你的需求应该是要主动调用后获取x8寄存器的值 那么主动调用构造nativeFunction应该是没问题的 关键是传参 那个poi ...