iOS开发中常用命令工具(xcode-select、lipo、xcrun等)

一、xcode-select

当安装多个xcode的版本,使用该工具使用指定的版本。

Print or change the path to the active developer directory. This directory
controls which tools are used for the Xcode command line tools (for example,
xcodebuild) as well as the BSD development commands (such as cc and make).

-p 或者 --print-path 查看当前开发者目录,也即是xcode的版本目录。print the path of the active developer directory
-s --switch 选择xcode的版本
--install 安装
--version 查看版本
--reset 恢复默认
sudo rm -rf /Library/Developer/CommandLineTools 强制删除安装目录下的文件

二、lipo命令

是管理Fat File的工具, 可以查看cpu架构, 提取特定架构,整合和拆分库文件。

  • 查看第三方库的architetures
    lipo -info xxx.framework/xxx.a
    输出:Architectures in the fat file: libXXXXX.a are: armv7 i386 x86_64 arm64

  • lipo -create xxxx xxxx -output xxxx
    整合成Fat文件

  • lipo xxxx -thin cpu(armv7/arm64等) -output xxxx
    提取特定的cpu架构的thin文件
    lipo libReact.a -thin arm64 -output arm64/lib-arm64.a

  • lipo -remove cpu(armv7/arm64等) xxxx -output xxxx
    移除掉特定的cpu架构的文件

三、otool命令(逆向命令)

Mac OS X下二进制可执行文件的动态链接库是dylib文件。所谓dylib,就是bsd风格的动态库。基本可以认为等价于windows的dll和linux的so。mac基于bsd,所以也使用的是dylib。

Linux下用ldd查看,苹果系统用otool

  • cd /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
    目录下有很多有用的命令,如lipootoolclangdwarfdumplibtool

  • otool -L 可执行文件名(exec文件名)
    列出当前可执行文件的链接库(即动态库)

xxx_execFileName_xxx (architecture armv7):
    /usr/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 904.4.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 321.1.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 104.2.0)
       @rpath/ArcSoftFaceEngine.framework/ArcSoftFaceEngine (compatibility version 1.0.0, current version 1.0.0)
        ....

xxx_execFileName_xxx丁 (architecture arm64):
    /usr/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 904.4.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 321.1.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 104.2.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
  • otool -l 可执行文件 | grep crypt 查看ipa包是否加壳:
//其中cryptid代表是否加壳,1代表加壳,0代表已脱壳。
    cryptoff 16384
    cryptsize 6651904
      cryptid 0
     cryptoff 16384
    cryptsize 6553600
      cryptid 0
  • otool -h execfilename 查看Mach-O头结构等
    一个 Mach-O 的文件头结构为:
    20180810142631273.png
  • otool -tV execfilename 查看汇编码

otool命令介绍
MobSF
Mach-O 文件格式解析


三、xcodebuild 与 xcrun

xcodebuild:通过工程文件,生成app文件。
xcrun:通过app文件,来生成ipa文件(包含了签名的过程)。

3.1、xcodebuild

使用xcodebuild生成app的完成命令
xcodebuild -sdk  iphoneos8.1   -target test  -configuration Release  -arch arm64  -arch armv7  CODE_SIGN_IDENTITY="iPhone Distribution: xxxxxxx" clean build
  • -sdk 指定最低的SDK版本
  • -target 指定打包的target
  • -configuration 指定测试或者发布包
  • -arch 指定cpu的指令集
  • CODE_SIGN_IDENTITY 指定证书
  • clean built 设定每次生成app之前都会清楚掉旧的记录

其他

  • xcodebuild -showsdks 查看所支持的SDK
  • xcodebuild -list 查看所支持的target

3.2、xcrun

通过app文件生成ipa文件

sudo xcrun -sdk iphoneos PackageApplication    -v build/Release-iphoneos/test.app  -o `pwd`/build/Release-iphoneos/test2.ipa --sign "iPhone Distribution: xxxxxxxxxx"

四、libtool

libtool是一个通用库支持脚本(/usr/bin/libtool),将使用动态库的复杂性隐藏在统一、可移植的接口中。

可以在不同平台上创建并调用动态库,我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节, 只要告诉libtool说我需要要编译哪些库即可,并且,它只与libtool文件打交道,例如lo、la为后缀的文件。
libtool工具的使用

五、ar命令

库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
详细命令参见,菜鸟网络-ar命令

应用

可以用来创建、修改库,也可以从库中提出单个模块。

  • 例如:解析libAFNetworking.a
    必须将libAFNetworking.a拆分为不同arm架构的包,否则报错
ar: libAFNetworking.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
ar: libAFNetworking.a: Inappropriate file type or format

lipo libAFNetworking.a -thin arm64 -output lib-arm64.a 生成Arm64包

ar -t lib-arm64.a 输出包含的.o文件 和 otool -L libAFNetworking.a 一样。

_.SYMDEF
AFAutoPurgingImageCache.o
AFHTTPSessionManager.o
AFImageDownloader.o
AFNetworkActivityIndicatorManager.o
AFNetworking-dummy.o
AFNetworkReachabilityManager.o
AFSecurityPolicy.o
AFURLRequestSerialization.o
AFURLResponseSerialization.o
AFURLSessionManager.o
UIActivityIndicatorView+AFNetworking.o
UIButton+AFNetworking.o
UIImageView+AFNetworking.o
UIProgressView+AFNetworking.o
UIRefreshControl+AFNetworking.o

ar -x lib-arm64.a 解压出包里面的.o文件

五、nm命令,俗称“纳米”

在iOS开发中,常常用来分析二进制和静态库文件。
列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。

  • -j 只显示包的符号名称
  • -u,打印出那些未定义的符号
    详细的命令查看 Linux的nm查看动态和静态库中的符号
nm应用:

iOS开发中,可以用来查看.a静态库所有打包进去的.o文件和函数接口信息,帮助我们定位崩溃信息。
例如:nm -u libAFNetworking.a 列出某个.o文件的接口信息。

3B96890C-0EDD-4CEA-A3B8-482268FF92B1.png

六、xxd 命令

二进制查看命令,将文件显示为16进制字符串表示形式。
例如:xxd libYTKNetwork.a | grep "net" 查看YTKNetwork.a文件里面包含net字符串的,帮助我们分析一些二进制文件。

8FCE6A3D-0D7F-4B84-B02B-7EB7DDF99CAA.png

七、dwarfdump 命令

DWARF文件初探——提取轻量符号表

八、class-dump

  • 导出头文件.h 列表
    class-dump -H 可执行文件(.app) -o 目标目录

    class-dump-z 是对 class-dumpclass-dump-x 的改进版,完全用C++重写,避免动态调用,这使得 class-dump-zclass-dumpclass-dump-x快10倍左右,并且可以在 Linux、Mac、 iPhone 上运行。

    iOS逆向之class-dump

九、dumpdecrypted 砸壳命令


其他

  • reveal -
    分析UI工具

  • cycript
    很多语法的解释器,可以动态修改和调试Mac app和iOS app

  • MonkeyDev
    集成非越狱手机逆向工具的插件,集成了重签名、打包、classDump、cycript等等一系列逆向需要的工具,是Xcode的一个插件。

  • IDAPro 逆向工程师的生命

  • MachOView 查看MachO文件格式信息

  • iOS-app-signer-master ios重签名工具

  • 查找工程中是否包含某个文件
    find . -type f | grep -e ".a" -e ".framework" -e ".m" -e ".cpp" | xargs grep -s ALSmartLink

  • 解析.a文件,常用到的命令
    file x.a 查看.a文件的arch架构
    lipo x.a -thin armv7 -output v7.a 导出某种架构的瘦包.a
    ar -x v7.a 从.a中解析出.o文件
    nm xxx_file_xxx.o > xxx_file_xxx.m 查看.o文件的符号名,如函数名等信息。

  • spctl 命令?
    sudo spctl --master-disable

  • Cydia Substrate
    Cydia Substrate是一个基于Hook的代码修改框架,可以在Android、iOS平台使用,并实现修改系统默认代码。

参考

Mac系统下lipo, ar, nm等工具的使用简介
美团 iOS 工程 zsource 命令背后的那些事儿
Linux工具参考篇
iOS 静态库冲突 两个不同的.o 文件冲突 ,静态库分离

你可能感兴趣的:(iOS开发中常用命令工具(xcode-select、lipo、xcrun等))