打探一款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,不然搜索不到。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/7EB6C684-13CE-4692-9D07-848E1542ED42_2/zmyYa8zsqLqXbVwdGwx80RgRfygMyGH4x3uSJARxtVsz/16350D37-7C3B-43F7-B204-6DBC3686DAE2.png?t=b243eb00-5303-47dc-b65c-3bad03930783)
- 选择手机,手机里面需要已经安装上了该app,然后点击添加应用。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe7d18574-2669-454d-862e-635f33342cf2%2F42E23FB5-5BB2-44AB-BC3E-816F219AFDCF.png?table=block&id=b9263a5e-ed5c-4f1b-a39e-8a4b3d532812&t=b9263a5e-ed5c-4f1b-a39e-8a4b3d532812&width=813&cache=v2)
- 从应用列表中选择需要获取ipa包的应用。
- 然后就会开始下载,因为手机上已经存在该应用,所以会提示是否替换,此时不需要点击任何按钮,我们进行下一步操作。
- 打开finder,前往
~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/
该路径就可以看到ipa文件了。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/67EE8A6B-EB9E-4AD0-9FC4-7998CC6C5B96_2/ZExm4rg0Kh9xGxk0c0zTbFJgzV3syLLkem1wot2i1mIz/F40BAEF3-322C-426E-843F-17E9DB868824.png?t=c304e0ce-4c59-4a92-b3c6-89fe578cb3c6)
- 然后我们可以把ipa文件复制出来,Apple Configurator 2可以选择停止,然后修改ipa后缀为zip,解压。
- 打开文件夹,进入payload,选择app右键显示包内容我们就能看到安装包的图片等资源和一些SDK了,打开info.plist还能看到app所支持的url scheme。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fad2d98fb-75f6-4a8d-bea9-cf53e2178126%2F575D4BC0-0F7B-4E76-AEA6-632A6E706EC3.png?table=block&id=f91efc61-e719-4084-8af8-4e7cee33aca3&t=f91efc61-e719-4084-8af8-4e7cee33aca3&width=720&cache=v2)
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/2B9508B2-DB87-4F36-970D-530F5D513B0A_2/Q0NfubNNyS4OLlfLLB75L2RmHLDGrXMpW2MkxGt6ba0z/CD222CCE-53B4-4215-BA54-11059A169735.png?t=8be21629-4102-494f-9ae0-e796fd54ae34)
二、查看app的.h文件
正常情况下,如果要导出一个已安装应用的头文件,我们只需要使用 class-dump对已经砸壳的应用进行处理就可以了。这里引入了两个名词,砸壳和class-dump。
砸壳
但是当我们直接从 AppStore 上面下载安装应用的时候,这些应用都被苹果进行过加密了,在可执行文件上加了一层壳。在这种情况下,如果我们想要获取头文件,就需要先破坏这一层保护壳,这就是所谓的“砸壳”。
获取砸壳的应用方式有两种。
- 使用pp助手从越狱市场下载一款越狱版本的app,一般来说,越狱市场上的app都是已经被砸壳的,当然会有少数的app还没有被砸壳,那就需要我们自己去砸壳啦,当然基本我们需要研究的app都是较为知名的,基本都已经被砸壳。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/B9A57E97-52B6-469E-8734-DAFAAD2FD9DC_2/GPaPumiM0M3RQKiS8qv15oCXw7rZaQ0FREiWJGzPCmUz/3BAB3BEC-C6DE-4567-B8CD-D6AF098BA2EF.png?t=f524e622-8e2d-490c-a455-bf8fd3a50bae)
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
。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa735881b-0166-4839-9e6c-3813064741c7%2FD2113093-A4D6-4E82-ACAA-761E15523B54.png?table=block&id=bb31252e-b49c-494a-bb50-7e021966d08a&t=bb31252e-b49c-494a-bb50-7e021966d08a&width=720&cache=v2)
- 找到app,执行操作
class-dump -H /Users/canoe/Desktop/WeChat.app -o /Users/canoe/Desktop/AppHeader
。如果AppHeader文件夹内没有出现头文件那么就是执行失败,需要检查是否是app没有砸壳的原因。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/AEB82194-E051-4B80-8C4E-F46B8ACA037C_2/jzqNUE79y12cWdcGLoNR3dOx4tx1AnBa3ayRACRln8Iz/373398B1-D9BE-4BF3-B4FC-38B1A1F04DA2.png?t=68e51059-824b-4216-be21-5907c01eac38)
三、查看app使用的第三方库
有时候我想知道app使用的第三方库,但是使用 class-dump 导出的头文件非常多,仅靠肉眼查看时,根本不能很好的找出来。于是有人发明了一个工具,能够获取某个app的三方库,并且查看pod库的star数,以及源地址。
该工具的实现原理是利用三方库的头文件去反查第三方库。
- 在GitHub - lefex/WeChatShot中下载源码。
- 下载源码后修改
main.py
文件的IPA_HEADER_PATH
为 class-dump 导出的头文件目录。
- 命令行cd到main.py目录中,执行
python main.py
。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/F056D538-2EE5-4457-8108-97B16072F369_2/POb71eDUGFSDAyFjfJVWF2n0EEcdWx9rRgiI1ly8jugz/8CBC405E-C3EE-4667-9109-B0D7626E457F.png?t=f06b68ac-a235-45ef-8e63-7840162a8976)
四、查看一款app的UI界面
- 在越狱手机
cydia
中下载安装cydia substrate
,Reveal2Loader
,注意安装的先后顺序。
- iOS-设置-Reveal,选择需要启用Reveal支持的目标App。
- 打开
reveal
,然后打开app,看是否可以直接查看。不出意外的话会出现下面的错误提示,因为reveal2loader
中的revealframework
版本太低了无法匹配我目前使用的最新版本14,所以我们需要对它进行替换。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/6E855AC0-943E-4DC3-ACA4-27814FE8323E_2/Ut6XxehZfSYmHygxe6ssAjZl7Xvx0tJCJXOBBhA58y8z/A1A08DE5-B4B6-4599-967A-9C461B1A5A3E.png?t=fa66c2a8-f59e-41d5-b669-7bbc7399d56e)
- 现在我们需要将
reveal
的framework传送到手机中,有两种方式传输方式,首先mac连接手机。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/65E86964-A251-4C41-872D-E5769F16572E_2/uVP40iahalSQOB5L5BUm81WKlIabG6CpVXGCE87CjdUz/64C4D384-35FA-4854-83B0-EA45185E1AD6.png?t=92eee029-b006-4547-aa31-0a5ddb83fdc0)
一是可以使用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结构了。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd9ec3e8d-e4c2-41ac-920e-f43b4dc0716d%2F1F5A0D2C-664E-4600-A602-08CA5F782BC2.png?table=block&id=77bab2c0-9472-4787-b82b-282cf1dc8e47&t=77bab2c0-9472-4787-b82b-282cf1dc8e47&width=3026&cache=v2)
总结
以上就是对app内部的一些简单的尝试和探索,还有很多可以继续深入的地方,要分析一个 APP 光有头文件是远远不够的,我们还需要使用 Hopper 对其进行静态分析,以及使用 lldb 配合cycript 进行动态分析,甚至是写一些插件来实现一些好玩的功能,这些我接下来都会去尝试和学习。
参考:
🍄小彩蛋—免越狱修改微信的图标
参考:免越狱修改微信
- 下载微信。
- 砸壳。
- 将微信的ipa替换掉IPAPatch工程内的ipa。
- IPAPatch工程内加入reveal的framework。
- 替换app.ipa内的图标资源(不可以解压,直接压缩包内替换)微信美化的资源。
- 修改bundleID。
- 运行。
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/8B63B2E8-B21A-4424-8DD3-D00D8070497A_2/3Kgl3dz7wX1jy6O0yCD8Vk7a0bzyGFkf75dSCa6Eb18z/ace8f9afgy1fr6e31f503j20ku112juo.jpeg?t=8af5851d-84c9-4775-8032-86edbf519f07)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fbd1ac26f-8e37-40b5-b0f8-b277f13d8525%2Face8f9afgy1fr6e32jhj4j20ku112n4d.jpg?table=block&id=ea98d97e-c264-4d16-ae95-c3a1ecb4ff45&t=ea98d97e-c264-4d16-ae95-c3a1ecb4ff45&width=690&cache=v2)
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/83F65A88-527C-4261-9346-DA4B024A7EAB_2/vQorF8ZLuil3dHTB4fPSe9Pu6zO243a5AtPlB74HV0Mz/ace8f9afgy1fr6e257regj20ku11275n.jpeg?t=30d565e6-ca9a-4cfa-9dbc-3bdeee1e7617)
![notion image](https://res.craft.do/user/full/e3e2c966-e530-b52a-0806-8df1843f189e/doc/17041AE3-3887-40C7-8B74-F7896F632FE0/C4063389-EFDF-441F-863E-2C5FA9726959_2/2wBFEd7dhxCqZX2gr9v7lLaAo6hKXojfAqVBdw2Xkxcz/ace8f9afgy1fr6e33b4unj20ku112gzp.jpeg?t=92137af5-a2b5-4c3e-81cb-5e8cd43c82fe)
⚠️注意:这个方法有一定的缺陷,例如推送不及时,而且跳转微信的时候无法跳转进来,而且有可能被微信查出弹窗警告,介意勿用,建议尝鲜或者小号使用。
- Giscus