好久没学习 reverse 了 , 把我的破 6splus 更新下 .
之前一用的meridian越狱的10.3.3 ssh一直没联上 reveal也不行 , 所以暂时用的之前的iphone5(老5⃣️)越狱机
今天更新下:
目前结果 hook reveal都可完美 作为起手式可以了
首先用的 doubleH3lix-A9-test 来进行越狱 10.3.3 - iphone6splus
然后进行对微信的hook - 简单hook了登录按钮logic
先进行砸壳
frida dump
frida-iOS-dump 一键砸壳
手机安装 frida
Mac 安装 frida
下载 frida-ios-dump
使用手机登录 ssh
砸壳
手机安装 frida
1.1 手机越狱之后在 Cydia --> 软件源 --> 编辑 --> 添加源(build.frida.re)
1.2 进入 build.frida.re 源下载 Frida
Mac 安装 frida
终端输入
sudo pip install frida
- 下载 frida-ios-dump 并配置 frida
终端 cd 到 frida-ios-dump 路径下
输入
sudo pip install -r requirements.txt --ignore-installed six
配置过程中遇到两个问题:
frida-tools 1.2.2 has requirement prompt-toolkit<2.0.0,>=0.57, but you'll have prompt-toolkit 2.0.7 which is incompatible.
Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
如果有其他的 按照提示更改版本就可以了
- 登录 ssh 连接手机
注意: 登录 ssh 时映射的端口号必须与 dump.py 脚本中端口号一致
- 砸壳
登录 SSH 后重开一个页面 cd 到 firda-ios-dump 路径下
//查看app 名称及bundleID
dump.py -l
//砸壳可使用名称, 若名称不可以就使用bundleID即可
dump.py 全军出击
砸壳成功后, ipa 包生成在 frida-ios-dump 文件夹中
改名 wx.ipa
接着安装MonkeyDev 这个按照官方说明就可以了 https://github.com/AloneMonkey/MonkeyDev/wiki/
安装后在xcode新建工程 MonkeyApp
然后把砸壳好的ipa放到 指定的目录
接着就可以真机运行了
第二微信就是我们新建工程得到的
使用Reveal
这里有个小插曲 , 当前我下载的MonkeyDev使用的RevealServeFramework 与mac上的Reveal不一致
因为MonkeyDev没有集成最近的Reveal包,需要手动替换,MonkeyDev下的Reveal包路径如下:
/opt/MonkeyDev/Frameworks
替换了之后 再运行工程发现提示我bundleid 重复了 , 我把app删除后还是这样 , 这个时候需要clean一下工程即可.
然后运行 , 打开reveal就可以看到熟悉的界面了.
接着我们开始hook
先 class-dump 头文件来分析我们需要修改的地方
安装 class-dump
通过官网 下载 http://stevenygard.com/projects/class-dump/ mac的dmg文件
然后打开 将class-dump可执行文件拖出目录即可
然后执行class-dump命令对微信头文件进行dump
//class-dump -H MachO文件Path -o 导出头文件需要存放路径
class-dump -H WeChat -o ~/Desktop/wechatHeader
可以看到声明文件都出来了
主要是模拟流程进行分析 这里我们跳过分析直接用网上的结果演示 登录按钮的逻辑在这里
方法为 onFirstViewLogin (截止目前这篇文章发表的时间,逻辑是这个) 所以我们只需要hook这个方法就好了
hook操作主要是这两个文件
用的是 captainhook 的 方法 , 简单介绍:
#import <Foundation/Foundation.h>
#import <CaptainHook/CaptainHook.h>
#import <UIKit/UIKit.h>
CHDeclareClass(MainController) //声明hook的类
//声明hook的方法,数字代码参数个数,第一个参数一般是self,第二个参数代表返回值,第三个参数是类名,第四个是方法名,后面接方法参数以及类型
CHOptimizedMethod1(self, void, MainController, menuAction,id,arg1){
//获取类变量view的值
UIView* item2= CHIvar(self, _item2_bgview,__strong UIView*) ;
UIView* item=[arg1 view];
if(item2==item){
//拦截 点击事件
UIAlertView *alert=[UIAlertView new];
[alert setTitle:@"提示"];
[alert setMessage:@"拦截成功"];
[alert show];
NSLog(@"测试成功...%@ : %@",arg1,item2);
}else{
// 其他逻辑正常执行元源代码
CHSuper1(MainController, menuAction, arg1);
}
}
// 构造方法,
CHConstructor{
CHLoadLateClass(MainController); //再次声明hook的类
CHClassHook1(MainController, menuAction); //再次声明hook的方法
}
demo的代码中有简单的英文说明 基本上的操作都写了.
主要修改的地方:
CHOptimizedMethod0(self, void, WCAccountLoginControlLogic, onFirstViewLogin){
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"hook wechat by wulong" message:nil preferredStyle:UIAlertControllerStyleAlert];
[alertVC addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil]];
[[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController:alertVC animated:true completion:nil];
}
运行后点击登录:
成功