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 <path>--switch <path> 选择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中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。

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 文件冲突 ,静态库分离

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345