准备
- 一台越狱iOS设备
可通过爱思助手,内部集成了unc0ver越狱工具,目前支持iOS11.0~iOS14.3的非完美越狱,需要使用6.1.2版本,6.2.0版本会提示越狱失败。 - mac 安装程序
爱思助手:越狱
iFunBox:可访问或管理iOS设备文件系统(需要iOS越狱设备安装Apple File Conduit和AppSync) - iOS越狱设备安装程序
Apple File Conduit:激活所有路径访问权限
AppSync:关闭签名,可向iOS设备文件系统传输文件
Filza File:可访问或管理iOS设备文件系统
OpenSSH:远程传输协议工具
usbmuxd:usbmuxd 是苹果的一个服务,这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。(https://cgit.sukimashita.com/usbmuxd.git/)
Cycript:Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了Objective-C++、ES6(JavaScript)、Java等语法的混合物,可以用来探索、修改、调试正在运行的Mac\iOS APP。cycript的原理是动态库注入,它能够Hook正在运行的进程。
Cycript 逆向微信实战
- 找到下载的usbmuxd内部的python脚本
tcprelay.py
,并执行。
python tcprelay.py -t 22(openSSH端口号):目的端口号
Terminal输出:
sanweiguoye@sanweiguoyedeMacBook-Pro python-client % python tcprelay.py -t 22:2345
Forwarding local port 2345 to remote port 22 (正在转发本地2345端口到22端口)
- 通过openSSH登录iOS设备
ssh root@192.168.6.67 (通过局域网ip地址连接,延迟高)
ssh root@localhost -p 2345 (usbmuxd转发端口)
执行ps -A可查看当前设备正在执行的所有进程,通过grep参数筛选出微信进程。
iPad:~ root# ps -A|grep WeChat
10251 ?? 0:25.67 /var/containers/Bundle/Application/D3A7DE37-EF05-4552-8E9C-0876C387B670/WeChat.app/WeChat
11242 ttys000 0:00.03 grep WeChat
- cycript注入微信
cycript -p WeChat
或
cycript -p 10251
李明杰老师提供了一系列cycript语言封装的函数,方便用于动态调试正在运行的App。
https://github.com/CoderMJLee/mjcript
通过scp执行或者iFunBox将mjcript.cy文件放到usr/lib/cycript0.9
目录。
导入mjcript文件:
@import mjcript
cycript常见指令:
cy# MJFrontVc()
#"<WCAccountMainLoginViewController: 0x1450d9400>"
cy# UIApp
#"<UIApplication: 0x143e20650>"
cy# UIApp.delegate
#"<MicroMessengerAppDelegate: 0x2819e4dc0>"
cy# #0x2819e4dc0.window
#"<iConsoleWindow: 0x143f100f0; baseClass = UIWindow; frame = (0 0; 1024 768); gestureRecognizers = <NSArray: 0x2826a70c0>; layer = <UIWindowLayer: 0x282cdc800>>"
cy# MJInstanceMethodNames(#0x1450d9400)
[&"WCBaseInfoItemBeginEdit:",&"WCBaseInfoItemEndEdit:",&"WCBaseInfoItemPressReturnKey:",&"WCBaseInfoItemEditChanged:",&"setupWithData:",&"signMethod",&"onSignMethodSwitch:",&"setSignMethod:",&"onNext",&"vcResignFirstResponder",&"findCountryCode",&"showCountryCodePickerView",&"showCountryCode",&"checkNextBtnEnable",&"CountryCodePickerDidPickCountryCode:",&"useGrayBackgroundColor",&"userDidClickBack",&"userDidClickMore",&"showFooterViewWithSwitchBtnTitle:loginBtnTitle:",&"onSwitch",&"initMoreView",&"onBothDeviceClicked",&"getSignMethod",&"showPhoneLoginFooter",&"showUserLoginFooter",&"switchToUserLogin",&"showOtherMethodPageSheet",&"switchToPhoneLogin",&"bShowPhoneLoginViewFirst",&"setBShowPhoneLoginViewFirst:",&"init",&"didReceiveMemoryWarning",&"setDelegate:",&"viewDidLoad",&".cxx_destruct",&"dealloc",&"initTableView"]
cy# var app = UIApp.keyWindow
#"<iConsoleWindow: 0x143e79390; baseClass = UIWindow; frame = (0 0; 1024 768); gestureRecognizers = <NSArray: 0x2826222e0>; layer = <UIWindowLayer: 0x282c918a0>>"
cy# app.rootViewController
#"<MMUINavigationController: 0x1450c6a00> ChildViewControllers:(\n \"<WCAccountMainLoginViewController: 0x1450d9400>\"\n)"
cy# choose(UILabel) // 获取当前进程所有UILabel类型的实例对象(cycript自带函数)
[#"<MMUILabel: 0x143f4dca0; baseClass = UILabel; frame = (0 0; 0 36); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808ee670>>",#"<CTRichTextView: 0x143fa1b40; baseClass = UILabel; frame = (20 116; 464 33); opaque = NO; layer = <_UILabelLayer: 0x2808f2260>>",#"<CTRichTextView: 0x143fbcf80; baseClass = UILabel; frame = (20 116; 464 33); opaque = NO; layer = <_UILabelLayer: 0x2808f19f0>>",#"<MMUILabel: 0x143e57cc0; baseClass = UILabel; frame = (0 0; 0 36); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808b2ee0>>",#"<MMUILabel: 0x143e8ded0; baseClass = UILabel; frame = (0 0; 122 52); text = '\xe5\xb8\x90\xe5\x8f\xb7'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808d73e0>>",#"<MMUILabel: 0x143e9b120; baseClass = UILabel; frame = (0 0; 122 52); text = '\xe5\xaf\x86\xe7\xa0\x81'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808d6800>>",#"<MMUILabel: 0x143eea2f0; baseClass = UILabel; frame = (0 0; 122 52); text = '\xe5\x9b\xbd\xe5\xae\xb6/\xe5\x9c\xb0\xe5\x8c\xba'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808f3ac0>>",#"<MMUILabel: 0x146204720; baseClass = UILabel; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2808c3700>>"]
cycript 还可动态向方法添加代码,实时添加视图或修改属性,比如常见的去广告功能。
Reveal
准备:
Reveal免费版:https://mac.orsoon.com/Mac/150671.html
Reveal2Loader:安装完成后在设置中打开允许调试的App。
将Mac中Reveal库同步到/Library/Frameworks/RHRevealLoader
,保持两端Reveal库版本一致。
顺利连接会出现以下图标,点击即可查看或修改视图结构。