adv-cmds
adv cmds是PushFix依赖包中的一个组件,而PushFix依赖包则是Cydia插件必备依赖包(绝大多数Cydia程序的依赖)之一在
Cydia中,安装adv-cmds插件
![]()
Cycript
在越狱环境中使用
Cycript在越狱设备上,安装
Cycript插件。需要先安装adv-cmds插件,因为被Cycript插件所依赖在
Cydia中,安装Cycript插件
![]()
在设备中打开
ps -A | grep WeChat ------------------------- 7619 ?? 0:39.37 /var/containers/Bundle/Application/454EA887-EB3B-43B3-ABFD-B9B2CA006981/WeChat.app/WeChat针对
cy环境root# cycript -p 7619此时我们并没有污染
cycript命令进行调试了例如:获取
UIApplicationUIApp ------------------------- #"<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针对
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进入
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位,即:2的6次方,结果为64当
UIButton触发UIControlEventTouchUpInside,事件响应者为ALUAccuratePWDView
找到响应者的事件名称
通过响应者和触摸事件,找到事件名称
[#0x118e08500 actionsForTarget: #0x118e501a0 forControlEvent: 64] ------------------------- @["onNext"]
参数1为响应者对象,参数2为触摸事件的枚举值,返回事件名称onNext登录的
UIButton可触发ALUAccuratePWDView对象的onNext方法
找到密码文本框
在密码框中输入
123456使用老套路,在输出的视图中,搜索
123456
![]()
- 找到密码框的
UITextField从视图结构的层级分析:
UITextField→aluInputBox→aluAccurateLoginBox→ALUAccuratePWDView和密码框相关的父视图,可追寻至
ALUAccuratePWDView控件。此控件也是“登录”按钮的事件响应者
静态分析
使用
frida-ios-dump导出Alipayfrida-ps -U ------------------------- PID Name 7652 Cydia 7619 微信 8147 支付宝 ...dump.py 支付宝解压
ipa,拷贝出MachO文件,使用class-dump导出头文件class-dump -H AlipayWallet -o ./header
- 小窍门:将包内容按大小排序,可快速定位
MachO文件找到
ALUAccuratePWDView.h文件
![]()
- 并没有找到
aluAccurateLoginBox对象,但有一个命名为_loginBox的aluLoginBox对象找到
aluLoginBox.h文件
![]()
- 找到了命名为
_passwordInputBox的aluInputBox对象找到
aluInputBox.h文件
![]()
- 找到了命名为
_textField的aluTextField对象,继承自UITextField可以锁定密码文本框的查找路径:
self(ALUAccuratePWDView)→_loginBox(aluLoginBox)→_passwordInputBox(aluInputBox)→_textField(UITextField)→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语法,我们需要支持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_FILESAlipayPwdDemo_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.pl→15,创建iphone/tweak插件- 输入的包名称,类似
BundleID,要求全部小写- 需要支持
OC、C/C++语法,修改Tweak.x文件后缀名,改为.xm- 文件后缀名的修改,同步修改
Makefile文件中的配置Makefile文件中,增加USB连接的IP和端口安装
theos插件
- 工程目录中,不允许包含中文,否则编译报错
- 清理工程:
make clean- 编译工程:
make- 打包:
make package- 安装:
make install
theos与Xcode
- 多个版本的
Xcode,需要指定Xcode路径- 获取
Xcode路径,使用xcode-select -p- 指定
Xcode路径,使用xcode-select --switch /Applications/Xcode.app/Contents/Developer












网友评论