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
-------------------------
#"<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

针对WeChat进程,进入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

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

推荐阅读更多精彩内容