LLDB 手动脱壳

时间:2021-7-9 作者:qvyue

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

对应信息查看:

LLDB 手动脱壳
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

LLDB 手动脱壳
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成功了;

LLDB 手动脱壳
image.png

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

2.3.2 重签名验证

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

LLDB 手动脱壳
image.png

重签名验证也没问题。

总结

  • LLDB手动脱壳

    • memory read命令

      • 通过--outfile参数导出文件。
      • --count指定导出文件大小。
    • dd命令写入原文件

      • seek指定偏移。(跳过多少开始写入)
      • conv保留没有替换的部分。
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。