LLDB 手动脱壳

我们一般分析别人的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

对应信息查看:


image.png
  • cryptoff:加密开始偏移。
  • cryptsize:加密数据大小。
  • cryptid:加密标记。

cryptid仅仅是一个标记,修改是这个无效的。
cryptsize与系统版本有关iOS14上线数据很小。

二、lldb砸壳

砸壳实际上就是从内存中拷贝出解密的数据。

2.1从内存中拷贝加密数据(内存中是解密的)

1.直接用Xcode附加微信进程。
2.imag list找到ASLR+PAGEZERO0x0000000104500000):

(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修改cryptid0

image.png

直接在Load Commands->LC_ENCRYPTION_64中找到Crypt ID修改Data0

⚠️拷贝和写入时间与电脑性能和数据大小有关,需要耐心等待。

2.3 验证

2.3.1 class-dump验证

直接class-dump头文件:

class-dump -H WeChat -o ./WeChat_Headers

发现能直接dump成功了;

image.png

没有砸壳的应用是dump不成功地。

2.3.2 重签名验证

接着用咋过壳的WeChat替换WeChat.app中的WeChat然后用Monkey重签名运行(当然.app也可以打包成.ipa)。

image.png

重签名验证也没问题。

总结

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

你可能感兴趣的:(LLDB 手动脱壳)