一、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
目录下有很多有用的命令,如lipo
、otool
、clang
、dwarfdump
、libtool
等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 的文件头结构为:
-
otool -tV execfilename
查看汇编码
三、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文件的接口信息。
六、xxd
命令
二进制查看命令,将文件显示为16进制字符串表示形式。
例如:xxd libYTKNetwork.a | grep "net"
查看YTKNetwork.a文件里面包含net字符串的,帮助我们分析一些二进制文件。
七、dwarfdump
命令
八、class-dump
-
导出头文件
.h
列表
class-dump -H 可执行文件(.app) -o 目标目录
class-dump-z
是对class-dump
和class-dump-x
的改进版,完全用C++重写,避免动态调用,这使得class-dump-z
比class-dump
和class-dump-x
快10倍左右,并且可以在 Linux、Mac、 iPhone 上运行。
九、dumpdecrypted 砸壳命令
其他
reveal -
分析UI工具cycript
很多语法的解释器,可以动态修改和调试Mac app和iOS appMonkeyDev
集成非越狱手机逆向工具的插件,集成了重签名、打包、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 文件冲突 ,静态库分离