美文网首页
iOS逆向支付宝调试:修改余额(Monkey)

iOS逆向支付宝调试:修改余额(Monkey)

作者: HotPotCat | 来源:发表于2021-05-27 15:37 被阅读0次

一、环境

  • 支付宝(10.2.23
  • iOS 14.0(越狱非越狱都可以)
  • Monkey

二、调试分析

2.1 工程配置

  • 创建Monkey工程
  • frida dump支付宝砸壳包(需要越狱手机)
  • MONKEYDEV_CLASS_DUMP配置为YES
  • MONKEYDEV_RESTORE_SYMBOL配置为YES

2.2 进入调试界面

  1. 运行工程直接终止了调试,终端输出如下:
LLVM Profile Error: Failed to write file "default.profraw": Operation not permitted

看这个意思是支付宝做了调试防护,打开sysctlHook

//some app will crash with _dyld_debugger_notification
rebind_symbols((struct rebinding[1]){{"sysctl", my_sysctl, (void*)&orig_sysctl}},1);

这块代码在AntiAntiDebug中,默认是注释状态,直接取消注释再次运行。

  1. 这个时候虽然调试没有挂掉,但是界面卡在启动页面终端页面有额外的信息,猜测可能做了BundleId相关的保护和其它检测,配置MONKEYDEV_DEFAULT_BUNDLEIDYES再次运行。

    image.png
    这个时候整个工程都安装不了了,看来MONKEYDEV_DEFAULT_BUNDLEID配置是行不通的,撤销对MONKEYDEV_DEFAULT_BUNDLEID的修改。
  2. 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中增加对exitHook

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);
image.png
这个时候发现是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

至此就顺利进入到支付宝调试界面了:


image.png

⚠️bundleId可以通过Hook SecurityGuardStaticDataStoregetExtraData方法绕过。

%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出来的:

image.png

那么最直接的感受是让登录页面直接dismiss,下一步按钮是AUButtonactiononInputMaintargetALULoginNewcomerViewController

image.png
查看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为了编译通过。

这个时候点击下一步就直接进入主页面了:

image.png

2.4 修改余额

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

image.png
查看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数据

方式一是通过找到显示的视图进行修改的,其实更好的解决方案是修改数据源,继续查看参数,在头文件中找到以下两个方法:


image.png

看着貌似是返回的没有登录的默认值--:

%hook FHAssetsHeaderV5DataModel

- (NSString *)totalYesterdayProfitView {
    NSLog(@"%@",%orig);
    return @"333,333.33";
}

- (NSString *)latestTotalView {
    NSLog(@"%@",%orig);
    return @"9,999,999,999.99";
}

%end

这样就通过修改Model类的返回值修改了数据了。

通过修改Model数据

也可以通过修改FHAssetHeaderV2Engine逻辑来达到相同的目录,只不过这里逻辑更复杂。
⚠️本文仅供交流学习。

当然更好的方式是在越狱设备上通过tweak工程去调试修改支付宝的逻辑。

相关文章

网友评论

      本文标题:iOS逆向支付宝调试:修改余额(Monkey)

      本文链接:https://www.haomeiwen.com/subject/uxflsltx.html