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

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

2021-10-9 11:24
8055

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

 

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,没有内容

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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

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

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

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