前言:现在全民买基的情况下,女票也买了一些,对于买基新手来说,总是想打开支付宝看看到底今天是赚是赔,女票说支付宝收益第二天才显示太慢了,要是能打开直接看到收益就好了,作为一个合格的程序员,怎么能不满足这小小的需求?写篇记录一下过程。

效果图:

原理:监控请求接口,获取需要的基金数据,根据持有的每个基金实时净值,计算实时收益,弹窗显示计算的实时总收益;

开始

工具:

  1. CrackerXI+
  2. 爱思助手
  3. Class-dump
  4. MonkeyDev

一、砸壳

(一)越狱机安装CrackerXI+
  1. 在cydia 中添加 源地址 http://cydia.iphonecake.com 或者 http://apt.cydiami.com ,添加成功后,在cydia中搜索CrackerXI+并安装。
  2. 打开CrackerXI+,在settings中设置CrackerXI Hook为enable

(二)砸壳

  1. 先在App store下载安装蚂蚁财富,然后打开CrackerXI+选中蚂蚁财富,然后选择 YES,FULL IPA 开始砸壳
  2. 砸壳完毕会显示砸壳后IPA的路径的路径/var/mobile/Documents/CrackerXI/
  3. 打开爱思助手或者用ssh链接都可以,按照路径导出ipa包就可以了。


终端输入以下命令 可以查看有么有砸成功:

otool -l 可执行文件路径 | grep crypt


cryptid 0 砸壳成功

二、安装MonkeyDev

git地址:https://github.com/AloneMonkey/MonkeyDev

准备

  1. 安装最新的theos
 sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
  1. 安装ldid(如安装theos过程安装了ldid,跳过)
 brew install ldid

安装

你可以通过以下命令选择指定的Xcode进行安装:

  sudo xcode-select -s /Applications/Xcode-beta.app

默认安装的Xcode为:

  xcode-select -p

执行安装命令:

  sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)"

卸载

  sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-uninstall)"

更新

  sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-update)"

安装成功效果图:

三、逆向分析

(一)Class-dump导出头文件

class-dump -H [.app文件的路径] -o [输出文件夹路径]

导出如下:

(二)新建monkeyDev工程

把IPA放入工程指定目录
运行程序分析界面:

页面是一个WKWebView,我们只需要获取H5页面请求后的数据就可以了。然后我们用safari开发模式看一下页面,结果在控制台看到了接口打印数据,正是我们需要的数据,线程回调结果:


NSOperation结合NSURLConnection,搜索头文件,找到一个 DTURLRequestOperation文件,继承了NSURLConnectionDataDelegate, NSURLProtocolClient, NSURLSessionDataDelegate协议,还包含了request和response,一看就知道是和wkwebview请求有关,尝试拦截一下。


看到可以拦截到WKWebview的请求,下一步从众多请求中找出我们需要的请求数据就可以了。

四、Hook

线程名称包含在请求头中,根据线程名筛选需要的请求结果:

// 自选关注的基金信息
com.alipay.wealthbffweb.fund.optional.queryV3
// 持有的基金信息
com.alipay.wealthbffweb.fund.commonAsset.queryAssetDetail

筛选要求获取的请求结果

// 获取请求返回数据
+(void)hookWithOperation:(DTRpcOperation *)operation{@try {NSDictionary *allHTTPHeaderFields = operation.request.allHTTPHeaderFields;NSString *type = allHTTPHeaderFields[@"Operation-Type"];if([type isEqualToString: @"com.alipay.wealthbffweb.fund.optional.queryV3"]){// 计算收益[self calculateIncomeWithOperation:operation];}else if([type isEqualToString: @"com.alipay.wealthbffweb.fund.commonAsset.queryAssetDetail"]){// 获取份额[self getFundSharesWithOperation:operation];}} @catch (NSException *exception) {NSLog(@"error:%@", exception);}
}#pragma mark - holdingMap
// 份额 本地保存路径
+ (NSString *)FundSharesDicPath {static NSString *path;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentsDirectory = [paths objectAtIndex:0];path = [documentsDirectory stringByAppendingPathComponent:@"FundSharesDic.plist"];});return path;
}+ (void)loadFundSharesDic {NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithContentsOfFile:self.FundSharesDicPath];if (!dic) {dic = NSMutableDictionary.dictionary;}fundSharesDic = dic;
}/// 读取本地保存的份额
+ (NSString *)getFundSharesWithFundCode:(NSString *)fundCode { //fundCode 基金代码if (fundSharesDic == nil) {[self loadFundSharesDic];}return fundSharesDic[fundCode];
}#pragma mark - handle
// 计算收益
+ (void)calculateIncomeWithOperation:(DTRpcOperation *)operation {NSDictionary *json = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableLeaves error:nil];if (json && [json isKindOfClass:NSDictionary.class]) {// 解析数据NSMutableDictionary *m_json = [json mutableCopy];NSMutableDictionary *result = [m_json[@"result"] mutableCopy];NSArray *optionalList = result[@"optionalList"];NSMutableArray *modifyList = NSMutableArray.array;NSMutableArray *incomes = NSMutableArray.array;for (NSDictionary *obj in optionalList) {NSMutableDictionary *model = [obj mutableCopy];BOOL holdingPosition = [model[@"holdingPosition"] boolValue];if (holdingPosition) {// 获取份额NSString *value = [self getFundSharesWithFundCode:model[@"fundCode"]];// 获取时间NSString *netValueReportDate = model[@"netValueReportDate"];NSString *estimateDate = model[@"estimateDate"];// 有效份额 才参与统计if (value.doubleValue > 0) {NSMutableArray *contentTags = NSMutableArray.array;// 预估时间不等于网络净值时间时 统计收益if ([netValueReportDate isKindOfClass:NSString.class] &&[estimateDate isKindOfClass:NSString.class]) {NSString *netValue = model[@"netValue"];if (![netValueReportDate isEqualToString:estimateDate]) {NSString *estimateNetValue = model[@"estimateNetValue"];// 没有预估时 忽略收益if (estimateNetValue.doubleValue && netValue.doubleValue) {double income = (estimateNetValue.doubleValue - netValue.doubleValue) * value.doubleValue;[incomes addObject:@(income)];[contentTags addObject:@{@"visible": @YES,@"text": [NSString stringWithFormat:@"收益:%0.2f", income],@"type": @"BULL_FUND",}];}} else {NSString *dayOfGrowth = model[@"dayOfGrowth"];if (dayOfGrowth.length) {NSString *modifyWorth = [NSString stringWithFormat:@"%0.4f",netValue.doubleValue / (1 + dayOfGrowth.doubleValue)];double income = (netValue.doubleValue - modifyWorth.doubleValue) * value.doubleValue;[incomes addObject:@(income)];[contentTags addObject:@{@"visible": @YES,@"text": [NSString stringWithFormat:@"净收:%0.2f", income],@"type": @"BULL_FUND",}];}}}if (!contentTags.count) {[contentTags addObject:@{@"visible": @YES,@"text": [NSString stringWithFormat:@"份额:%@", value],@"type": @"BULL_FUND",}];}model[@"contentTags"] = contentTags;} else {model[@"contentTags"] = @[@{@"visible": @YES,@"text": @"点击读取份额",@"type": @"BULL_FUND",},];}}[modifyList addObject:model];}result[@"optionalList"] = modifyList;m_json[@"result"] = result;NSData *jsonData = [NSJSONSerialization dataWithJSONObject:m_json options:NSJSONWritingPrettyPrinted error:nil];operation.responseData = jsonData;if (incomes.count) {NSDecimalNumber *sum = [incomes valueForKeyPath:@"@sum.doubleValue"];NSString *desc = [NSString stringWithFormat:@"有效统计%ld只,当前总收益%0.2f", incomes.count, sum.doubleValue];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{UILabel *label = UILabel.new;UIWindow *keyWindow = UIApplication.sharedApplication.keyWindow;label.frame = CGRectMake(20, CGRectGetMaxY(keyWindow.frame) - 118, CGRectGetMaxX(keyWindow.frame) - 40, 40);label.layer.cornerRadius = 5.f;label.layer.masksToBounds = YES;label.backgroundColor = [UIColor redColor];label.text = desc;label.textAlignment = NSTextAlignmentCenter;label.textColor = UIColor.whiteColor;label.font = [UIFont systemFontOfSize:16];[keyWindow addSubview:label];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int6![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807142125730.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjYwMjc3Mw==,size_16,color_FFFFFF,t_70)
4_t)(2.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[label removeFromSuperview];});});}}
}// 获取份额
+ (void)getFundSharesWithOperation:(DTRpcOperation *)operation {NSDictionary *json = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableLeaves error:nil];if (json && [json isKindOfClass:NSDictionary.class]) {// 解析数据NSMutableDictionary *result = json[@"result"];NSString *availableShare = result[@"availableShare"];//        设置本地记录份额if (availableShare.doubleValue > 0) {NSString *fundCode = result[@"fundCode"];if (fundSharesDic == nil) {[self loadFundSharesDic];}fundSharesDic[fundCode] = availableShare;[fundSharesDic writeToFile:self.FundSharesDicPath atomically:YES];}}
}

最终效果:

最后放上项目地址:
https://github.com/FORMAT-qi/hookAntWealth

砸过壳的app下载地址:
链接: https://pan.baidu.com/s/1UUQhm9ymM74d0UtbnqrEew
密码: n49h

@end

iOS逆向-支付宝基金之统计实时收益相关推荐

  1. iOS逆向-手把手教你写支付宝蚂蚁森林收集能量助手

    iOS逆向-手把手教你写支付宝蚂蚁森林收集能量助手 前言 发现iOS支付宝逆向的分析并不多,蚂蚁森林基于H5应用 套着UIWebView 基本也没这类JS和原生交互分析的帖子,就拿此练手吧 作技术分享 ...

  2. mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包

    python自动撸支付宝基金答题红包 背景 在一个套利撸羊毛群里,一群小伙伴每天在不懈地撸支付宝的基金红包,于是自己也加入了撸红包大军. 于是就重复地在不同的基金里面,看有没有答题红包,有的话就点进去 ...

  3. iOS 逆向 - 收藏集 - 掘金

    分分钟让你在 微信运动 霸占榜首 - iOS - 掘金 为了纪念我失去的已越狱iPad, 不得不写点什么. 所以...以下内容 不需要越狱. 微信运动 6万步是什么概念,我不知道,因为我没走过,不过有 ...

  4. android微信逆向工程,iOS逆向 - 微信自动添加好友

    相关源码:Github地址 一.前言 本篇主要实现在微信上自动添加好友,从而熟悉 iOS 逆向分析的过程. 二. 工具 2.1 MacBook 软件 制作 Tweak 的工具 端口转发,可以让我们通过 ...

  5. iOS逆向-微信自动添加好友

    前言 上次完成了 macOS 版微信小助手,现在终于有(xian)时(de)间(huang)来说说 iOS 逆向了.本篇主要实现在微信上自动添加好友(即自动验证新的朋友申请),从而熟悉 iOS 逆向分 ...

  6. iOS逆向实战与工具使用(微信添加好友自动确认)

    iOS逆向实战与工具使用(微信添加好友自动确认) 原文链接 源码地址 WeChatPlugin-iOS Mac OS 版微信小助手(远程控制.消息防撤回.自动回复.微信多开) 一.前言 本篇主要实现在 ...

  7. IOS 逆向开发(二)密码学 HASH

    IOS 逆向开发(二)密码学 HASH 1. HASH算法简介 1.1 HASH是什么? 1.2 Hash的特点 1.3 Hash的作用 1.4 Hash有哪些流行的算法 1.5 Hash算法的碰撞 ...

  8. iOS逆向(1)——利用ipa重签名,3分钟iPhone安装多个微信

    本文要达成如图效果,在一台iPhone上安装第二个微信: 准备: Xcode 微信ipa(可通过iTool进行下载) 重签名脚本 步骤 打开Xcode,新建Single View App项目,名字可以 ...

  9. Android和IOS 调用 支付宝和微信 支付方法

    Android和IOS 调用 支付宝和微信 支付方法 转载于:https://www.cnblogs.com/huangzineng/p/7235705.html

最新文章

  1. 4.IE故障[网页打不开]的解决方法:
  2. Robinhood应用宣布添加BCH和LTC交易
  3. Redis+keepalived 主从搭建
  4. 汇编题20200330
  5. JVM_07 Class文件结构
  6. wxWidgets:wxKeyEvent类用法
  7. Atitit截屏功能的设计解决方案
  8. linux之tail 命令
  9. python定时发送信息_python实现定时发送消息
  10. 阿里云ECI如何6秒扩容3000容器实例?
  11. IT永远也不可能做到整体外包,这句话是我说的。。。
  12. docker 日志_解决docker容器日志导致主机磁盘空间满了的情况
  13. java json插件安装_IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体...
  14. vsftpd的基于pam_mysql的虚拟用户机制实现数据传输
  15. 万万没想到之抓捕孔连顺
  16. Java 设计模式 代理模式
  17. 杰控组态变量单向数据传递的经验
  18. CSS的样式与优先级
  19. excel查找空值快捷键_Excel快捷键查询
  20. 愤怒!竟然还有学校还在教 Java 的 Swing

热门文章

  1. 品牌策划中该如何在“细节之处”刺激受众痛点?
  2. Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析
  3. javaScript 561. 数组拆分 I
  4. html+css+js按键定位搜索框
  5. Wordpress搭载七牛云CDN图片不显示问题解决
  6. 解决win10蓝牙搜索到小爱音箱无法连接问题
  7. 抗干扰神器光耦的原理及应用
  8. Fiddler中inspector的用法2-1
  9. bitly短网址v4版本的操作及sample code
  10. 用手机远程控制扫描仪