43

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

 3 years ago
source link: http://cocoa-chen.github.io/2020/07/20/二进制文件分析之常用命令/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近新版本审核时被拒了,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"
otool -ov path

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

2EFzAv.png!mobile

2. lipo

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

常用的几个子命令如下:

lipo -info XXX
lipo -remove armv7 origin_xxx.a -output op_xxx.a
lipo -thin arm64 origin_xxx.a -output op_xxx.a
lipo -create device_xxx.a simulator_xxx.a -output universal_xxx.a

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

rEnE7fQ.png!mobile

3. nm

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

nm path
nm -nm path
nm -u path

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

niU7Zbi.png!mobile

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

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

2EFJFfy.png!mobile

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

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

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) { }]; 方法。

VJbyeiB.png!mobile

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

三、总结

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK