前言
接触 iOS 安全的同学们对越狱、砸壳、Cydia、Theos等名词应该都不陌生,用一句话总结网上文章对砸壳原理的解释:AppStore 发布的 App 都是加壳(加密)后的 ipa 文件,逆向App就得先砸壳,在iOS系统中,应用砸壳所使用的都是动态砸壳技术,即从运行在进程内存空间中的可执行程序映像(image)入手,将内存中的内容进行转储(dump)处理来实现脱壳处理。这种方法实现起来相对简单,且不必关心使用的是何种加密技术。
准备
越狱 https://checkra.in/ Cydia工具安装 OpenSSH Darwin cc tools 下载App 在 AppStore 随便找个App
AppStore下载的App在/var/containers/Bundle/Application/$uuid 目录下,找到刚才下载的App,通过查看cryptid标志位来判断App加密状态。其中1代表加密,0代表已解密:
$ otool -lv /var/containers/Bundle/Application/xxxxx-xxxx-xxxx-xxxx-xxxxx/Foo.app/Foo | egrep 'LC_ENCRYPTION_INFO|cryptid' cmd LC_ENCRYPTION_INFO_64 cryptid 1
如果App没有被加密,则直接交给dyld加载并且运行。如果App已经被加密,则需要内核对其进行解密,得到解密后的MachO文件,再将其交给dyld加载并运行。
再把加密 macho down 下来用 MachOView 打开看到Load Commands 中有LC_ENCRYPTION_INFO 的CryptID 为 1 和上面otool命令查看的内容一致:
Hopper 打开找到入口,会提示这是个加密文件:
接下来就是对 App 进行砸壳,目前常见的砸壳工具如下:
Clutch dumpdecrypted frida-ios-dump
初代砸壳工具
先从初代砸壳工具 stefanesser-dumpdecrypted 的源码探究一下砸壳如何实现的。
从运行命令 $ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/xxx-xxxx-xxxx/Scan.app/Scan 看出这是利用注入动态库的方式,__attribute__((constructor)) 是GCC 语法,当与函数一起使用时,会在程序启动时在main函数之前执行该函数:
__attribute__((constructor))void dumptofile(int argc, const char **argv, const char **envp, const char **apple, struct ProgramVars *pvars)
这段代码不解的是:如何给 ProgramVars 结构体赋值的?(
还没有评论,来说两句吧...