"砸壳"在iOS逆向工程中是经常做的一件事情,,因为从AppStore直接下载安装的App是加壳的,其实就是经过加密的,这个“砸壳”的过程就是一个解密的过程。
本文以微信为例。
一、生成dumpdecrypted.dylib动态库
首先我们要生成“砸壳”用的动态库dumpdecrypted.dylib,我们“砸壳”时主要用到这个动态库。该动态库的源码在github上是开源的,要想得到dumpdecrypted.dylib这个动态库,只需要从github上下载代码,然后进行编译,生成dumpdecrypted.dylib即可。
使用make命令对dumpdecrypted的源码进行编译。
编译完成后,dumpdecrypted文件夹中就会多一个dumpdecrypted.dylib动态库,该动态库就是稍后我们砸壳使用的工具。
二、“砸壳”前的准备工作
-
用iExplorer打开手机文件,将dumpdecrypted.dylib拖到微信Document中。
2.获取到微信Document路径。
很多文章都说用cycript获取,但是我发现用find也能方便取到。
find /var/mobile/Containers/Data/Application/ -name dumpdecrypted.dylib
将这个路径存好(砸壳时用)
前提是只有这个应用有dumpdecrypted.dylib,否则分辨不出哪个是微信的。。。
- 获取到应用名称
手机打开微信,ssh连到手机中,用以下命令获取微信应用名称
ps -e | grep /var/mobile
如果找不到ps命令,在手机Cydia中搜索adv-cmds 安装。
adv-cmds #finger,fingerd,last,lsvfs,md,ps
basic-cmds #msg,uudecode,uuencode,write
bc #计算器工具
cURL #就是curl了
Diff Utilities #diff
diskdev-cmds #mount,quota,fsck等,忘记是否默认安装的
file #常用的file命令
file-cmds #chflags,compress
Find Utilites #find
Gawk #awk
grep #grep
inetutils #ftp,inetd,ping,telnet…
less #less
结果如图,名称WeChat(砸壳时用)
三、开始砸壳
上述“砸壳”的准备工作就绪后,接下来我们就要开始砸壳了。进入到WeChat的Document目录中,执行下方的命令进行砸壳。
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/5897759F-D179-4194-AAF1-E0726F7DD147/WeChat.app/WeChat
在上述命令中,DYLD_INSERT_LIBRARIES后边这个动态库就是我们上面生成的动态库,后边这个路径就是WeChat执行文件的绝对路径,运行上述命令后,就开始砸壳了,下方截图就是我们砸壳的过程。
砸壳过程完成后,会在我们的Document目录下生成一个WeChat.decrypted文件,如下截图所示。该文件就是脱壳后的文件,我们可以将该文件拷贝到我们的Mac上,以备使用。
拷贝可参考
http://www.jianshu.com/p/6a5c8c685d2c
四、导出脱壳App的头文件
将上面生成的WeChat.decrypted脱壳文件拷贝的我们的Mac上,接下来就是我们class-dump出场的时刻了。接下来我们要使用class-dump导出该脱壳文件的所有头文件。具体步骤如下所示。
- 导出头文件
class-dump --arch armv7 -S -s -H WeChat.decrypted -o ./Headers
就不贴图了。。。
ps : 后来砸了一个自己的项目,swift和oc混编的,发现这步不成功:
Error: Cannot find offset for address 0xc8002a76 in stringAtAddress:
度娘说是class-dump解不出swift
五、Hopper
上面使用了class-dump来操作我们脱壳的文件,木有问题。那么接下来来看一下在Hopper上的效果如何,下方就是使用Hopper打开“脱壳”文件的效果,汇编语言的,慢慢研究吧。。。
最后,非常感谢青玉伏案,这篇文章也拷贝了不少他的文章,链接附在了推荐阅读中。