认识加壳脱壳
加壳
加壳就是利用特殊的算法,对执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。
我们通过开发者账号将 APP 上传到 App Store,苹果会对我们的 APP 的可执行文件进行加壳操作。
脱壳
脱壳就是摘掉壳程序,将未加密的可执行文件还原出来(也称砸壳)。
脱壳主要有2种方法:硬脱壳、动态脱壳。
如何验证可执行文件是否加壳
可以通过 otool
命令或者 MachOView
工具来查看 LC_ENCRYPTION_INFO_XX
中的 Crypt ID
的值,这个值表示使用了哪种加壳算法。如果为 0 ,表示未加壳,我这个可执行文件是从 App Store 下载安装的,显示 1 。
使用 otool 命令:
otool -l Aweme | grep crypt
cryptoff 16384
cryptsize 4096
cryptid 1
或者使用 MachOView 工具:
iOS中的脱壳工具
flexdecrypt
下载最新的 release 版本的可执行文件,并导入手机 /usr/bin
目录下。
下载地址:https://github.com/JohnCoates/flexdecrypt
通过 SSH 登录我们的手机,执行 flexdecrypt
命令:
iPhone-X:~ root# flexdecrypt
-sh: /usr/bin/flexdecrypt: Permission denied
如果提示没有权限,则给文件添加执行权限:
chmod +x /usr/bin/flexdecrypt
再次执行 flexdecrypt 命令,显示以下内容则安装成功:
iPhone-X:~ root# flexdecrypt
Error: Missing expected argument '<file>'
OVERVIEW: A tool for decrypting apps and Mach-O binaries. Based on the Flex 3
jailbreak app's source code.
USAGE: flex-decrypt <subcommand>
OPTIONS:
--version Show the version.
-h, --help Show help information.
SUBCOMMANDS:
file (default) Decrypt file.
See 'flex-decrypt help <subcommand>' for detailed help.
通过 ps 命令列出正在运行的进程,找到我们想要脱壳的 APP,比如我们这里要脱壳微信:
iPhone-X:~ root# ps -A
PID TTY TIME CMD
33225 ?? 0:00.51 /var/containers/Bundle/Application/545F8F3E-DFC3-4AC3-A2E5-7F112ED4D5CD/WeChat.app/WeChat
32841 ttys000 0:00.25 -sh
33226 ttys000 0:00.01 ps -A
对微信 APP 进行脱壳操作,成功则可以得到脱壳后的可执行文件的路径:
iPhone-X:~ root# flexdecrypt /var/containers/Bundle/Application/545F8F3E-DFC3-4AC3-A2E5-7F112ED4D5CD/WeChat.app/WeChat
Wrote decrypted image to /tmp/WeChat
查看脱壳后的可执行文件的 cryptid
,则可验证脱壳成功:
otool -l Wechat | grep crypt
cryptoff 16384
cryptsize 178356224
cryptid 0
MJAppTools命令行工具
处理 iOS APP 信息的命令行工具,可以方便的列出和搜索手机上的 APP 的信息,包括:
- 应用名称
- Bundle Identifier
- Bundle URL(Main Bundle)
- Data URL(Sandbox)
- 架构信息(Architecture)
- 架构名称(Architecture Name)
- 加壳信息(Cryptid)