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
-------------------------
#""
导入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()
-------------------------
#""
文件冲突问题

使用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()
#""
  1. 打印控制器下所有视图
#0x151e9fc30.view.recursiveDescription() .toString ()
  1. 找到登录按钮

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

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

| >
   |    |    |    | >
   |    |    |    | >
   |    |    |    |    | <_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 

%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插件。

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

  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

总结

你可能感兴趣的:(24-theos)