打探一款app的内部实现
type
status
date
slug
summary
tags
category
icon
password
相信每一名开发人员对于一款优秀产品的内部实现都会很好奇,而且现在app越来越多,竞品也是越来越多,我们对于其他app的内部实现方式的研究也越来越重要,会想知道某个核心功能使用了哪些第三方服务、数据库是如何设计的、沙盒目录结构是什么样的,某一个UI效果是如何实现的等。最近这两天我对这方面做了一些探索,之后还会慢慢深入研究。
目标
- 查看app的资源文件以及使用的SDK
- 查看app的.h文件
- 查看app使用的第三方库
- 查看app的界面结构
环境
- macOS High Sierra 10.13.4
- reveal 14以及他的“钥匙”(密码: uyp7) 。
- Apple Configurator 2 (apple stroe可下载)
- pp助手或者其他越狱app市场
- 越狱手机一台
以上条件非必要条件,有很多实现我们目标的方式,可以先看下面的内容然后根据自己的需要再去选择的下载。
一、查看app的资源文件以及使用的SDK
不记得从什么时候开始,iTunes没有应用商店了,从此很长的一段时间,我都没有找到一种方式拿到想要应用的ipa的包,直到在谷歌上看到一种利用 Apple Configurator 2拿到ipa包的技巧。
- 首先在apple store里面搜索下载Apple Configurator 2。
- 连接iphone(不需要越狱)。
- 登录apple ID,登录的apple ID需要曾经下载过该app,不然搜索不到。
- 选择手机,手机里面需要已经安装上了该app,然后点击添加应用。
- 从应用列表中选择需要获取ipa包的应用。
- 然后就会开始下载,因为手机上已经存在该应用,所以会提示是否替换,此时不需要点击任何按钮,我们进行下一步操作。
- 打开finder,前往
~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/
该路径就可以看到ipa文件了。
- 然后我们可以把ipa文件复制出来,Apple Configurator 2可以选择停止,然后修改ipa后缀为zip,解压。
- 打开文件夹,进入payload,选择app右键显示包内容我们就能看到安装包的图片等资源和一些SDK了,打开info.plist还能看到app所支持的url scheme。
二、查看app的.h文件
正常情况下,如果要导出一个已安装应用的头文件,我们只需要使用 class-dump对已经砸壳的应用进行处理就可以了。这里引入了两个名词,砸壳和class-dump。
砸壳
但是当我们直接从 AppStore 上面下载安装应用的时候,这些应用都被苹果进行过加密了,在可执行文件上加了一层壳。在这种情况下,如果我们想要获取头文件,就需要先破坏这一层保护壳,这就是所谓的“砸壳”。
获取砸壳的应用方式有两种。
- 使用pp助手从越狱市场下载一款越狱版本的app,一般来说,越狱市场上的app都是已经被砸壳的,当然会有少数的app还没有被砸壳,那就需要我们自己去砸壳啦,当然基本我们需要研究的app都是较为知名的,基本都已经被砸壳。
class-dump
class-dump是用来dump目标文件的类信息的工具。它利用Objective-C语言的runtime的特性,将存储在mach-O文件中的@interface和@protocol信息提取出来,并生成对应的.h文件。官方介绍如下:
This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files. It generates declarations for the classes, categories and protocols. This is the same information provided by using ‘otool -ov’, but presented as normal Objective-C declarations, so it is much more compact and readable.
步骤:
- 获取一款已经砸壳的app。
- class-dump下载。
- 下载完成之后,将dmg文件中的class-dump复制到_usr_local/bin目录,然后执行命令
sudo chmod 777 /usr/local/bin/class-dump
。
- 找到app,执行操作
class-dump -H /Users/canoe/Desktop/WeChat.app -o /Users/canoe/Desktop/AppHeader
。如果AppHeader文件夹内没有出现头文件那么就是执行失败,需要检查是否是app没有砸壳的原因。
三、查看app使用的第三方库
有时候我想知道app使用的第三方库,但是使用 class-dump 导出的头文件非常多,仅靠肉眼查看时,根本不能很好的找出来。于是有人发明了一个工具,能够获取某个app的三方库,并且查看pod库的star数,以及源地址。
该工具的实现原理是利用三方库的头文件去反查第三方库。
- 在GitHub - lefex/WeChatShot中下载源码。
- 下载源码后修改
main.py
文件的IPA_HEADER_PATH
为 class-dump 导出的头文件目录。
- 命令行cd到main.py目录中,执行
python main.py
。
四、查看一款app的UI界面
- 在越狱手机
cydia
中下载安装cydia substrate
,Reveal2Loader
,注意安装的先后顺序。
- iOS-设置-Reveal,选择需要启用Reveal支持的目标App。
- 打开
reveal
,然后打开app,看是否可以直接查看。不出意外的话会出现下面的错误提示,因为reveal2loader
中的revealframework
版本太低了无法匹配我目前使用的最新版本14,所以我们需要对它进行替换。
- 现在我们需要将
reveal
的framework传送到手机中,有两种方式传输方式,首先mac连接手机。
一是可以使用ssh传输,用pp助手打开openssh,根据弹出的提示的ip地址以及密码输入指令。
scp /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework/RevealServer root@192.168.1.x:/System/Library/Frameworks/RevealServer.framework
二是直接使用pp助手的文件管理功能,直接将
revealframework
导入覆盖/System/Library/Frameworks
目录下的文件。- 现在重新打开
reveal
以及测试的app,这个时候就可以直接打开看UI结构了。
总结
以上就是对app内部的一些简单的尝试和探索,还有很多可以继续深入的地方,要分析一个 APP 光有头文件是远远不够的,我们还需要使用 Hopper 对其进行静态分析,以及使用 lldb 配合cycript 进行动态分析,甚至是写一些插件来实现一些好玩的功能,这些我接下来都会去尝试和学习。
参考:
🍄小彩蛋—免越狱修改微信的图标
参考:免越狱修改微信
- 下载微信。
- 砸壳。
- 将微信的ipa替换掉IPAPatch工程内的ipa。
- IPAPatch工程内加入reveal的framework。
- 替换app.ipa内的图标资源(不可以解压,直接压缩包内替换)微信美化的资源。
- 修改bundleID。
- 运行。
⚠️注意:这个方法有一定的缺陷,例如推送不及时,而且跳转微信的时候无法跳转进来,而且有可能被微信查出弹窗警告,介意勿用,建议尝鲜或者小号使用。
- Giscus