我们一般分析别人的App都是分析砸过壳的AppiOS砸壳,一般会借助三方工具来砸壳,那么如果三方工具失效了呢?这个时候就需要我们自己砸壳了。在了解了砸壳原理后这个就很好理解了。虽然手动有点麻烦,但还是能实现的。
一、导出app包。
1.1 查找app目录
zaizai:~ root# ps -A | grep WeChat
26736 ??         0:03.08 /var/containers/Bundle/Application/8F382114-BBA7-4D81-AA3E-3CD02E03E23E/WeChat.app/WeChat
26742 ttys000    0:00.01 grep WeChat
1.2 拷贝app包
scp -r -P 12345  root@localhost:/var/containers/Bundle/Application/8F382114-BBA7-4D81-AA3E-3CD02E03E23E/WeChat.app ./
这样就获得了加密的app包。
otool -l WeChat  | grep crypt
     cryptoff 6565888
    cryptsize 4096
      cryptid 1
对应信息查看:

- 
cryptoff:加密开始偏移。
- 
cryptsize:加密数据大小。
- 
cryptid:加密标记。
二、lldb砸壳
砸壳实际上就是从内存中拷贝出解密的数据。
2.1从内存中拷贝加密数据(内存中是解密的)
1.直接用Xcode附加微信进程。
2.imag list找到ASLR+PAGEZERO(0x0000000104500000):
(lldb) image list
[  0] EB606691-98E6-384F-BABB-F46E7BC265F9 0x0000000104500000 /private/var/containers/Bundle/Application/8F382114-BBA7-4D81-AA3E-3CD02E03E23E/WeChat.app/WeChat (0x0000000104500000)
3.拷贝数据
memory read --force --outfile 输出文件 --binary --count 文件大小(cryptsize) 起始位置
(lldb) memory read --force --outfile ~/Desktop/WeChatDump/WeChat.bin --binary --count 4096  0x0000000104500000+6565888
4096 bytes written to '/Users/zaizai/Desktop/WeChatDump/WeChat.bin'
- 
memory read --force:按字节读取。
- 
--outfile:输出文件路径。
- 
--binary:输出格式,二进制。
- 
--count:要拷贝的数据大小cryptsize。
- 
MachO首地址+cryptoff:找到内存中的起始位置。
这样我们就拷贝到了解密后的数据WeChat.bin了。
2.2 用解密后的数据替换原加密数据
dd seek=6565888 bs=1 conv=notrunc if=./WeChat.bin of=WeChat
- 
seek:从输入文件跳过所少开始写入。offset。
- 
bs:一次写入多少字节。
- 
conv:指令参数传递文件。notrunc表示不截断。(写完后WeChat后面的内容不截段)
- 
if:输入的文件。
- 
of:输出的文件。
接着用MachOView修改cryptid为0:

直接在
Load Commands->LC_ENCRYPTION_64中找到Crypt ID修改Data为0。
2.3 验证
2.3.1 class-dump验证
直接class-dump头文件:
class-dump -H WeChat -o ./WeChat_Headers
发现能直接dump成功了;

没有砸壳的应用是
dump不成功地。
2.3.2 重签名验证
接着用咋过壳的WeChat替换WeChat.app中的WeChat然后用Monkey重签名运行(当然.app也可以打包成.ipa)。

重签名验证也没问题。
总结
- 
LLDB手动脱壳- 
memory read命令- 通过--outfile参数导出文件。
- 
--count指定导出文件大小。
 
- 通过
- 
dd命令写入原文件- 
seek指定偏移。(跳过多少开始写入)
- 
conv保留没有替换的部分。
 
- 
 
- 










