美文网首页转载部分
二进制文件分析之常用命令

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

作者: 一意孤行的程序猿 | 来源:发表于2020-07-18 11:41 被阅读0次
      • 一、背景介绍
      • 二、常用命令
        • 1. otool
        • 2. lipo
        • 3. nm
        • 4. strings
      • 三、总结

    一、背景介绍

    最近新版本审核时被拒了,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方法导致引入了该符号。代码示例如下:

    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等命令快速自查,解决问题。

    推荐👇:

    作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:789143298 ,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

    申请即送:

    相关文章

      网友评论

        本文标题:二进制文件分析之常用命令

        本文链接:https://www.haomeiwen.com/subject/xlvxkktx.html