cocoa_chen

二进制文件分析之常用命令

2020-07-20

一、背景介绍

最近新版本审核时被拒了,Apple给出的原因是使用到了Intents的功能,但是Info.plist中并未给出使用简介导致被拒。由于我们的App并不需要使用Intents等能力,所以需要排查是哪些第三方库引入的Intents.framework。下面将介绍在分析二进制文件时常用的一些命令,帮助我们快速定位问题。

首先下载jenkins打好包的IPA文件,修改ipa后缀为zip并解压,在命令行中cd 进入/Payload/TestProject.app(这里重命名为TestProject)目录下,后续步骤见命令介绍

二、常用命令

1. otool

otool命令全称object file displaying tool,是针对目标文件的展示工具,可以帮助我们发现应用中使用了哪些系统库,以及调用了哪些对象的方法和属性。

常用的几个子命令如下:

  • otool -L path //查看可执行程序都链接了那些库
  • otool -L path | grep "xxx" //筛选是否链接了xxx库
  • otool -ov path //输出Object-C类结构以及定义的方法

首先我们通过otool -L XXX命令可以确定安装包中是否包含了Intents相关的framework,通过结果可以确定的确是链接了相关库导致命中了Apple的审核扫描

2. lipo

lipo命令的作用是create or operate on universal files,即创建或处理通用文件的工具。

常用的几个子命令如下:

  • lipo -info XXX // 判断静态库所支持的平台 armv7 x86_64 arm64
  • lipo -remove armv7 origin_xxx.a -output op_xxx.a // 删除静态库包括的armv7平台
  • lipo -thin arm64 origin_xxx.a -output op_xxx.a // 拆分静态库,只保留arm64 CPU架构
  • lipo -create device_xxx.a simulator_xxx.a -output universal_xxx.a //对真机或者模拟器分别打出 .a 文件合并

接下来我们就需要用到lipo命令了,由于我们打包的MachO文件都是fat file,包含了armv7和arm64,所以搜索信息时会出现重复两份的情况。为了方便排查,我们将从MachO文件单独拆分出arm64架构。

3. nm

nm命令的作用是显示符号表,常用的几个子命令如下:

  • nm path //得到Mach-O中的程序符号表
  • nm -nm path //目标文件的所有符号
  • nm -u path //Display only undefined symbols.

这里我们直接用nm命令找到Intents相关framework的引用符号表,由于是外部framework,所以符号都是undefined。

通过nm命令可以看到macho文件中因为引用了INPreferences和INUIEditVoiceShortcutViewController等符号导致间接引入了Intents.framework和IntentsUI.framework,下面我们通过otool命令导出macho文件中的OC信息来辅助排查是哪些类引入了这几个符号。

在命令行在使用otool -ov XXX导出OC相关的类结构和相关方法到本地。

接下来用Sublime等软件打开刚才导出的ov.txt文件,搜索INUIEditVoiceShortcutViewController,可以看到是某个第三方库的类引入了相关代码导致引入了该符号,注释掉相关代码可解决。

搜索INPreferences时,发现是以OBJC_CLASS$_INPreferences的关键字引入的,在Xcode中搜索INPreferences,发现某个第三方库的类中调用了INPreferences的requestSiriAuthorization方法导致引入了该符号。代码示例如下:

1
2
3
4
if (@available(iOS 10.0, *)) {
[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
}];
}

通过以上的命令和步骤便可定位解决Intents.framework和IntentsUI.framework引入的问题,避免审核再次被拒。

4. strings

最后介绍一下strings命令,它可以帮助我们排查二进制文件中是否包含相关字符串,常用的命令为:

strings XXX | grep yourString

在打包生成的MachO文件中,我们的类名、方法名都会以字符串明文的形式存储到MachO文件中,我们可以通过grep requestSiriAuthorization:来确定是否走了[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) { }];方法。

修改完上述检测到的代码,重新打包验证,最终结果没有Intents相关的framework,问题解决。

三、总结

我是直接用IPA包进行的分析,你也可以利用上述命令封装成脚本,对工程中的所有.a遍历检查,定位是哪个第三方库引用的不合法符号,也是一种解决思路。

以上就是我们在分析二进制文件时常用的命令,这里做个总结,方便我们有相关需求时可以通过otool/nm/strings等命令快速自查,解决问题。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章