❶ Mac查看文件内容常用的命令小结
最近苹果的热更新和私有库问题检查的更严了,如果应用被拒,苹果在拒绝信中会说到使用 strings / otool / nm 命令进行自查,所以总结了一些命令,方便查找和定位文件内容相关信息。 检查是否包含(weixin)字符串:❷ iOS非越狱注入插件
这里我们以QQ App来举例,这里需要注入的是我自己写的一个 QQPlus 这个插件; 首先我们需要准备以下文件:
解压完成后我们先确认包是否加密, 使用 otool 命令
输入以上命令后输出
这里 cryptid 为 0 则为未加密, 确认了未加密后我们就可以开始注入了;
可以看到 倒数第三 个依赖, 我们需要使用 install_name_tool 命令修改他
然后再次使用 otool 命令查看是否修改成功
这里可以看到已经把 /usr/lib/libsubstitute.0.dylib 已经被修改为 @executable_path/Frameworks/libsubstitute.0.dylib
这里可以很清楚的看到一个依赖 /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate , 同样我们需要使用 install_name_tool 命令修改他把他修改到 Frameworks 目录下的 libSubstrate.dylib
再使用 otool 命令查看是否成功修改依赖
这里可以看到依赖已经被修改为 @executable_path/Frameworks/libSubstrate.dylib
再次使用 otool 命令查看是否注入成功
这里可以看到我们已经插入了 @executable_path/Frameworks/QQPlus.dylib
个人Cydia源: https://moxcomic.github.io
QQ交流群: 821196802
❸ iOS开发中常用命令工具(xcode-select、lipo、xcrun等)
当安装多个xcode的版本,使用该工具使用指定的版本。
-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 强制删除安装目录下的文件
是管理Fat File的工具, 可以查看cpu架构, 提取特定架构,整合和拆分库文件。
Mac OS X下二进制可执行文件的动态链接库是dylib文件。所谓dylib,就是bsd风格的动态库。基本可以认为等价于windows的dll和linux的so。mac基于bsd,所以也使用的是dylib。
Linux下用 ldd 查看,苹果系统用 otool 。
otool命令介绍
MobSF
Mach-O 文件格式解析
xcodebuild :通过工程文件,生成app文件。
xcrun :通过app文件,来生成ipa文件(包含了签名的过程)。
通过app文件生成ipa文件
libtool是一个通用库支持脚本(/usr/bin/libtool),将使用动态库的复杂性隐藏在统一、可移植的接口中。
可以在不同平台上创建并调用动态库,我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节, 只要告诉libtool说我需要要编译哪些库即可,并且,它只与libtool文件打交道,例如lo、la为后缀的文件。
libtool工具的使用
库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
详细命令参见, 菜鸟网络-ar命令
可以用来创建、修改库,也可以从库中提出单个模块。
lipo libAFNetworking.a -thin arm64 -output lib-arm64.a 生成Arm64包
ar -t lib-arm64.a 输出包含的.o文件 和 otool -L libAFNetworking.a 一样。
ar -x lib-arm64.a 解压出包里面的.o文件
在iOS开发中,常常用来分析二进制和静态库文件。
列出 .o .a .so 中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。
iOS开发中,可以用来查看.a静态库所有打包进去的.o文件和函数接口信息,帮助我们定位崩溃信息。
例如: nm -u libAFNetworking.a 列出某个.o文件的接口信息。
二进制查看命令,将文件显示为16进制字符串表示形式。
例如: xxd libYTKNetwork.a | grep "net" 查看YTKNetwork.a文件里面包含net字符串的,帮助我们分析一些二进制文件。
DWARF文件初探——提取轻量符号表
Mac系统下lipo, ar, nm等工具的使用简介
美团 iOS 工程 zsource 命令背后的那些事儿
Linux工具参考篇
iOS 静态库冲突 两个不同的.o 文件冲突 ,静态库分离
❹ dyld: Library not loaded解决方案
此问题是由于动态库依赖路径导致,分为两种情况:
在项目启动后,由于路径问题App直接崩溃,Xcode打印出以下信息:
根据打印内容,我们可以得知是 /usr/local/lib/libimobiledevice-glue-1.0.0.dylib 无法正确找到,解决方法如下:
至此该问题已解决。
首先进行问题定位,可以使用 otool 命令查看问题:
在终端输入 otool -L 动态库全路径 ,就可显示其内部引用信息。
有的时候崩溃并不是动态库文件没找到,而是动态库内部依赖路径有问题,Xcode会打印出以下信息:
根据打印内容,我们得知是由于 aa.3.dylib 这个库内部的引用无法找到,比如我的 libcrypto.3.dylib 真实路径是 Build/Procts/Debug/xxx.app/Contents/Frameworks/libcrypto.3.dylib ,而这个 aa.3.dylib 内部的引用路径是 /usr/lib/libcrypto.3.dylib 。因此我们需要讲其修改:
打开终端输入以下命令进行修改:
install_name_tool -change 动态库中错误的引用路径 正确的引用路径 有问题的动态库全路径
比如我的示例:
install_name_tool -change /usr/lib/libcrypto.3.dylib @executable_path/../Frameworks/libcrypto.3.dylib aa.3.dylib的全路径
至此问题已解决。
❺ iOS 逆向----otool命令入门
首先可以拿自己的ipa包进行尝试。
选择你的ipa包,然后把后缀名改为zip,解压缩得到Payload文件夹,里面就是你的APP。
打开终端,直接cd到你的xxxx.app目录下。具体做法,输入cd,然后把xxxx.app直接拖到终端里打个回车。
然后输入otool,会显示如下内容:
有兴趣的同学可以仔细研究一下每个命令是干吗用的,这里介绍几个常用命令:
可执行文件的名称可以右键xxxx.app文件,选择显示包内容,然后找到里面的exec文件,把名字打进去。一般来说这个文件的名字跟xxxx是一样的
然后奇迹就出现了。。。
是不是很熟悉?这个命令列出了你使用的所有库的名字。
查看ipa包是否加壳:
其中cryptid代表是否加壳,1代表加壳,0代表已脱壳。我们发现打印了两遍,其实代表着该可执行文件支持两种架构armv7和arm64.
这里给大家推荐一个自动化检测的神器:
MobSF
根据Document的提示自行研究一下吧。
❻ ldd与otool
ldd命令用于打印程序或者库文件所依赖的共享库列表
ldd不是一个可执行程序,而只是一个shell脚本
体积小,需要链接动态库,对各平台的兼容性可能不太好
参考:
https://www.linuxsong.org/2015/04/mac-os-x-ldd-strace
http://man.linuxde.net/ldd
https://coolshell.cn/articles/1626.html
https://stackoverflow.com/questions/1685483/how-can-i-examine-contents-of-a-data-section-of-an-elf-file-on-linux
https://www.jianshu.com/p/ef462437b999
❼ iOS 包签名及重签名
签名相关的命令:
•$security find-identity -v -p codesigning -- 列出钥匙串里可签名的证书
•$security cms -D -i embedded.mobileprovision -- 查看描述文件
•$codesign–fs “证书串” 文件名 -- 强制替换签名
重签步骤:
1.删除插件和带有插件的.app包(比如Watch)
2.对Frameworks里面的库进行重签名
3.给可执行文件 +x(可执行)权限
4.替换描述文件
5.替换BundleID
6.通过授权文件(Entilements)重签.app包
实际操作:
获取破壳的ipa包
获取第三方ipa包
查看ipa包是否已经破壳 》 非上架的都没加壳,无需关注
解压ipa包,进入playload文件夹,找到MachO文件
在终端使用命令otool -l DingTalk | grep crypt,0是已脱壳,大于0是未脱壳(一
般为1)
终端查看本地有效证书
$security find-identity -v -p codesigning
删除无法签名的插件文件
删除Plugins文件夹和Watch文件夹
对.app文件夹内的Frameworks文件夹中的每一个framework强制重签名
命令:$ codesign -fs "iPhone Developer: xxx " xxx.framework
找到framework文件夹下所有.framework,分别使用上面的命令对其签名。
建议通过脚本命令执行:
将要签名的描述文件该成 embedded.mobileprovision 替换 来的 embedded.mobileprovision
创建entitlements.plist文件
查看描述文件内容,使用命令security cms -D -I embedded.mobileprovision,找到Entitlements节点,接着创建entitlements.plist文件,内容拷贝过去,最后把entitlements.plist文件拷贝到playload文件夹内(与xx.app同级)。
!]( https://upload-images.jianshu.io/upload_images/1502585-e1694c8e1e77a197.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
修改xx.app包里面的info.plist中的bundleId为上面项目的bundleId
对xx.app开始签名
使用的命令: zip –ry 输出文件 输入文件 命令。也可以手动压缩。
将上述操作 通过shell命令 写个脚本文件。然后一键操作。
shell脚本语言命令
地址: https://github.com/InjoyDeng/ResignTool
蒲公英平台重签名
本文章主要介绍iOS 版本发布的两个相关功能。
一 : iOS 开发出的版本发布安装 用两种方式 :
软件环境
Mac: v10.12.6 (16G29)
ruby: v2.3.4
rvm: v1.29.3
sigh: v2.71.1
Xcode: v9.2
使用sigh脚本
使用之前先安装一下脚本环境
应用场景:
主要解决因重复打包导致测试同学回归测试的包和上传App Store的包不一致的问题。以及 合作方之间 证书不一致,需要重新签名问题。
App开发测试流程
对回归测试通过的ipa包进行重新签名,然后上传 App Store
输入的 Signing Identity 如果和 .mobileprovision文件 不一致,那么终端上仍会提示resign成功,但是,安装时会报错!
codesign -vv -d xxx.app
本文主要讲述sigh命令的安装和使用。
首先确保你安装了Xcode的命令行工具。
然后通过gem安装sigh,gem的安装请自行谷歌。
在终端执行
依次执行下列步骤:
关于更多sigh用法请访问 sigh使用
签名成功的应用就可以顺利在我们的设备中安装了并使用了,用这个方法可以进行非越狱平台安装在正版基础移植的越狱应用。
工具: https://github.com/InjoyDeng/ResignTool
借鉴: https://www.jianshu.com/p/d68924e1af25
https://www.jianshu.com/p/d68924e1af25
https://www.cnblogs.com/guohai-stronger/p/11781249.html
iOS APP签名机制详解