前言
本篇文章,首先介绍下theos
越狱开发工具包,同时演示一下 动态调试支付宝,获取登录密码。
一、环境配置
在安装theos
工具包之前,需要安装adv-cmds
组件和Cycript
插件。
1.1 adv-cmds
adv cmds
是PushFix
依赖包中的一个组件
,而PushFix
依赖包则是Cydia
插件必备依赖包(绝大多数Cydia程序的依赖)之一。
首先我们在Cydia
中,搜索adv-cmds
插件,
直接点击右上角安装
即可。(上图中是已安装过了的)
1.2 Cycript
Cycript
之前我们讲过 19-Cycript,现在我们看看在越狱环境中是如何使用Cycript
的。
⚠️注意:在
越狱
设备上,安装Cycript
插件,需要先安装adv-cmds
插件,因为被Cycript
插件所依赖。
- 在手机上打开
Cydia
,安装Cycript
插件
- 在手机中打开
WeChat
,并找到它的进程(当然,需要usb连接手机)
- 附加
WeChat
进程,进入cy
环境
cycript -p 7619
⚠️注意:如果报错,也可直接使用名称
cycript -p WeChat
此时,我们就可以使用cycript
命令进行调试了,例如获取UIApplication
UIApp
-------------------------
#""
导入cy文件
在越狱环境中,也可以使用自定义cy文件
。
- 在Mac电脑端创建
cur_vc.cy
脚本文件,写入以下代码
(function(exports){
APPID = [NSBundle mainBundle].bundleIdentifier,
APPPATH = [NSBundle mainBundle].bundlePath,
APPHOME = NSHomeDirectory(),
rootVC = function(){
return UIApp.keyWindow.rootViewController;
};
keyWindow = function(){
return UIApp.keyWindow;
};
getCurrentVC = function(rootVC){
var currentVC;
if([rootVC presentedViewController]){
rootVC = [rootVC presentedViewController];
}
if([rootVC isKindOfClass:[UITabBarController class]]){
currentVC = getCurrentVC(rootVC.selectedViewController);
}
else if([rootVC isKindOfClass:[UINavigationController class]]){
currentVC = getCurrentVC(rootVC.visibleViewController);
}
else{
currentVC = rootVC;
}
return currentVC;
};
currentVC = function(){
return getCurrentVC(rootVC());
};
})(exports);
- 将
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
- 附加WeChat进程,进入cy环境(可以使用进程id或名称)
cycript -p WeChat
- 导入
cur_vc.cy
脚本
@import cur_vc
-------------------------
{}
- 调用
获取当前控制器
方法
currentVC()
-------------------------
#""
文件冲突问题
使用cy
文件,必须拷贝到Cycript指定目录
下,这样很可能造成文件冲突
。所以Cycript
引入了命名空间
,可以将cy
文件拷贝到不同子目录
中,然后按照指定规则导入。
- 在
/usr/lib/cycript0.9
目录下,已经默认存在一些子目录
- 在
com
目录下,存在以作者名字命名的saurik
目录,里面存储了官方的MS.cy
脚本
- 我们可以仿照以上目录结构,在
com
目录下,创建自定义目录
- 将
cur_vc.cy
脚本,移动到自定义目录下
mv ./cur_vc.cy /usr/lib/cycript0.9/com/Aron
- 附加
WeChat
进程的cy
环境,导入cur_vc.cy
脚本
@import com.Aron.cur_vc
-------------------------
{}
使用这种方式,保证了脚本的
唯一性
,有效避免文件冲突
。并且按不同目录划分,更利于脚本的管理
。
1.3 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=/`你的自定义目录`/theos
export PATH=$THEOS/bin:$PATH
安装theos
的过程中,可能会一同安装ldid
ldid
是针对越狱插件的签名工具
。如果未安装,需要手动安装
brew install ldid
三、支付宝密码框定位演示
接下来,我们来演示一下 如何窃取支付宝
的登录密码
。
3.1 动态分析
- 在设备中打开支付宝,并找到它的进程
ps -A | grep Alipay
-------------------------
8147 ?? 0:27.89 /var/containers/Bundle/Application/995CAC20-52A5-4D23-A605-FCF623931B79/AlipayWallet.app/AlipayWallet
支付宝其实是AlipayWallet
。
- 接着附加
AlipayWallet
进程的cy
环境
cycript -p AlipayWallet
- 导入
cur_vc.cy
脚本
@import com.Aron.cur_vc
- 接下来就是进入
动态调试
阶段了。打开登录页面,查看当前控制器
cy# currentVC()
#""
- 打印控制器下
所有视图
#0x151e9fc30.view.recursiveDescription() .toString ()
- 找到
登录
按钮
⚠️注意:小技巧 因为在
cy
环境中,中文
使用了Unicode
编码,直接搜中文是不行的。所以, “登录”文案的Unicode
编码为\u767b\u5f55
,搜索\u767b\u5f55
。
上图中共找到两处“登录”文案,第一处是“登录”,第二处是“换个方式登录”。我们找到了“登录”按钮的UIButton
| >
| | | | >
| | | | >
| | | | | <_UILabelContentLayer: 0x281689ec0> (layer)
- 接着我们找
UIButton
的事件响应者
和事件名称
- 事件响应者
#0x153c68bc0.allTargets
找到两个
响应者,一个是UIButton
自身,另一个是ALUAccuratePWDView
控件。
接着确认UIButton
的触摸事件
#0x153c68bc0.allControlEvents
64
对应的UIControlEventTouchUpInside
枚举值
UIControlEventTouchUpInside = 1 << 6
1左移6位,即 2的6次方,结果为64。
因此,
0x153c68bc0
对应的是事件类型UIControlEventTouchUpInside
,那么事件响应者就是ALUAccuratePWDView 0x153c19c50
。
- 事件名称
接下来我们通过响应者
和触摸事件
,找到事件名称
[#0x153c68bc0 actionsForTarget: #0x153c19c50 forControlEvent: 64]
-------------------------
@["onNext"]
返回事件名称onNext
。
综上
登录UIButton
可触发ALUAccuratePWDView
对象的onNex
t方法。
找到密码文本框
- 在密码框中输入
123456
- 使用老套路,在输出的视图中,搜索
123456
- 找到密码框的
UITextField
,从视图结构的层级分析:
UITextField
→aluInputBox
→aluAccurateLoginBox
→ALUAccuratePWDView
密码框
相关的父视图,和登录
按钮的事件响应者是一样的,都是ALUAccuratePWDView
控件。
3.2 静态分析
- 使用
frida-ios-dump
导出AlipayWallet
frida-ps -U
然后进入frida-ios-dump
执行
./dump.py 支付宝
得到支付宝.ipa
包
- 解压
ipa
,拷贝出MachO
文件,拷贝class-dump
至该目录
使用class-dump
导出头文件
class-dump -H AlipayWallet -o ./header
- 找到
ALUAccuratePWDView.h
文件
并没有找到aluAccurateLoginBox
对象,但有一个命名为_loginBox
的aluLoginBox
对象。
- 接着定位到
aluLoginBox.h
找到了命名为_passwordInputBox
的aluInputBox
对象。
aluInputBox.h
定位到命名为_textField
的aluTextField
对象,继承自UITextField
。
综上,密码文本框的查找路径
ALUAccuratePWDView
→_loginBox(aluLoginBox)
→_passwordInputBox(aluInputBox)
→_textField(UITextField)
→text(属性)
在ALUAccuratePWDView.h
文件中,同时找到了onNext
方法
所以,可以确定登录按钮
的响应事件 [ALUAccuratePWDView onNext]
3.3 theos插件
以上在动态
和静态
2方面,定位分析了支付宝登录页面的密码输入框
,前提 需要usb连接
手机,打开支付宝的登录页面。
那能不能不通过usb连接
手机设备,也能实现窃取登录页面的密码呢?
当然可以 使用
theos插件
!
3.3.1 搭建theos插件
- 使用
nic.pl
创建插件,nic.pl在
theos的
bin`目录下
我们可以配置环境变量,方便使用
export THEOS=/opt/theos/bin/
export PATH=$THEOS:$PATH
nic.pl
- 输入15,选择
iphone/tweak
插件,然后按提示输入信息
-
Project Name (required):
输入工程名称 -
Package Name [com.yourcompany.alipaypwddemo]:
输入包名称,类似BundleID
,要求全部小写
-
Author/Maintainer Name [xxx]:
输入作者名称,默认计算机名称。(如果不修改,直接回车) -
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
输入插件将要附加的进程
的BundleID
。(可以在cy
环境,通过APPID
获取) -
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
输入附加后杀掉的进程,默认为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
- 打开
Tweak.xm
文件,写入以下代码
#import
%hook ALUAccuratePWDView
- (void)onNext {
UIView *view1 = MSHookIvar(self, "_loginBox");
UIView *view2 = MSHookIvar(view1, "_passwordInputBox");
UITextField *pwd = MSHookIvar(view2, "_textField");
NSLog(@"登录密码:%@", pwd.text);
}
%end
3.3.2 安装theos插件
接下来,我们安装一下上面写的theos
插件。
⚠️注意:工程目录中,不允许包含
中文
,否则编译报错!
使用终端,进入
alipaypwddemo
目录
==> Error: /Applications/Xcode.app/Contents/Developer/usr/bin/make install and show require that you build a package before you try to install it.
以上错误解决方案
Makefile
中的设备IP地址不对,需要修改。