otool工具简介
otool(object file displaying tool) :目标文件的展示工具。可以用来发现应用中使用到了哪些系统库,调用了其中哪些方法,使用了库中哪些对象及属性,它是Xcode自带的常用工具。
在mac终端输入otool,就可以看到常用的命令以及参数
- 例子: 查看支付宝依赖库
//查找支付宝可执行文件的位置
iPhone:/tmp root# ps -e | grep AlipayWallet
2162 ?? 0:22.33 /var/mobile/Containers/Bundle/Application/50C881E4-8116-40C8-9922-3963DBD155EE/AlipayWallet.app/AlipayWallet
2581 ttys000 0:00.01 grep AlipayWallet
//将可执行文件拷贝到mac桌面上的test文件夹下
iPhone:/tmp root# scp /var/mobile/Containers/Bundle/Application/50C881E4-8116-40C8-9922-3963DBD155EE/AlipayWallet.app/AlipayWallet zl@192.168.0.102:/Users/zl/Desktop/test
//回到mac终端查看用到的依赖库
otool -L AlipayWallet
class_dump
简介
可以将Mach-O文件中的Objective-C运行时的声明的信息导出,即编写OC代码时的 .h文件。classdump是对”otool -ov” 信息的翻译,以一种我们熟悉的易读的方式呈现。
下载地址 http://stevenygard.com/projects/class-dump/安装方式
下载class-dump后,将class-dump复制到/usr/local/bin目录下,
(需要把文件拷贝到/usr/bin目录下,但是mac这个文件夹权限不开放,不管用什么命令都无法将文件拷到这个目录下,可以/usr/local/bin用这个路径代替/usr/bin路径 因为会先从/usr/local/bin目录加载 然后再加载/usr/bin目录)
sudo cp /Volumes/class-dump-3.5/class-dump /usr/local/bin
在终端中输入class-dump,显示class-dump的版本后,就可以正常使用class-dump的命令了,如果没显示,赋予一下权限
sudo chmod 777 /usr/bin/class-dump
class_dump使用(class-dump只能导出未经加密的App的头文件)
得到class-dump的可执行文件以后,就可以导出应用的类的头文件了
命令如下:
class-dump -H 砸壳后文件 -o headers存放目录
例子:看下SpringBoard的头文件
iPhone:/tmp root# ps -e | grep SpringBoard
1739 ?? 10:14.78 /System/Library/CoreServices/SpringBoard.app/SpringBoard
2586 ttys000 0:00.01 grep SpringBoard
iPhone:/tmp root# scp /System/Library/CoreServices/SpringBoard.app/SpringBoard zl@192.168.0.102:/Users/zl/Desktop/test
//mac终端 将头文件保存在test文件夹下面
class-dump -s -S -H SpringBoard -o ./test
以下是 class-dump参数含义,终端里输入class-dump就可以看到
-a 显示实例变量偏移
-A 显示实现地址
–arch选择一个指定的架构,如ppc, ppc7400, ppc64, i386, x86_64
-C只显示同正则表达式匹配的类
-f在方法名中查找字符串
-H 在当前目录生成头文件,或者在用-o选项指定的目录生成
-I 对类,目录,协议 按照继承关系(inheritance)进行排序(覆盖-s选项)
-o为-H选项指定输出目录
-r 递归扩展framework,并修复VM共享库
-s 按名称对classes和categories进行排序
-S 按名称对方法(method)进行排序
dumpdecrypted砸壳
- 安装
mkdir Code
cd Code/
git clone https://github.com/stefanesser/dumpdecrypted.git
cd dumpdecrypted/
make
上面的make命令执行完毕后,会在当前目录下生成一个dumpdecrypted.dylib文件,这就是砸壳所要用到的。该文件生成一次可重复使用。
- 砸壳过程
//定位要砸壳的App的Document目录
iPhone:/ root# cycript -p WeChat
cy# [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/DCAB7824-7EF6-4F18-813B-39E52FDC2CA7/Documents/"
//退出cycript 去到Documents目录
cy#
iPhone:/ root# cd /var/mobile/Containers/Data/Application/DCAB7824-7EF6-4F18-813B-39E52FDC2CA7/Documents/
//将dumpdecrypted.dylib拷贝到当前目录
iPhone:/var/mobile/Containers/Data/Application/DCAB7824-7EF6-4F18-813B-39E52FDC2CA7/Documents root# scp zl@192.168.0.102:/Users/zl/Desktop/dumpdecrypted/dumpdecrypted.dylib .
//获取可执行文件路径
iPhone:/var/mobile/Containers/Data/Application/DCAB7824-7EF6-4F18-813B-39E52FDC2CA7/Documents root# ps -e | grep WeChat
//开始砸壳
iPhone:/var/mobile/Containers/Data/Application/DCAB7824-7EF6-4F18-813B-39E52FDC2CA7/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/008FD01E-9421-40B7-A511-FCC23D175C3A/WeChat.app/WeChat
//结束后在documents里面看到WeChat.decrypted,将该文件拷贝到桌面
iPhone:/var/mobile/Containers/Data/Application/DCAB7824-7EF6-4F18-813B-39E52FDC2CA7/Documents root# scp WeChat.decrypted zl@192.168.0.102:/Users/zl/Desktop/test
// 来到mac终端用class-dump获取.h文件
cd /Users/zl/Desktop/test
class-dump -s -S -H WeChat.decrypted -o ./decrypetfile
补充
StoreApp对沙盒以外的绝大多数目录没有写权限。dumpdecrypted.dylib要写一个decrypted文件,但它是运行在StoreApp中的,与StoreApp的权限相同,那么它的写操作就必须发生在StoreApp拥有写权限的路径下才能成功。StoreApp一定是能写入其Documents目录的,因此我们在Documents目录下使用dumpdecrypted.dylib时,保证它能在当前目录下写一个decrypted文件,这就是把dumpdecrypted.dylib拷贝到Documents目录下操作的原因。