SkillAgentSearch skills...

IWeChat

从 0 开始解刨一个 App,以微信为例

Install / Use

/learn @lefex/IWeChat
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

🐶初衷

通过这个项目学会如何分析一个第三方 APP。关于我的更多信息,扫码关注 素燕:

🐱APP信息

💯砸壳 - ipa 获取

首先第一步是获取一个破解的 ipa 包,我们可以通过下面这几种方式获取:

  • 方式一:iTunes

苹果既然在高版本的 iTunes 取消了获取 ipa 包的入口,那我们就想办法降级处理。需要下载低版本的 iTunes。 下载

下载完后,安装,第一次启动的时候按住 option 键,这样才不会报错,安装完成后,即可下载应用的 ipa 包。下载完成后,在应用的图标上按右键,show in finder 即可找到 ipa 包。

  • 方式二:pp助手

电脑安装一个 pp助手客户端,直接下载越狱应用,下载完成后,即可在“本地应用”中找打 APP 的 ipa 包。需要强调一点,这种方式下载的应用是解密后的 ipa。

  • 方式三:抓包

在 Mac 中的 iTunes 中下载应用,通过 Charles 抓包获取到 ipa 包的下载地址,直接在浏览器中下载,下载地址是在 p52-buy.itunes 这个域名下。

获取到 ipa 包后就需要砸壳。如果从越狱助手上下载的则不需要砸壳。

💯手机越狱

我使用的是叉叉越狱助手,按照他的流程,即可完成越狱。安装完成会出现 Cydia 这个应用,你可以理解成它是越狱应用商店。有时候比较坑,越狱时可能会出现黑屏。

需要安装 Cydia Impactor 这里用来安装软件,下载完成后,需要把你所需要的安装包拖到 Cydia Impactor,安装过程中如果没有出现错误,说明安装成功。

// 应用会报错到这个目录下
/var/mobile/Containers/Data/Application/

登录

安装 OpenSSL(在Cydia中安装)
sudo ssh root@172.24.94.140
<!--修改密码默认为 alpine 为 (q--4)-->
TCZYde-iPhone:~ root# passwd

💯头文件

头文件导出

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.

class-dump 这个工具用来查看某个APP的头文件。只需要找到第三方APP的 xxx.app 文件,然后执行 class-dump 命令即可。不过在执行 class-dump 命令前,需要确保 xxx.app 是砸过壳的,从 APPStore下载的 xxx.app 文件是经过加密处理的,可以直接从各大越狱市场上下载第三方 xxx.app 文件,从越狱市场下载的 xxx.app 已被破解。可以直接使用 class-dump 导出头文件。

下载 class-dump 后把 class-dump 导入 /usr/local/bi 目录下,并执行下列命令:

sudo chmod 777/usr/local/bin/class-dump

执行 class-dump 命令:

class-dump -H [xxx.app所在的位置] -o [头文件导出的位置]

比如:
class-dump -H Lefex.app -o lefexheader

class-dump -H /Users/daredos/Desktop/微信-6.3.23\(越狱应用\)/Payload/WeChat.app  -o /Users/daredos/Desktop/w

使用 class-dump 命令导出头文件有以下特点:

  • 不管 .h 还是 .m 文件中的属性和方法都会被导出;
  • 某个类的类别中的方法也会被导出,导出到源文件中,比如 ViewController (Navigation) 中的方法被导出到 ViewController 中;
  • 实现的协议也会被导出,比如 ViewControllerDelegate 的方法被导出到 ViewController 中,如果 ViewController 不实现 ViewControllerDelegate 协议讲不会被导出;
  • 协议中定义的方法不会被导出,只会导出到实现协议的类中;

头文件分类

有时候为了分析方便,需要把所有的头文件分成不同的文件夹存放。也就是说把他组织成我们开发 APP 时的目录结构。而微信的目录结构大致如下:

把头文件按模块来划分,最后能勾勒出微信的整体项目结构放到主工程中。目前已经勾勒出微信的目录结构,不过不是很全。参考

<img src="https://raw.githubusercontent.com/lefex/iWeChat/master/image/wechat_catagory.png" title="继承" width="300"/>

MonkeyDev自动导出头文件

工程已集成class-dump导出可执行文件OC头文件的功能,可在build settings最下面开启该功能,在 User-Defined 下添加 MONKEYDEV_CLASS_DUMP 值为 YES。

💯第三方库

基于脚本

研究某个APP时,需要了解其使用的第三方库,使用 class-dump 导出的头文件非常多,刚靠肉眼查看时,耗时耗力。为了解决这个痛点,便发明了这个工具。下面是获取微信使用的第三方库,可以查看 pod 库的 star 数,源地址。

本工具基于 python 写的,在这里可以找到源码。下载源码后修改 file_catagory.py 文件的 IPA_HEADER_PATH 为 class-dump 导出的头文件目录。执行 python file_catagory.py

IPA_HEADER_PATH = '/Users/lefex/Desktop/header/xxx'

如果还有没发现的第三方库欢迎提 issues

通过头文件搜索

如果APP使用了三方库,可以输入PodsDummy来快速找到使用的第三方库和私有库;

<img src="https://raw.githubusercontent.com/lefex/iWeChat/master/image/PodsDummy.png" title="三方库" width="300"/>

💯UI

除了头文件外,研究第三方 APP 另一个比较重要的点就是查看 UI。可以使用 Reveal 查看视图层级。使用 MonkeyDev 可以在非越狱的手机上运行 Reveal。

MonkeyDev 默认集成是最新版本,需要把自己的 RevealServer.framework放到/opt/MonkeyDev/frameworks下(打开 Reveal,点击 reveal - help - show reveal in finder 即可找到 RevealServer.framework),这样就可以查看时图层级。

如果 Reveal 过期了,直接修改电脑时间为可以继续使用。

reveal.png

💯继承层级

使用 python 脚本轻松找出继承层级,比如我想找出 UIWindow 的继承层级结构,在这里可以找到 python脚本

<img src="https://raw.githubusercontent.com/lefex/iWeChat/master/image/iwc_inherit.jpeg" title="继承" width="300"/>

💯数据库设计

数据库的结构是什么,各个表之间是如何关联的,表中保存的数据是什么。

好友表(Friend):每个好友,包含群主,公众号都会保存到这张表中

CREATE TABLE Friend (
    userName           TEXT    PRIMARY KEY,
    type               INTEGER DEFAULT 0,
    certificationFlag  INTEGER DEFAULT 0,
    imgStatus          INTEGER DEFAULT 0,
    encodeUserName     TEXT,
    dbContactLocal     BLOB,
    dbContactOther     BLOB,
    dbContactRemark    BLOB,
    dbContactHeadImage BLOB,
    dbContactProfile   BLOB,
    dbContactSocial    BLOB,
    dbContactChatRoom  BLOB,
    dbContactBrand     BLOB
);

消息表(Chat_xxxxxxxxxxxx): 每一个会话会生成一张表

CREATE TABLE Chat_099cc67071b64517d719cdb9430037d8 (
    TableVer   INTEGER DEFAULT 1,
    MesLocalID INTEGER PRIMARY KEY AUTOINCREMENT,
    MesSvrID   INTEGER DEFAULT 0,
    CreateTime INTEGER DEFAULT 0,
    Message    TEXT,
    Status     INTEGER DEFAULT 0,
    ImgStatus  INTEGER DEFAULT 0,
    Type       INTEGER,
    Des        INTEGER
);

消息撤回表(RevokeMsgTable)

CREATE TABLE RevokeMsgTable (
    MSG_REVOKE_COL_SVRID   INTEGER DEFAULT 0
                                   PRIMARY KEY,
    MSG_REVOKE_COL_CONTENT TEXT,
    MSG_REVOKE_COL_INTRES1 INTEGER DEFAULT 0,
    MSG_REVOKE_COL_INTRES2 INTEGER DEFAULT 0,
    MSG_REVOKE_COL_INTRES3 INTEGER DEFAULT 0,
    MSG_REVOKE_COL_STRRES1 TEXT,
    MSG_REVOKE_COL_STRRES2 TEXT,
    MSG_REVOKE_COL_STRRES3 TEXT
);

💯沙盒目录

沙盒目录结构是什么,每个文件夹下面保存了那些数据。非越狱手机,通过Xcode直接导出(windows->devices and simulators - 设置按钮 - Download Container ...),这个时间比较长,需要耐心等待。

使用iFunBox工具

这个工具比较强大,可以直接把越狱设备的内容拷贝到电脑上,一图胜千言,直接看图吧。

![](https://github.com/lefex/iWeChat/blob/master/im

View on GitHub
GitHub Stars1.8k
CategoryDevelopment
Updated23h ago
Forks252

Languages

Objective-C

Security Score

95/100

Audited on Mar 31, 2026

No findings