24-theos

前言

本篇文章,首先介绍下theos越狱开发工具包,同时演示一下 👉🏻 动态调试支付宝,获取登录密码。

一、环境配置

在安装theos工具包之前,需要安装adv-cmds组件和Cycript插件。

1.1 adv-cmds

adv cmdsPushFix依赖包中的一个组件,而PushFix依赖包则是Cydia插件必备依赖包(绝大多数Cydia程序的依赖)之一。

首先我们在Cydia中,搜索adv-cmds插件,👇🏻

直接点击右上角安装即可。(上图中是已安装过了的)

1.2 Cycript

Cycript之前我们讲过 👉🏻 19-Cycript,现在我们看看在越狱环境中是如何使用Cycript的。

⚠️注意:在越狱设备上,安装Cycript插件,需要先安装adv-cmds插件,因为被Cycript插件所依赖。

  1. 在手机上打开Cydia,安装Cycript插件👇🏻
  1. 在手机中打开WeChat,并找到它的进程(当然,需要usb连接手机)👇🏻
  1. 附加WeChat进程,进入cy环境
cycript -p 7619

⚠️注意:如果报错,也可直接使用名称 👉🏻 cycript -p WeChat

此时,我们就可以使用cycript命令进行调试了,例如获取UIApplication👇🏻

UIApp
-------------------------
#"<UIApplication: 0x10db0c260>"
导入cy文件

在越狱环境中,也可以使用自定义cy文件

  1. 在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);

  1. 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
  1. 附加WeChat进程,进入cy环境(可以使用进程id或名称)
cycript -p WeChat
  1. 导入cur_vc.cy脚本
@import cur_vc
-------------------------
{}
  1. 调用获取当前控制器方法
currentVC()
-------------------------
#"<MoreViewController: 0x10f36da00>"
文件冲突问题

使用cy文件,必须拷贝到Cycript指定目录下,这样很可能造成文件冲突。所以Cycript引入了命名空间,可以将cy文件拷贝到不同子目录中,然后按照指定规则导入。

  1. /usr/lib/cycript0.9目录下,已经默认存在一些子目录👇🏻
  1. com目录下,存在以作者名字命名的saurik目录,里面存储了官方的MS.cy脚本👇🏻
  1. 我们可以仿照以上目录结构,在com目录下,创建自定义目录👇🏻
  1. cur_vc.cy脚本,移动到自定义目录下👇🏻
mv ./cur_vc.cy /usr/lib/cycript0.9/com/Aron
  1. 附加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 动态分析

  1. 在设备中打开支付宝,并找到它的进程👇🏻
ps -A | grep Alipay
-------------------------
8147 ??         0:27.89 /var/containers/Bundle/Application/995CAC20-52A5-4D23-A605-FCF623931B79/AlipayWallet.app/AlipayWallet

支付宝其实是AlipayWallet

  1. 接着附加AlipayWallet进程的cy环境👇🏻
cycript -p AlipayWallet
  1. 导入cur_vc.cy脚本👇🏻
@import com.Aron.cur_vc
  1. 接下来就是进入动态调试阶段了。打开登录页面,查看当前控制器👇🏻
cy# currentVC()
#"<ALULoginContainerController: 0x151e9fc30>"
  1. 打印控制器下所有视图
#0x151e9fc30.view.recursiveDescription() .toString ()
  1. 找到登录按钮

⚠️注意:小技巧 👉🏻因为在cy环境中,中文使用了Unicode编码,直接搜中文是不行的。所以, “登录”文案的Unicode编码为\u767b\u5f55,搜索\u767b\u5f55

上图中共找到两处“登录”文案,第一处是“登录”,第二处是“换个方式登录”。我们找到了“登录”按钮的UIButton👇🏻

| <AUButton: 0x153c68bc0; baseClass = UIButton; frame = (16 367.5; 343 51); clipsToBounds = YES; alpha = 0.4; opaque = NO; layer = <CALayer: 0x2816a8400>>
   |    |    |    | <UIImageView: 0x15736de60; frame = (0 0; 343 51); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x28168a300>>
   |    |    |    | <UIButtonLabel: 0x153c691b0; frame = (151 13.5; 41 24); text = '\u767b\u5f55'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x28379dbd0>>
   |    |    |    |    | <_UILabelContentLayer: 0x281689ec0> (layer)
  1. 接着我们找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对象的onNext方法。

找到密码文本框
  1. 在密码框中输入123456
  2. 使用老套路,在输出的视图中,搜索123456
  1. 找到密码框的UITextField,从视图结构的层级分析:

UITextFieldaluInputBoxaluAccurateLoginBoxALUAccuratePWDView

密码框相关的父视图,和登录按钮的事件响应者是一样的,都是ALUAccuratePWDView控件。

3.2 静态分析

  1. 使用frida-ios-dump导出AlipayWallet
frida-ps -U

然后进入frida-ios-dump👇🏻

执行👇🏻

./dump.py 支付宝

得到支付宝.ipa包👇🏻

  1. 解压ipa,拷贝出MachO文件,拷贝class-dump至该目录👇🏻

使用class-dump导出头文件

class-dump -H AlipayWallet -o ./header
  1. 找到ALUAccuratePWDView.h文件

并没有找到aluAccurateLoginBox对象,但有一个命名为_loginBoxaluLoginBox对象。

  1. 接着定位到aluLoginBox.h

找到了命名为_passwordInputBoxaluInputBox对象。

  1. aluInputBox.h

定位到命名为_textFieldaluTextField对象,继承自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插件
  1. 使用nic.pl创建插件,nic.pl在theosbin`目录下👇🏻

我们可以配置环境变量,方便使用👇🏻

export THEOS=/opt/theos/bin/
export PATH=$THEOS:$PATH
nic.pl
  1. 输入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(桌面进程),杀掉后所有进程都会重启。(如果不修改,直接回车)
  1. 插件创建完成,生成tweak工程
  • AlipayPwdDemo.plist 👉🏻 附加应用的包名称
  • control 👉🏻 配置信息,版本号、作者名称等
  • Makefile 👉🏻 编译时用到的文件,需要配置
  • Tweak.x 👉🏻 代码,使用Logos语法
  1. 修改Tweak.x文件的后缀名

.x文件支持OC语法,我们需要支持OC、C/C++语法的.xm文件,故此将Tweak.x修改为Tweak.xm

  1. 修改Makefile
    手机安装插件,也是通过SSH连接的,所以在Makefile中,增加USB连接的IP和端口的配置👇🏻
export THEOS_DEVICE_IP=localhost
export THEOS_DEVICE_PORT=12345

由于Tweak.x文件的后缀名修改,在Makefile中,同步修改AlipayPwdDemo_FILES👇🏻

  1. 打开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
3.3.2 安装theos插件

接下来,我们安装一下上面写的theos插件。

⚠️注意:工程目录中,不允许包含中文,否则编译报错!

  1. 使用终端,进入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地址不对,需要修改。

3.4 theos与Xcode

总结

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容