逆向实战(26)
- 通过MonkeyDev 创建WeChatDemo
- 开发技术选择
- 越狱环境中 -> 越狱插件 Logos
- 重签名. 非越狱中, 破解版本(容易封号)
- 以前自定义界面到设置界面上添加HKSettingCell
- 当是图片 -> App包里面 -> 重签
- 那么越狱插件该怎么写?
编写Tweak插件
image.png
- 在越狱环境下去拿微信的APP ID -> 修改上面对应的地方,表示我的插件的目标是微信
- 要想插件在编译时安装
image.png
image.png
c.注意: 你的电脑如果同时连接了两台手机, 用USB进行连接什么的,容易出问题,记得保存一台手机连接即可
- 将HKSettingCell.xm脱到工程里面, 拖拽时选择12, 不用选择4
- 因为上面的设置,编译时会安装, 所以先关闭MonkeyDevInstallOnAnyBuild -> NO
- 编译
- 如果是编译错误 -> Build Setting -> sign -> 找到Code Signing Identity -> iOS Developer
- 注意Tweak中文路径敏感 -> 直接将工程放在桌面
- 如果没有问题则会生成.mm文件, 将生成的文件添加到工程里面, 添加时选择124
- 上步没有问题 -> 编译运行, 记得改MonkeyDevInstallOnAnyBuild -> Yes, 让编译时安装到微信
- 头文件报错的话, 注释掉
- 还有不成功的话, 修改版本号
image.png
- 此时是没有图片的, 用USB链接图片
- 链接到手机, ps -A | grep WeChat -> 找到微信的沙盒路径(记录一下沙盒路径)
2.
image.png
b.做越狱插件的时候, 如果需要增加图片 -> 将图片资源拷贝到APP目录下就行
定位聊天界面接收消息方法
- 砸壳, 将砸壳文件放到桌面 -> 解压缩 -> class dump -> 那倒头文件
- 小细节, APP包里面有修改 info.plist, 打开info.plist最下面有个 设备device这个东西, 记得删掉,不然重签名不了
- 找到聊天详情界面
image.png
- 当然也可以用Xcode进程附加,或者Reveal工具都可以
- 最终找到了聊天详情界面BaseMsgContentViewController
- 去头文件里面找到这个文件, 然后我们要做的是HooK里面所有的方法
THEOS工具使用来HOOK一个.h里所有方法
- open $THEOS
image.png
- logify.pl -> 你给我一个头文件, 我帮你Hook, 头文件里所有的方法, 并写上%log, 这正是我们迫切需要的
- 终端进入头文件目录
1. logify.pl BaseMsgContentViewController > ../logMethod.xm -> > 是输入到一个文件, 后面是文件路径 2. 然后将生成的文件放到工程里查看 3. 编译 -> 先关闭MonkeyDevInstallOnAnyBuild -> NO 4. 会生成.mm文件 -> 将.mm文件拖拽到工程 -> 再次编译 1. 因为这里的hook方法比较多, 点.mm文件会很卡 2. 再次编译很多地方报错, 直接干掉报错代码 3. 导入 #import <UIKit/UIKit.h> 4. 编译没问题后 -> MonkeyDevInstallOnAnyBuild -> YES -> 然后重编译安装插件 5. 附加进程有可能看不到打印信息 -> 控制台 -> 搜WeChat的进程来看打印 6. 进入微信聊天详情界面, 发条消息, 看控制台的打印
定位全局接收消息方法
image.png
- 要想Hook红包, 应该不止在聊天详情界面, 退出聊天详情界面, 再次发消息观察
image.png
- 定位onNewSyncStart(收到消息时调用), addMessageNode(进入详情界面有调用)
- 消息管理者调用的onNewSyncStart -> 下断点看函数调用栈
- 下断点
- methods BaseMsgContentViewController
- 找onNewSyncStart的内存地址, 这个进程死掉就不行了
image.png
c.
image.png
d.
image.png
e.bt 查看堆栈 -> sbt 恢复符号 (多试两次, 有可能恢复多点符号名称)
- 恢复了frame#1的符号
image.png
ii.frame2的符号只有个地址
- image list -> 拿到首地址 -> 用拿到的frame2的地址 - 首地址 -> 分析出来是个block方法(此处没有用到相减得到的地址, 而是通过断点到时打印)
image.png
2.
image.png
3.多sbt尝试恢复符号, 上面的步骤有许多恢复的方法值得我们去探究, 去下断点,或许有新的收获
定位消息管理者作为HOOK对象
- 经过上面的分析, 我们怀疑addMessageNode这个很重要(sbt恢复的函数栈来看)
- 需要重新hook, 栈里面的那几个函数
- 从我们导出的头文件里面找到需要hook的类, 然后上面的相应的栈方法
- 注释掉原来xm里面的大量hook代码
image.png
- 注意搜索类的技巧 -> @interface CMessageMgr
- 上面这个方法一看就是消息管理类, 我们现在对这个类有很强烈的兴趣
- MonkeyDevInstallOnAnyBuild -> NO -> 先编译一下, 看是否有问题
- 小细节: 主动杀掉WeChat -> 通过Spring board重启有可能有问题
- MonkeyDevInstallOnAnyBuild -> YES
- Xcode运行插件
- 打开控制台 -> 不进聊天界面,发消息
image.png
e.我们发现这有很大概率是我们的目标
f.发送不同消息类型来看控制台打印 -> 发红包时type=49
g.然后MainThreadNotifyToExt是我们研究的重点吗? -> CMessageMgr 这个类才是
h.需要对CMessageMgr这个类进行全方位的HOOK
- logify.pl CMessageMgr.h > ../logMethodCMessageMgr.xm
- 将生成的文件 拖拽进项目 12
- 不显示.xm内容的话 -> 尝试重启Xcode
- MonkeyDevInstallOnAnyBuild -> NO -> 编译生成.mm -> 拖拽到项目124
- 注释掉报错方法
- MonkeyDevInstallOnAnyBuild -> YES
- 手动杀掉WeChat -> 运行安装插件
- 查看控制台
- 需要分析的记录一下, 要找那种每次发消息都会调用的方法 -> 多发几条消息记录一下
image.png
c.去头文件里找到这个方法
d.
image.png
e.手动杀掉WeChat
f.重新运行插件 -> 找到打印信息
image.png
image.png
动态分析定位到抢红包的方法
- 分析强红包的方法, 如果是类方法, 简单
- 如果是对象方法, 需要静态分析, 反汇编去分析出打开红包的代码
- IDA!!! 登场
- 附加进程 -> 分析红包界面的开按钮
- WCRedEnvelopesReceiveHomeView对象的OnOpenRedEnvelopes
- 安装IDA -> Mac比较麻烦 -> 安装个虚拟机Parallels Desktop
- Parallels Desktop这个跟Mac融合的比较好
- 用IDA分析WeChat的包
IDA分析流程
- New
- 找到文件夹 -> 看不到文件 -> All Files -> WeChat
- 选择Mach-O file ARM64 -> OK -> 时间比较长