前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 私有 API 调用检测机制探讨

iOS 私有 API 调用检测机制探讨

作者头像
刘笑江
发布2018-05-28 12:31:44
3.1K1
发布2018-05-28 12:31:44
举报
文章被收录于专栏:刘笑江的专栏刘笑江的专栏

最近发现部分 App 以字符串拼接的方法调用私有 API,在提交 AppStore 审核后被发现打回修改的案例。

对于开发者提交的二进制文件,Apple 是如何检查出私有 API 的调用 ?本文尝试探讨可能的检测机制,以及每种机制的漏洞。

私有 API 调用方法1:直接调用法

代码语言:javascript
复制

[self _privateMethod];

私有 API 调用方法2:字符串拼接法

借助 Objective-C 语言的动态特性,在运行时用 performSelector 执行拼接的 selector 方法:

代码语言:javascript
复制
NSArray *parts = @[@"_priva", @"teMethod"];
NSString *selectorString = [parts componentsJoinedByString:@""];
[self performSelector:NSSelectorFromString(selectorString) withObject:nil];

私有 API 检测方法1:符号表检查

nmotool 等工具导出二进制包的函数符号表,以检查私有 API 的调用。

开源项目 iOS-private-api-checker 以这种方式实现了对私有 API 调用的检查。

然而这种方法的缺点是,无法检测字符串拼接方法的私有 API 调用。

私有 API 检测方法2:运行时分析

在审核人员运行 App 的同时,用 runtime 工具检测是否调用了私有 API。具体原理待补充。

这种方法的漏洞,当审核人员无法进入调用了私有 API 的功能时(通过后台下发配置文件控制功能入口),会有漏测的情况。

私有 API 检测方法3:静态代码分析

为检测字符串拼接法调用私有 API,受论文 [1] 启发,可以在对二进制文件反汇编结果的基础上,进行静态分析:

  1. 找出动态调用 API 方法如 performSelector: ,以及调用对象的类
  2. 检查参数,如果参数是拼接方法生成,推导求得拼接的结果
  3. 根据 1 2 判断是否调用了私有 API

以私有 API 调用方法2 的代码为例,用 Hopper 对其反汇编,得到伪代码:

代码语言:javascript
复制
void -[ViewController viewDidLoad](void * self, void * _cmd) {
    r31 = r31 - 0x60;
    *(r31 + 0x30) = r22;
    *(0x40 + r31) = r21;
    *(r31 + 0x40) = r20;
    *(0x50 + r31) = r19;
    *(r31 + 0x50) = r29;
    *(0x60 + r31) = r30;
    *(r31 + 0x28) = ___stack_chk_guard;
    *(r31 + 0x8) = self;
    *(r31 + 0x10) = 0x100008d38;
    [[r31 + 0x8 super] viewDidLoad];
    *(r31 + 0x18) = @"_private";
    *(0x28 + r31) = @"Method";
    r0 = [0x100008d28 arrayWithObjects:r31 + 0x18 count:0x2];
    r0 = [r0 retain];
    r20 = r0;
    r0 = [r0 componentsJoinedByString:@""];
    r0 = [r0 retain];
    [self performSelector:NSSelectorFromString(r0) withObject:zero_extend_64(0x0)];
    [r0 release];
    [r20 release];
    if (___stack_chk_guard != *(r31 + 0x28)) {
            __stack_chk_fail();
    }
    return;
}

可以看出,伪代码有着充分的信息,可以进行静态分析推导,判断代码片段是否调用了私有 API。

然而这种方法也有漏洞,拼接的字符串由服务器下发,可以避开检查。

更多

欢迎大家补充,可以留言在 https://github.com/liuslevis/hexo/blob/master/source/_posts/ios-private-api-detection.md

引用

[1] Bergeron, Jean, et al. “Static analysis of binary code to isolate malicious behaviors.” Enabling Technologies: Infrastructure for Collaborative Enterprises, 1999.(WET ICE’99) Proceedings. IEEE 8th International Workshops on. IEEE, 1999. PDF

[2] 反汇编的利器 IDA 和 Hopper 的基本使用 Niyao https://niyaoyao.github.io/2017/01/18/Learning-Reverse-From-Today-D3/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 私有 API 调用方法1:直接调用法
  • 私有 API 调用方法2:字符串拼接法
  • 私有 API 检测方法1:符号表检查
  • 私有 API 检测方法2:运行时分析
  • 私有 API 检测方法3:静态代码分析
  • 更多
  • 引用
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档