逆向工具集和安装和使用
iOS逆向工程的工具大致可分为四类:
- 检测工具 如:Reveal、tcpdump等
- 反编译工具(反汇编工具 - 分析二进制文件并得到一些信息) 如:IDA、Hopper Disassembler、classdump等
- 调试工具 如:lldb、Cycript等
- 开发工具 如:Xcode、theos等
1 、classdump介绍
class-dump是用来dump目标文件的类信息的工具。它利用Objective-C语言的runtime的特性,将存储在mach-O文件中的@interface和@protocol信息提取出来,并生成对应的.h文件。
注:class-dump只能导出未经加密的App的头文件。classdump是对"otool -ov" 信息的翻译,以一种我们熟悉的易读的方式呈现,官方介绍如下:
This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files. It generates declarations for the classes, categories and protocols. This is the same information provided by using ‘otool -ov’, but presented as normal Objective-C declarations, so it is much more compact and readable.
classdump官网地址
打开链接后,选择class-dump-3.5.dmg,进行下载。下载完成之后,将dmg文件中的class-dump复制到/usr/bin目录,并在终端执行如下执行进行赋权:
sudo chmod 777 /usr/bin/class-dump
复制代码
然后运行class-dump指令,即可看到如下结果:
class-dump的简单使用
class-dump -H /Applications/Calculator.app -o /Users/GofLee/Desktop/CalculateHeads
复制代码
【说明】
- /Applications/Calculator.app:计算器app的路径;
- /Users/GofLee/Desktop/CalculateHeads:存放dump结果的头文件文件夹路径。
- 执行上面的指令之后,我们可以在
- /Users/GofLee/Desktop/CalculateHeads 目录下看到生成的.h列表
从上面的结果可以看到,我们有了这些.h文件之后,就可以初步了解目标App的程序结构。后面可以结合Reveal和cycript工具,更精准的分析目标App某个页面的功能实现。 同样的,我们也可以导出AppKit、UIKit的头文件:
class-dump -H /System/Library/Frameworks/AppKit.framework -o /Users/GofLee/Desktop/AppKitHeaders
复制代码
【注意】:有时class-dump指令会执行失败,无法得到想要的头文件,或头文件的内容是加密的密文。出现这种情况是因为class-dump的作用对象必须是未经加密的可执行文件,一般App Store中下载的App都是经过签名加密的,这个时候需要先进行砸壳。
class-dump-z 下载地址
class-dump-z 是对 class-dump 和 class-dump-x 的改进版,完全用C++重写,避免动态调用,这使得 class-dump-z 比 class-dump 和 class-dump-x快10倍左右,并且可以在 Linux、Mac、 iPhone 上运行。
dumpdecrypted 砸壳工具
dumpdecrypted地址
cd到 dumpdecrypted的目录下,然后运行如下命令
make //make之后会生成dumpdecrypted.dylib动态库文件
然后将该动态库文件拷贝到手机的tmp文件的目录下
复制代码
- 定位要砸壳的StoreApp的执行文件名字TargetApp (ps -e 可以得到全路径)
- 定位要砸壳的StoreApp的Document目录:
cycript -p TargetApp [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
复制代码
- 得到路径:
#"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/"
复制代码
- 进入Document目录:
cd /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
复制代码
- 拷贝dumpdecrypted.dylib:
注意:作如下操作之前你如要使用scp将dumpdecrypted.dylib文件提前拷贝到手机
scp dumpdecrypted.dylib . DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
复制代码
获取沙盒路径的方式
ps -e | grep WeChat //找到微信的进程 app路径
cycript -p WeChat //在进程中开启cycript
dir = NSHomeDirectory() //获取沙盒路径
control +D 关闭cycript
复制代码
- 获取沙盒路径之后 进入沙盒路径的Documents的路径之下 以上的具体操作如下
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB root# ls
Documents/ Library/ tmp/
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB root# cd Documents/
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/ MMResourceMgr/ app_tutt/
079d66db896f66ef28a7e029c2eff367/ MMappedKV/ heavy_user_id_mapping.dat
CrashReport/ MemoryStat/ mmupdateinfo.archive
LocalInfo.lst OpenImResource/
LoginInfo2.dat SafeMode.dat
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# cp /tmp/dumpdecrypted.dylib . //这一步需要提前将dumpdecrypted.dylib文件拷贝到手机的/tmp文件夹下
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/ MMResourceMgr/ app_tutt/
079d66db896f66ef28a7e029c2eff367/ MMappedKV/ dumpdecrypted.dylib*
CrashReport/ MemoryStat/ heavy_user_id_mapping.dat
LocalInfo.lst OpenImResource/ mmupdateinfo.archive
LoginInfo2.dat SafeMode.dat
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root#
复制代码
- 使用如下命令进行 获取解密后程序
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/E736B0BC-7ED4-42CE-8513-CE52F88F5F52/WeChat.app/WeChat
复制代码
如果以上命令运行完成之后报如下错误 表示dumpdecrypted.dylib 没有进行签名 需要先进行签名
dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find:
dumpdecrypted.dylib: required code signature missing for 'dumpdecrypted.dylib'
/private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib: required code signature missing for '/private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib'
Abort trap: 6
复制代码
- 签名:
ldid -S /private/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents/dumpdecrypted.dylib
复制代码
- 签名过后再次使用如下命令
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/E736B0BC-7ED4-42CE-8513-CE52F88F5F52/WeChat.app/WeChat
复制代码
ls 后的目录结构 ,其中WeChat.decrypted是解密后的文件
9-A7B1-AA3B8FD268CB/Documents root# ls
00000000000000000000000000000000/ MMResourceMgr/ WeChat.decrypted
079d66db896f66ef28a7e029c2eff367/ MMappedKV/ app_tutt/
CrashReport/ MemoryStat/ dumpdecrypted.dylib*
LocalInfo.lst OpenImResource/ heavy_user_id_mapping.dat
LoginInfo2.dat SafeMode.dat mmupdateinfo.archive
Administratorde-iPhone:/var/mobile/Containers/Data/Application/D9C10BA1-C3D7-4859-A7B1-AA3B8FD268CB/Documents root#
复制代码
//将解密后的文件拷贝到mac
scp WeChat.decrypted [email protected]:/tmp
复制代码
注意:当砸壳完毕后,使用 class-dump 仍然只导出 CDStructures.h 一个文件,则可能架构选择错误;因为 dumpdecrypted 只会砸你手机处理器对应的那个壳,fat binary 的其它部分仍然是有壳的,而 class-dump 的默认目标又不是被砸壳的那个部分,因此很有可能就会报错;
class-dump -s —arch armv7 -S -H WeChat.decrypted -o ./WCHeaderscd
复制代码
- 完成之后的头文件如下