我们一般分析别人的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保留没有替换的部分。
-
-










