iOS小技能:砸壳(利用dumpdecrypted进行app脱壳)

2,451 阅读5分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

前言

  • 加壳

利用特殊的算法,改变EXE可执行程序或者DLL动态连接库文件的编码(比如实现压缩、加密),以达到缩小文件体积或者加密程序编码,甚至是躲过杀毒软件查杀的目的。目前较常用的壳有UPX、ASPack、PePack、PECompact和UPack等。

  • 砸壳原理

其中用到的砸壳工具就是dumpdecrypted,其原理是让app预先加载一个解密的dumpdecrypted.dylib,然后在程序运行后,将代码动态解密,最后在内存中dump出来整个程序。

iPhone:~ root# DYLD_INSERT_LIBRARIES=/var/mobile/Containers/Data/Application/3A5D7F67-04E8-49CF-93CF-5019B11146D6/Documents/dumpdecrypted.dylib  /var/mobile/Containers/Bundle/Application/01ECB9D1-858D-4BC6-90CE-922942460859/WeChat.app/WeChat

先用dumpdecrypted工具先对加过密的ipa包进行砸壳,然后再用class-dump工具去导出它的头文件。

  • 砸壳的步骤:

1、找到app二进制文件对应的目录; 2、找到app document对应的目录; 3、将砸壳工具dumpdecrypt.dylib拷贝到ducument目录下; //目的是为了获取写的权限 4、砸壳; 利用环境变量 DYLD_INSERT_LIBRARY 来添加动态库dumpdecrypted.dylib 接下来要正式的dump可执行文件。

I 砸壳的准备工作

blog.csdn.net/z929118967/…

 ssh 'root@192.168.2.212'

Host   : hostName的别名
HostName: 是目标主机的主机名,也就是平时我们使用ssh后面跟的地址名称。
Port:指定的端口号。
User:指定的登陆用户名。
IdentifyFile:指定的私钥地址。

———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/… 在这里插入图片描述

1.1 查找二进制文件对应的目录


iPhone:~ root# ps -e |grep WeChat
  405 ??         0:01.72 /var/mobile/Containers/Bundle/Application/E2B26C47-B989-492B-995C-47EFFA94DAB3/WeChat.app/WeChat
36068 ttys000    0:00.00 grep WeChat

或者

iPhone:~ root#  ps -e | grep /var/mobile
 7691 ??        13:22.82 /var/mobile/Containers/Bundle/Application/01ECB9D1-858D-4BC6-90CE-922942460859/WeChat.app/WeChat
 7836 ttys000    0:00.01 grep /var/mobile

因为从AppStore中下载安装的应用都会位于/var/mobile/..Applications中,

1.2 查找app document对应的目录

使用Cycript注入目标进程中

iPhone:~ root# cycript -p WeChat
cy# NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]
@"/var/mobile/Containers/Data/Application/91E7D6CF-A3D3-435B-849D-31BB53ED185B/Documents"

或者使用:

iPhone:~ root# cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/3A5D7F67-04E8-49CF-93CF-5019B11146D6/Documents/"

1.3 dumpdecrypted

  • dumpdecrypted.dylib 的获取

dumpdecrypted

devzkndeMacBook-Pro:dumpdecrypted-master devzkn$ ls
Makefile	README		dumpdecrypted.c
devzkndeMacBook-Pro:dumpdecrypted-master devzkn$ make
`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c 
`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -dynamiclib -o dumpdecrypted.dylib dumpdecrypted.o
devzkndeMacBook-Pro:dumpdecrypted-master devzkn$ ls -a
.			README			dumpdecrypted.o
..			dumpdecrypted.c
Makefile		dumpdecrypted.dylib

使用SCP 拷贝文件到iOS设备对应的目录

devzkndeMacBook-Pro:dumpdecrypted-master devzkn$ scp ./dumpdecrypted.dylib root@192.168.2.212://var/mobile/Containers/Data/Application/91E7D6CF-A3D3-435B-849D-31BB53ED185B/Documents
root@192.168.2.212's password: 
dumpdecrypted.dylib                                                                                                                                    100%  193KB  64.0KB/s   00:03    
devzkndeMacBook-Pro:dumpdecrypted-master devzkn$ 

II 砸壳

  • 利用环境变量 DYLD_INSERT_LIBRARY 来添加动态库dumpdecrypted.dylib
DYLD_INSERT_LIBRARIES=/PathFrom/dumpdecrypted.dylib /PathTo

第一个path为dylib,目标path 为app二进制文件对应的目录

iPhone:~/Documents root# DYLD_INSERT_LIBRARIES=/var/mobile/Containers/Data/Application/91E7D6CF-A3D3-435B-849D-31BB53ED185B/Documents/dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/E2B26C47-B989-492B-995C-47EFFA94DAB3/WeChat.app/WeChat
mach-o decryption dumper

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 64bit ARM binary in memory.
[+] offset to cryptid found: @0x100030ca8(from 0x100030000) = ca8
[+] Found encrypted data at address 00004000 of length 56770560 bytes - type 1.
[+] Opening /private/var/mobile/Containers/Bundle/Application/E2B26C47-B989-492B-995C-47EFFA94DAB3/WeChat.app/WeChat for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 62078976 in the file
[+] Opening WeChat.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 3b34ca8
[+] Closing original file
[+] Closing dump file
iPhone:~/Documents root# ls -a
.  ..  WeChat.decrypted  baiduplist  cfg  vmp

当前目录下会生成砸壳后的文件,即WeChat.decrypted

III 用scp命令把WeChat.decrypted文件拷贝到mac

  • 用scp命令把WeChat.decrypted文件拷贝到电脑上,接下来我们要正式的dump、Hopper微信的可执行文件
devzkndeMacBook-Pro:dumpdecrypted-master devzkn$ scp root@192.168.2.212:/var/root/Documents/WeChat.decrypted  /Users/devzkn/Downloads/dumpdecrypted-master
root@192.168.2.212's password: 
WeChat.decrypted                                                                                                                                                                  10%   13MB   1.5MB/s   01:17 ETA^WeChat.decrypted                                                                                                                                             WeChat.decrypted  WeChat.dWeChat.decrypted                                                                                                                                                    52%   67MB   1.2MB/s   00:52 ETA

如果没找到文件,就继续执行一次

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/01ECB9D1-858D-4BC6-90CE-922942460859/WeChat.app/WeChat

IV 常见问题

4.1 架构不匹配的时候报:mach-o, but wrong architecture

解决方案: 获取不同架构的二进制文件进行合并

  1. 使用KNdumpdecryptedTweak获取不同架构的二进制文件

github.com/zhangkn/KNd…

  1. 使用lipo -create进行合并
lipo -create ./WeChat /Users/devzkn/decrypted/wx6.7.0/WeChat.decrypted -output ./WeChat

4.2 如果遇到做了越狱检测的APP,那么该怎么办?

(现在最流行的frida动态砸壳方法及本文的dumpdecrypted包括Clutch都行不通了)

方案:可使用LLDB脱壳工具git clone https://github.com/4ch12dy/xia0LLDB.git

It highly recommend you to install issh/Tap2debug bypass anti-debug: can hook ptrace and inlinehook svc to kill anti debug. it is so strong ever!!! dump macho image in lldb, default dump all macho image. 后台模式启动并砸壳: if app crash at launch like detect jailbreak, you should use -x backboard launch app, and just input dumpdecrypted -X see more: 4ch12dy.site/2020/02/26/…

debugserver -x backboard 127.0.0.1:2345 /var/containers/Bundle/Application/XXXXX
lldb
process connect connect://localhost:2345
dumpdecrypted -X

see also: 内存数据的在iOS逆向与安全中的应用

1、病毒查杀对抗:需要获取查杀对象的内存数据进行和病毒库的特征做比对。 2、应用安全对抗:需要保护自身的内存数据不被转存。 3、静态逆向应用:遇到应用程序加密保护时,IDA就歇菜了,此时获取解密后内存数据就非常重要。dumpdecrypted 就是在程序运行后,让系统将代码动态解密之后,在内存中dump出来整个程序 4、动态逆向应用:用ollydbg/cycript进行动态调试应用主要还是调试运行时释放的内存数据。

help.apple.com/app-store-c…