一、Theos配置
Theos
是一个不需要使用Xcode
就能管理,开发和部署iOS
软件的跨平台开发工具。进行越狱iOS
开发扩展或者调整时,Theos
是一件非常重要的工具,很多越狱开发都使用了这个工具。
推荐配置在自己的家目录,不要配置在/opt
目录。
1.1 ldid
ldid
是专门用来签名iOS
可执行文件的工具,用来代替Xcode
的codesign
。专门用于越狱插件的签名。theos
开发插件依赖ldid
。
1.2 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):
nic.pl
出现选择模板则配置成功了。
二、动态调试支付宝
2.1 动态分析支付宝登录密码
2.1.1 分析登录点击逻辑
使用手机端cycript
附加支付宝进程
zaizai:~ root# cycript -p AlipayWallet
cy# HPCurrentVC()
#"<ALULoginContainerController: 0x10bd75560>"
cy# #0x10bd75560.view.recursiveDescription().toString()
搜索下输入的密码123456
:
可以看到密码是
aluTextField 0x10cadf800
在aluInputBox 0x121cb4b40
中。
再搜索下登录(由于编码问题,先在python
环境中转码再搜索):
>>> str = u"登录"
>>> str
u'\u767b\u5f55'
>>>
登录按钮是
AUButton 0x12098c9c0
。
查看AUButton 0x12098c9c0
的allTargets
:
cy# #0x12098c9c0.allTargets
[NSSet setWithArray:@[#"<ALUAccuratePWDView: 0x121cad170; frame = (0 0; 375 667); layer = <CALayer: 0x2838424a0>>",#"<AUButton: 0x12098c9c0; baseClass = UIButton; frame = (16 367.5; 343 51); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x2839c89c0>>"]]]
一个是自己,一个是ALUAccuratePWDView 0x121cad170
。也就是登录按钮点击事件调用了ALUAccuratePWDView
的方法。
查看AUButton 0x12098c9c0
的allControlEvents
:
cy# #0x12098c9c0.allControlEvents
64
这里的
64
就是26。UIControlEventTouchUpInside = 1 << 6,
查看AUButton 0x12098c9c0
调用的的ALUAccuratePWDView 0x121cad170
对象的方法actionsForTarget: forControlEvent:
:
cy# [#0x12098c9c0 actionsForTarget:#0x121cad170 forControlEvent:64]
@["onNext"]
这样就获取到了登录按钮(AUButton
)点击调用了ALUAccuratePWDView
的onNext
方法。
dump
头文件获取onNext
方法如下:
- (void)onNext;
所以Hook
代码如下:
%hook ALUAccuratePWDView
- (void)onNext {
}
%end
2.1.2 分析密码逻辑
上面已经找到了登录按钮调用方法,接下来要分析输入框。对于输入框aluTextField 0x10cadf800
在aluInputBox 0x121cb4b40
中。
而在ALUAccuratePWDView 0x121cad170
中有如下代码:
@property(retain, nonatomic) aluLoginBox *loginBox; // @synthesize loginBox=_loginBox;
那么aluInputBox
应该和aluLoginBox
有关,在aluLoginBox
中有如下代码:
aluInputBox *_loginIdInputBox;
aluInputBox *_passwordInputBox;
在aluInputBox
中正好有一个aluTextField
:
aluTextField *_textField;
那么猜测_passwordInputBox
应该就是aluInputBox 0x121cb4b40
。
总结:在ALUAccuratePWDView 0x121cad170 -> _loginBox -> _passwordInputBox->_textField
验证
cy# #0x121cad170->_loginBox->_passwordInputBox->_textField
#"<aluTextField: 0x10cadf800; baseClass = UITextField; frame = (2 0; 220.5 45); text = '123456'; opaque = NO; autoresize = W; tintColor = UIExtendedSRGBColorSpace 0.0862745 0.466667 1 1; gestureRecognizers = <NSArray: 0x283e19590>; placeholder = \xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe7\x99\xbb\xe5\xbd\x95\xe5\xaf\x86\xe7\xa0\x81; borderStyle = None; background = <_UITextFieldNoBackgroundProvider: 0x28319de40: textfield=<aluTextField 0x10cadf800>>; layer = <CALayer: 0x2838400a0>>"
aluTextField: 0x10cadf800
就是密码输入框:
所以获取密码的方式为:self -> _loginBox -> _passwordInputBox->_textField
同理可以获得登录账户:self-> _labelLoginID
修改Hook
代码如下:
%hook ALUAccuratePWDView
- (void)onNext {
//账户
//self-> _loginBox->_loginIdInputBox-> _textField
//密码
//self -> _labelLoginID
}
%end
2.2 Theos获取支付宝密码
2.2.1 创建Tweak工程
➜ HPProject 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
Project Name (required): AlipayHook
Package Name [com.yourcompany.alipayhook]: com.hotpotcat.alipayhook
Author/Maintainer Name [ZP]:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.alipay.iphoneclient
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: AlipayWallet
Instantiating iphone/tweak in alipayhook/...
Done.
-
tweak
:15
代表创建插件。 -
Project Name
:工程名。 -
Package Name
:包名称,都小写不能驼峰。 -
Author/Maintainer Name
:不填默认电脑名称 -
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]
:要附加的进程(BundleId
),不写默认springboard
。 -
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]
:插件安装后要杀掉的进程。默认SpringBoard
。⚠️推荐给默认值,给应用进程有可能Hook
失败杀不掉App
。
这样就创建了插件工程了。
BundleId获取
zaizai:~ root# cycript -p AlipayWallet cy# APPID @"com.alipay.iphoneclient"
2.2.2 Tweak工程配置
工程结构如下:
直接将工程拖到
Sublime Text
中:
-
.plist
中是包的名称
{ Filter = { Bundles = ( "com.alipay.iphoneclient" ); }; }
-
control
是关于工程配置。版本号等相关信息。 -
makefile
是编译配置
安装到手机是走的SSH
安装, 需要增加配置设置IP
和端口号
。这里配置的是走的USB
export THEOS_DEVICE_IP=localhost
export THEOS_DEVICE_PORT=12345
可以配置到
.zshrc
中,这样不用每个工程都配置了。
-
Tweak.x
是写logos
hook
代码的地方,一般会将后缀改为.xm
。需要同时修改makefile
的AlipayHook_FILES = Tweak.xm
。
2.2.3 Hook代码
#import <UIKit/UIKit.h>
%hook ALUAccuratePWDView
- (void)onNext {
NSLog(@"\n\n\n🍉🍉🍉🍉🍉🍉🍉\n\n\n");
UIView *loginBox = MSHookIvar<UIView*>(self,"_loginBox");
//账户
//self-> _labelLoginID
UILabel *labelLoginID = MSHookIvar<UILabel *>(self,"_labelLoginID");
NSString *accountStr = labelLoginID.text;
NSLog(@"账户:%@",accountStr);
//密码
//self -> _loginBox -> _passwordInputBox->_textField
UIView *passwordInputBox = MSHookIvar<UIView *>(loginBox,"_passwordInputBox");
UITextField *pwdTextField = MSHookIvar<UITextField *>(passwordInputBox,"_textField");
NSString *pwdStr = pwdTextField.text;
NSLog(@"密码:%@",pwdStr);
NSLog(@"\n\n\n🍉🍉🍉🍉🍉🍉🍉\n\n\n");
}
%end
2.2.4 编译、打包、安装
编译make
➜ alipayhook 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 AlipayHook…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (armv7)…
==> Linking tweak AlipayHook (armv7)…
ld: warning: building for iOS, but linking in .tbd file (/Users/zaizai/.HotpotCat/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd) built for iOS Simulator
==> Generating debug symbols for AlipayHook…
rm /Users/zaizai/HPProject/alipayhook/.theos/obj/debug/armv7/Tweak.xm.mm
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (arm64)…
==> Linking tweak AlipayHook (arm64)…
ld: warning: building for iOS, but linking in .tbd file (/Users/zaizai/.HotpotCat/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd) built for iOS Simulator
==> Generating debug symbols for AlipayHook…
rm /Users/zaizai/HPProject/alipayhook/.theos/obj/debug/arm64/Tweak.xm.mm
==> Merging tweak AlipayHook…
==> Signing AlipayHook…
打包make package
➜ alipayhook 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 AlipayHook…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak AlipayHook…
dm.pl: building package `com.hotpotcat.alipayhook:iphoneos-arm' in `./packages/com.hotpotcat.alipayhook_0.0.1-1+debug_iphoneos-arm.deb'
打包完成后生成.deb
文件。
安装 make install
➜ alipayhook make install
==> Installing…
Selecting previously unselected package com.hotpotcat.alipayhook.
(Reading database ... 1927 files and directories currently installed.)
Preparing to unpack /tmp/_theos_install.deb ...
Unpacking com.hotpotcat.alipayhook (0.0.1-4+debug) ...
Setting up com.hotpotcat.alipayhook (0.0.1-4+debug) ...
==> Unloading AlipayWallet…
安装好之后正常对应的进程会被杀掉,安装的插件会出现在cydia
的已安装
中:
-
make
编译 -
make package
打包 -
make install
安装 - 工程目录中不能有中文
-
make clean
清空缓存 - 如果有多个
XCode
需要选择XCode
。
➜ alipayhook xcode-select -p
/Applications/Xcode.app/Contents/Developer
➜ alipayhook xcode-select --switch /Applications/Xcode.app/Contents/Developer
⚠️在
makefile
同级目录编译。
make package;make install
可以同时进行。
如果安装没有杀掉进程,发现没有Hook
成功,那么创建工程的时候直接
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]
直接给默认值SpringBoard
。
运行
通过console
查看日志看是否获取账户密码成功。
这个时候就成功获得了账号密码。