iOS逆向实战--030:theos

adv-cmds

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

Cydia中,安装adv-cmds插件

Cycript

在越狱环境中使用Cycript

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

Cydia中,安装Cycript插件

在设备中打开WeChat,并找到它的进程

ps -A | grep WeChat
-------------------------
7619 ??         0:39.37 /var/containers/Bundle/Application/454EA887-EB3B-43B3-ABFD-B9B2CA006981/WeChat.app/WeChat

针对WeChat进程,进入cy环境

root# cycript -p 7619

此时我们并没有污染WeChat,但可以使用cycript命令进行调试了

例如:获取UIApplication

UIApp
-------------------------
#""
导入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

针对WeChat进程,进入cy环境。可以使用进程id或名称

cycript -p WeChat

导入cur_vc脚本

@import cur_vc
-------------------------
{}

获取当前控制器

currentVC()
-------------------------
#""

使用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

进入WeChat进程的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()
-------------------------
#""

打印控制器下所有视图

#0x10bf68860.view.recursiveDescription() .toString ()

首先找到登录按钮

在输出的视图中,搜索“登录”文案,找不到任何结果。因为在cy环境中,中文使用了Unicode编码

将“登录”文案,通过Unicode编码为\u767b\u5f55

在输出的视图中,搜索\u767b\u5f55

  • 共找到两处“登录”文案,第一处是“登录”,第二处是“换个方式登录”

找到“登录”按钮的UIButton

  |    |    | >
  |    |    |    | >
  |    |    |    | >
  |    |    |    |    | <_UILabelContentLayer: 0x283f49d20> (layer)

找到UIButton的事件响应者和事件名称

找到UIButton的事件响应者

#0x118e08500.allTargets
-------------------------
[NSSet setWithArray:@[#">",#">"]]]
  • 找到两个响应者,一个是UIButton自身,另一个是ALUAccuratePWDView控件

确认UIButton的触摸事件

#0x118e08500.allControlEvents
-------------------------
64
  • 64对应的UIControlEventTouchUpInside枚举值

找到UIControlEventTouchUpInside的定义

UIControlEventTouchUpInside                                     = 1 <<  6
  • 1左移6位,即:26次方,结果为64

UIButton触发UIControlEventTouchUpInside,事件响应者为ALUAccuratePWDView

找到响应者的事件名称

通过响应者和触摸事件,找到事件名称

[#0x118e08500 actionsForTarget: #0x118e501a0 forControlEvent: 64]
-------------------------
@["onNext"]
  • 参数1为响应者对象,参数2为触摸事件的枚举值,返回事件名称onNext

登录的UIButton可触发ALUAccuratePWDView对象的onNext方法

找到密码文本框

在密码框中输入123456

使用老套路,在输出的视图中,搜索123456

  • 找到密码框的UITextField

从视图结构的层级分析:
UITextFieldaluInputBoxaluAccurateLoginBoxALUAccuratePWDView

和密码框相关的父视图,可追寻至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对象,但有一个命名为_loginBoxaluLoginBox对象

找到aluLoginBox.h文件

  • 找到了命名为_passwordInputBoxaluInputBox对象

找到aluInputBox.h文件

  • 找到了命名为_textFieldaluTextField对象,继承自UITextField

可以锁定密码文本框的查找路径:

selfALUAccuratePWDView)→_loginBoxaluLoginBox)→_passwordInputBoxaluInputBox)→_textFieldUITextField)→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语法,我们需要支持OCC/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 

%hook ALUAccuratePWDView

- (void)onNext {
  
  UIView *view1 = MSHookIvar(self, "_loginBox");
  UIView *view2 = MSHookIvar(view1, "_passwordInputBox");
  UITextField *pwd = MSHookIvar(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.pl15,创建iphone/tweak插件
  • 输入的包名称,类似BundleID,要求全部小写
  • 需要支持OCC/C++语法,修改Tweak.x文件后缀名,改为.xm
  • 文件后缀名的修改,同步修改Makefile文件中的配置
  • Makefile文件中,增加USB连接的IP和端口

安装theos插件

  • 工程目录中,不允许包含中文,否则编译报错
  • 清理工程:make clean
  • 编译工程:make
  • 打包:make package
  • 安装:make install

theosXcode

  • 多个版本的Xcode,需要指定Xcode路径
  • 获取Xcode路径,使用xcode-select -p
  • 指定Xcode路径,使用xcode-select --switch /Applications/Xcode.app/Contents/Developer

你可能感兴趣的:(iOS逆向实战--030:theos)