首页
社区
课程
招聘
[原创] 【Frida 实战】远程过程调用(RPC)
发表于: 2020-6-7 20:14 38886

[原创] 【Frida 实战】远程过程调用(RPC)

2020-6-7 20:14
38886

本文是 Frida 实战系列教程的第五篇,讲解远程过程调用(RPC)的使用方法,也就是将应用进程中的 Objective-C 方法或 C 函数导出,提供给 Python 使用。

远程过程调用(RPC)对于应用逆向起到了很便捷的作用,比如目标应用有一个加解密的函数内部实现非常复杂,想分析整个加解密的实现过程的工作量较大,此时可以使用 frida 的 RPC 功能,只要知道加解密函数的名称或地址,还有相应的参数,即可直接调用得到加解密后的结果。

下面我们来做一个实例,编写一个 CrackMe 程序,定义一个 coreClass 类,里面有 4 个比较重要的方法,分别是 getDeviceId、httpPost、encrypt、decrypt,从它们的名称可以看出大概的意思,具体的定义如下:

下面我们要做的事情是在 JS 脚本里去调用这 4 个方法。Objective-C 方法有两种,一种是 - 号开头,称为对象方法,还有一种是 + 号开头,称为类方法,前者需要初始化一个实例才能调用,后者不需要初始化实例,可以直接调用。先来看看对象方法在 JS 脚本里如何调用,比如我们要调用 -[coreClass getDeviceId] 方法,调用的代码如下:

再来看看 +[coreClass httpPost:] 方法的调用,从下面的代码可以看出,类方法是不需要初始化实例,在方法名称后面加上一个 _ 号就可以调用了。

-[coreClass encrypt::] 的调用代码如下,输入的参数有两个,一个参数是 NSData 类型的,一个是 NSString 类型。

-[coreClass decrypt::] 的调用代码如下,两个参数都是 NSString 类型。

在上面我们已经学会如何在 JS 脚本里调用目标应用的 Objective-C 方法,接下面要做的就是将功能代码导出提供给 Python 使用。在 JS 代码里定义4个函数,分别是 getDeviceId、httpPost、encrypt、decrypt,这 4 个函数分别代表了调用目标进程的 4 个 Objective-C 方法,然后再使用 rpc.exports 将这 4 个函数导出,代码如下:

接着我们再编写 python 代码,首先调用 get_usb_device().attach 附加到目标进程,附加成功会返回一个 Session 实例,然后读取 call.js 文件里的内容,这里的内容就是上面我们编写的 JS 代码,然后调用 session.create_script 创建脚本,再调用 load 加载脚本,最后调用 script.exports 获取 JS 导出的 RPC 函数,此时就可以调用 RPC 函数,代码如下:

上面我们讲到了如何将 Objective-C 方法导出给 Python 使用,那如何导出 C 函数呢?比如调用 NSHomeDirectory 这个系统提供的函数,知道它所在的模块是 Foundation,找到它的地址在 JS 脚本里就可以调用,然后在 rpc.exports 里添加一个导出函数,这样 Python 就可以调用了。代码如下:

最后希望读者能够仔细领悟,翻一翻前面几篇教程,多加练习,相信一定会融会贯通。期待下一篇教程我们还会再见,感谢各位的支持。

第一篇:在 iOS 上分析应用
第二篇:Hook 大法,拦截器的使用
第三篇:如何拦截 sub_xxxx 这种函数
第四篇:API查找器和拦截器的组合使用


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

最后于 2020-6-7 23:33 被暗夜盗魔编辑 ,原因:
收藏
免费 10
支持
分享
最新回复 (12)
雪    币: 6064
活跃值: (5470)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
2
感谢分享,收藏了
2020-6-8 09:57
0
雪    币: 499
活跃值: (2189)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
支持楼主
2020-6-9 17:29
0
雪    币: 8065
活跃值: (6349)
能力值: ( LV12,RANK:207 )
在线值:
发帖
回帖
粉丝
4
感谢分享!
2020-6-9 17:53
0
雪    币: 24
活跃值: (1353)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢楼主分享
2020-6-11 10:09
0
雪    币: 26785
活跃值: (63217)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
6
感谢分析,mark~
2020-6-19 13:33
0
雪    币: 185
活跃值: (292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢
2020-7-24 14:23
1
雪    币: 2123
活跃值: (4512)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

你好 如果带很多参数的 + 方法如何调用
直接使用方法名_好像不行


最后于 2020-7-31 10:44 被小黄鸭爱学习编辑 ,原因:
2020-7-31 10:05
0
雪    币: 5482
活跃值: (3272)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
支持 mark
2020-8-7 13:20
0
雪    币: 5278
活跃值: (4753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
有个疑问  像这样比如 - (NSString*)getDeviceId   如何调用已存在的实例而不是重新实例化的对象
2023-7-16 16:26
0
雪    币: 28
活跃值: (415)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
文章简练易懂,感谢分享,就是oc的语法有点反人类,可能是一开始接触C,适应不过来了
2023-7-30 18:37
0
雪    币: 28
活跃值: (415)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
文章简练易懂,感谢分享,就是oc的语法有点反人类,可能是一开始接触C,适应不过来了
2023-7-30 18:37
0
雪    币: 281
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
感谢
2023-7-30 19:43
1
游客
登录 | 注册 方可回帖
返回
//