测试机一直是5s和6,Clutch敲壳,实际是一个内存dump的过程,所以每次敲壳后的程序载入IDA都不能开心的F5来查看交叉引用以及简要逻辑。
终于决定要搞下这个坑,发现竟然并不是太简单的事情,或许还是IOS的相关知识掌握的不多。
首先,我们查找到lipo这个东西。lipo是command-tools里面的工具,之前或许是随着xcode一起下发的,貌似某个6.x的版本之后,就独立了出来,需要单独下载。
xcode-select --install
此处也是一个坑,为了文件交换的方便,我使用的是一个9.8的mac虚拟机,里面的xcode也是很早期的了,所以lipo -info查看fat文件时,并没有显示出arm64的结构。
lipo工具可以合并也可以拆分,这里我们需要的是拆分功能。
lipo xxx -thin armv7 -output xxx.armv7
thin功能,可以可以拿到一个只包含armv7的版本,这样重新替换原有app,就可以以32位方式进行运行,进行内存dump后,也就拿到了32位程序,看起来好像很简单。
然后替换后的程序是不可以执行的,查看crash信息,内存错误,无法执行。
中间的插曲是我自己xcode写了一个demo,去测试只包含armv7架构的程序在iphone5S上面的运行,发现是编译无法通过,在build setting中还有一个问题。
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)
在5S以后,App store的审核已经不允许不包含64位架构的程序上架了,但是貌似不应该不支持编译出来自己测试是不是呢?然而换5,不更改项目属性的前提下,直接编译运行成功,就是说xcode根本不让32位程序运行在64位上?
设置”Build Active Architecture Only”为“NO”
这里这个选项是说,是否只编译唯一的架构。理论上来说,这里因为我只想编译出armv7的版本,特意设置yes。
剧情跟我们想的不一样,设置为NO以后,5S成功运行,导出文件lipo info后却发现,程序的确只包含了armV7,跟我们想要的结果是一样的,所以这个选项到底想做什么,不能懂了,至少证明了32位app是可以运行在64位系统的了,至此,问题还没解决,已经用掉我一天的时间。
lipo不能运行,自己祭出010editor自己修改试试吧,需要做的只是告诉系统,我是一个32位程序,我身上并没有打包arm64代码。理论上可以做到,不过我尝试无数次之后,或许还是对于mach-o文件格式不够精通吧,毕竟只局限于知道结构大概。
仅仅靠与自己的测试demo对比的情况下,头部修改一样,并且offset也无异常的情况下,程序依然是crash。这里就不贴图了,依然是消耗掉大量时间。
痛定思痛,重新回头看lipo,发现lipo带有一个remove参数
lipo xxx -remove arm64 -output xxx.remove
导入替换,程序成功运行!
上面两图中,一个thin一个remove,thin是只包含,remove是只移除,对于只有armv7和arm64的程序来说,只包含一个与只移除另一个的结果貌似应该是一样的,然而结果的确有点出乎意料,thin后的程序是少了一个头的。
虽然可以运行了,事情还没有结束,clutch无法敲壳!
看clutch日志,貌似他还是在以64的方式在dump,看得到吃不着的感觉的确酸爽,难道去改clutch的代码强制32dump?貌似时间不允许了,看懂代码找到关键点修改好不知道要多久。重新找敲壳工具。
https://github.com/stefanesser/dumpdecrypted
下载后直接make,生成dumpdecrypted.dylib,此文件要放入需要敲壳的app的Documents目录。这里也有小技巧,因为人肉查找这个目录是在是个体力活。
#cycript -p pid #[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
导入成功后,到documents目录,执行敲壳
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
成功解出,欢快的F5之~
PS:每次替换文件记得修改权限。
chmod 755 xxx
中间遇到的小坑实在令人发指,期间有些问题问到很多群里,冷嘲热讽,浪费很多时间,被我怒喷一记,话说实在不懂这些不能解决根本问题的人,在一个QQ群里刷出的什么存在感。