我们一般分析别人的App
都是分析砸过壳的App
iOS砸壳,一般会借助三方工具来砸壳,那么如果三方工具失效了呢?这个时候就需要我们自己砸壳了。在了解了砸壳原理后这个就很好理解了。虽然手动有点麻烦,但还是能实现的。
一、导出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
对应信息查看:
image.png
-
cryptoff
:加密开始偏移。 -
cryptsize
:加密数据大小。 -
cryptid
:加密标记。
cryptid
仅仅是一个标记,修改是这个无效的。
cryptsize
与系统版本有关iOS14
上线数据很小。
二、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
了。
这里不拷贝全部数据是因为
data
段数据可能在运行的过程中被改变了。
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
保留没有替换的部分。
-
-
网友评论