一、环境
- 支付宝(
10.2.23
) - iOS 14.0(越狱非越狱都可以)
- Monkey
二、调试分析
2.1 工程配置
- 创建
Monkey
工程 -
frida
dump
支付宝砸壳包(需要越狱手机) -
MONKEYDEV_CLASS_DUMP
配置为YES
-
MONKEYDEV_RESTORE_SYMBOL
配置为YES
2.2 进入调试界面
- 运行工程直接终止了调试,终端输出如下:
LLVM Profile Error: Failed to write file "default.profraw": Operation not permitted
看这个意思是支付宝做了调试防护,打开sysctl
的Hook
:
//some app will crash with _dyld_debugger_notification
rebind_symbols((struct rebinding[1]){{"sysctl", my_sysctl, (void*)&orig_sysctl}},1);
这块代码在AntiAntiDebug
中,默认是注释状态,直接取消注释再次运行。
-
这个时候虽然调试没有挂掉,但是界面卡在启动页面终端页面有额外的信息,猜测可能做了
BundleId
相关的保护和其它检测,配置MONKEYDEV_DEFAULT_BUNDLEID
为YES
再次运行。
image.png
这个时候整个工程都安装不了了,看来MONKEYDEV_DEFAULT_BUNDLEID
配置是行不通的,撤销对MONKEYDEV_DEFAULT_BUNDLEID
的修改。 -
对
my_sysctl
打断点,看看调用栈
image.png
发现是AAAPBootStartPoint load
方法后调用了,那么直接Hook
这个方法:
%hook AAAPBootStartPoint
+ (void)load {
// %log; 干掉sysctl调用逻辑
}
%end
这个时候又出现LLVM Profile Error: Failed to write file "default.profraw": Operation not permitted
的错误了,进程直接被杀掉了。
4.AntiAntiDebug
中增加对exit
的Hook
typedef void (*sys_exit_ptr)(int);
static sys_exit_ptr origin_exit = NULL;
void my_exit(int code) {
NSLog(@"my_exit Hook");
}
rebind_symbols((struct rebinding[1]){{"exit", my_exit, (void*)&origin_exit}},1);

这个时候发现是
APDataCenterInterface
调用了setDefaultCryptKey
方法。在dump
的文件中查看下setDefaultCryptKey
的定义:
- (_Bool)setDefaultCryptKey:(CDUnknownFunctionPointerType)arg1;
搜了下CDUnknownFunctionPointerType
看着是一个指针,Hook
实现如下:
%hook APDataCenterInterface
- (_Bool)setDefaultCryptKey:(void *)arg1 {
return YES;
}
%end
Hook
之后支付宝疯狂调用my_sysctl
,暂时先不理会。
配置的
MONKEYDEV_CLASS_DUMP
会自动帮我们dump
头文件:
image.png
至此就顺利进入到支付宝调试界面了:

⚠️
bundleId
可以通过Hook
SecurityGuardStaticDataStore
的getExtraData
方法绕过。%hook SecurityGuardStaticDataStore //bundleId相关的防护 - (id)getExtraData:(NSString *)str { //key要返回32位字符串 NSString *key = @"12345678123456781234567812345678"; if([str isEqualToString:@"datacenter-default"]) { return key; } return %orig; } %end
2.3 绕过登录
要修改余额就要进入支付宝,首先要解决的就是登陆问题,是重签名的包为了防止封号最好是能绕过登陆直接进入余额页。
view debug
看了下页面层级,发现登录页面是直接盖在主页面上的,是present
出来的:

那么最直接的感受是让登录页面直接dismiss
,下一步按钮是AUButton
,action
是onInputMain
,target
是ALULoginNewcomerViewController

查看
onInputMain
的定义:
- (void)onInputMain;
修改onInputMain
实现:
@interface ALULoginNewcomerViewController : UIViewController
@end
%hook ALULoginNewcomerViewController
- (void)onLoginMain {
//直接让登录弹窗消失显示主页面
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)onInputMain {
[self dismissViewControllerAnimated:YES completion:nil];
}
%end
这里Hook
onLoginMain
的目的是在某些情景下会直接出现登录按钮。声明ALULoginNewcomerViewController
为了编译通过。
这个时候点击下一步就直接进入主页面了:

2.4 修改余额
由于 我的Tab 余额是个小程序页面,没有登录进去是个H5
报错页面,为了方便处理直接修改 理财Tab 的余额。
view debug
分析页面是FHRootViewController
,view
是FHAssetsHeaderViewV5
总资产和收益是两个UIlabel
:

查看
FHAssetsHeaderViewV5
头文件发现以下内容:
@property(retain, nonatomic) UILabel *yesterdayValueLabel; // @synthesize yesterdayValueLabel=_yesterdayValueLabel;
@property(retain, nonatomic) UILabel *yesterdayTitleLabel; // @synthesize yesterdayTitleLabel=_yesterdayTitleLabel;
@property(retain, nonatomic) UILabel *zzcValueLabel; // @synthesize zzcValueLabel=_zzcValueLabel;
@property(retain, nonatomic) UILabel *zzcTitleLabel; // @synthesize zzcTitleLabel=_zzcTitleLabel;
- (void)updateData:(id)arg1 style:(unsigned long long)arg2;
2.4.1 方式一:通过修改控件显示内容
这不就是总资产和昨日收益么,那么直接Hook
修改就可以改余额了:
%hook FHAssetsTopControlV5
- (void)updateData:(id)arg1 style:(unsigned long long)arg2 {
//arg1 FHAssetsHeaderV5DataModel holdedDataModel
%orig;
UILabel *totalMonayLabel = MSHookIvar<UILabel*>(self,"_zzcValueLabel");
UILabel *yesterdayIncomeLabel = MSHookIvar<UILabel*>(self,"_yesterdayValueLabel");
totalMonayLabel.text = @"888,888.88";
yesterdayIncomeLabel.text = @"666,666.66";
}
%end

这样就达到了修改余额的目的。
2.4.2 方式二:通过修改Model数据
方式一是通过找到显示的视图进行修改的,其实更好的解决方案是修改数据源,继续查看参数,在头文件中找到以下两个方法:

看着貌似是返回的没有登录的默认值--
:
%hook FHAssetsHeaderV5DataModel
- (NSString *)totalYesterdayProfitView {
NSLog(@"%@",%orig);
return @"333,333.33";
}
- (NSString *)latestTotalView {
NSLog(@"%@",%orig);
return @"9,999,999,999.99";
}
%end
这样就通过修改Model
类的返回值修改了数据了。

也可以通过修改FHAssetHeaderV2Engine
逻辑来达到相同的目录,只不过这里逻辑更复杂。
⚠️本文仅供交流学习。
当然更好的方式是在越狱设备上通过
tweak
工程去调试修改支付宝的逻辑。
网友评论