首页
社区
课程
招聘
[求助]如何用frida调用arm64 so中那些返回值放在x8寄存器中的函数?
2021-10-9 11:24 7433

[求助]如何用frida调用arm64 so中那些返回值放在x8寄存器中的函数?

2021-10-9 11:24
7433

各位大佬好,请教一个问题。

 

arm64位so,如果一个函数返回值的内容比较长,会在调用函数前将一个地址放在x8寄存器中,函数调用结束后,再从那个地址中取出内容当作函数返回值。

如果想用frida主动调用这一类的函数要怎么弄?

比如ArtMethod类中的PrettyMethod方法,art::ArtMethod::PrettyMethod(bool),导出符号是
_ZN3art9ArtMethod12PrettyMethodEb。
它在汇编代码中被调用时是这样的:
图片描述

 

我想用frida调用这一类的函数,该如何实现?

第一次尝试:

1
2
3
4
var ArtMethod_PrettyMethod=Module.findExportByName("libart.so","_ZN3art9ArtMethod12PrettyMethodEb");
var prettyMethod = new NativeFunction(ArtMethod_PrettyMethod, "pointer", ["pointer", "bool"]);
var tempResult = prettyMethod(ptr(artMethod), 1);
console.log("tempresult:", tempResult); //tempResult不是指针,无法取出内容

第二次尝试:

1
2
3
4
5
6
var ArtMethod_PrettyMethod=Module.findExportByName("libart.so","_ZN3art9ArtMethod12PrettyMethodEb");
var result = Memory.alloc(1024);
this.context.x8 = result;
var prettyMethod = new NativeFunction(ArtMethod_PrettyMethod, "pointer", ["pointer", "bool"]);
var tempResult = prettyMethod(ptr(artMethod), 1);
console.log("result:", hexdump(result)); //result内存中全是0x00,没有内容

上面两种方法都不行,有没有大佬知道要怎么搞的?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (7)
雪    币: 71
活跃值: (810)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rongkao 2021-10-9 11:53
2
0
同样的问题,求大佬
雪    币: 4
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuxucau 2021-10-9 16:00
3
0
求大佬支持~~~
雪    币: 29
活跃值: (5135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2021-10-9 19:03
4
1
你可以写一个native bridge,用魔法对抗魔法,c/c++的问题用c/c++来解决
雪    币: 62
活跃值: (572)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2021-10-10 17:04
5
0
这个以我的理解哈 arm64的返回值肯定是在x0里 不会在x8里 我感觉你的需求应该是要主动调用后获取x8寄存器的值 那么主动调用构造nativeFunction应该是没问题的 关键是传参 那个pointer是一个ArtMethod的this指针 你怎么能用ptr(artMethod)来代替呢?artMethod只是导出函数的地址 主动调用的前提是先把正确的参数准备好 调用之后hexdump(this.context.x8)就行了
雪    币: 4
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuxucau 2021-10-11 22:58
6
0

那个artMethod是我通过hook ArtMethod::RegisterNative函数拿到的ArtMethod对象的this指针,帖子里没有把这部分的代码放进来

最后于 2021-10-11 23:02 被liuxucau编辑 ,原因:
雪    币: 4
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuxucau 2021-10-11 23:01
7
0
不吃早饭 你可以写一个native bridge,用魔法对抗魔法,c/c++的问题用c/c++来解决
这样确实可以,用c++写个so,然后frida调用so,不过这样兼容性需要考虑一下。有没有其他的方法了?
雪    币: 4
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuxucau 2021-10-11 23:01
8
0
万里星河 这个以我的理解哈 arm64的返回值肯定是在x0里 不会在x8里 我感觉你的需求应该是要主动调用后获取x8寄存器的值 那么主动调用构造nativeFunction应该是没问题的 关键是传参 那个poi ...
那个artMethod是我通过hook ArtMethod::RegisterNative函数拿到的ArtMethod对象的this指针,帖子里没有把这部分的代码放进来
游客
登录 | 注册 方可回帖
返回