17、Logos使用摘要

news2024/11/26 1:36:24

        本篇将讲述如何将WX的设置界面添加两个自定义的UI行: 包含是否启用某功能的开关,以及手速设置.并且如何定位到修改的代码.采用的是砸过壳的包.

        成品也就是增加了两个UI及开关联动效果、

界面分析

  • 如果我们要破解别人的App, 首先从界面UI入手,定位UI
    • 1、使用class-dump导出全部头文件
class-dump -H WeChat -o ./WeChatHeaders
    • 2、使用MonkeyDev重签名wx8.0.2
    • 3、真机运行项目,使用Debug View找到设置页的控制器名称 NewSettingViewController
    • 4、使用Cycript附加当前进程
sh cyConnect.sh
    • 5、使用 pvcs() 找到设置页的控制器
# pvcs()
    • 6、打印控制器View下的所有视图,从中找到关键类 WCTableViewManager
    • 7、打开WCTableViewManager.h文件,找到数据源和关键方法

      • tableView数据源关键方法

    • 8、精准定位注入点
      • 找到影响UITableView展示行数的数据源
      • 对WCTableViewManager中的 numberOfSectionsInTableView方法进行HOOK,打印数组总数和Section数
    • 想要精准定位,需要在WCTableViewManager中,对所属控制器进行判断
      • 找到WCTableViewManager和控制器的关联,找到WCTableViewManager
      • 找到UITableView,通过响应链条,向下找一层 0xAddress.tableView.nextResponder
      • 通过响应链条,再向下找一层: 0xAddress.tableView.nextResponder.nextResponder,
      • 最终找到 NewSettingViewController
    • 9、修改界面
      • 确保代码仅在NewSettingViewController中生效,接下来对几个关键方法进行HOOK,将界面修改成我们预期的样子
      • 增加Section
// 增加Section
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if([tableView.nextResponder.nextResponder isKindOfClass: %c(NewSettingViewController)]) {
        return %orig+1;
    }
    return %orig;
}
      • 增加Section下的row
//Section下面的Rows,增加2行
- (NSInteger)tableView:(UITableView *)tableView  numberOfRowsInSection:(NSInteger)section{
    if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)] && (section==[self numberOfSectionsInTableView:tableView]-1)){
           return 2;
       }
}
      • 自定义cell高度
//自定义Cell的高度,固定为60
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
   if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)] && (indexPath.section==[self numberOfSectionsInTableView:tableView]-1)){
       return 60;
   }
   return %orig;
}
      • 自定义Cell背景、查看运行结果
//自定义Cell,只设置背景色,看一下运行后的结果,确认HOOK代码的有效性
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)] && (indexPath.section==[self numberOfSectionsInTableView:tableView]-1)){
       NSString *strIdentifier=[NSString stringWithFormat:@"HookCell_%i",(int)indexPath.row];
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:strIdentifier];
       if (cell == nil) {
           cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strIdentifier];
       }
       if(indexPath.row==0){
           cell.backgroundColor=[UIColor redColor];
       }
       else{
           cell.backgroundColor=[UIColor blueColor];
       }
       return cell;
   }
   return %orig;
}
    • 10、完善界面
      • 确保HOOK代码是有效的,完善自定义Cell的界面
      • 将自定义图标,导入WeChat包,
      • 完善tableView:cellForRowAtIndexPath方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)] && (indexPath.section==[self numberOfSectionsInTableView:tableView]-1)){
       NSString *strIdentifier=[NSString stringWithFormat:@"HookCell_%i",(int)indexPath.row];
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:strIdentifier];
       if (cell == nil) {
           cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strIdentifier];
       }       
       cell.backgroundColor = [UIColor whiteColor];
       cell.selectionStyle = UITableViewCellSelectionStyleNone;
       if(indexPath.row==0){
           BOOL isAutoEnable = NO;
           cell.imageView.image = [UIImage imageNamed:(isAutoEnable ? @"unlocked" : @"locked")];
           cell.textLabel.text = @"自动抢红包";
           UISwitch *switchAuto = [[UISwitch alloc] init];
           [switchAuto addTarget:self action:@selector(hookAutoAction:) forControlEvents:UIControlEventValueChanged];
           switchAuto.on=isAutoEnable;
           cell.accessoryView = switchAuto;
       }
       else{
           cell.imageView.image = [UIImage imageNamed:@"clock"];
           cell.textLabel.text = @"等待时间(秒)";
           UITextField *txtWait=[[UITextField alloc] initWithFrame:CGRectMake(0, 0, 150, 40)];
           txtWait.borderStyle = UITextBorderStyleRoundedRect;
           txtWait.backgroundColor = [UIColor whiteColor];
           txtWait.keyboardType = UIKeyboardTypeNumberPad;
           txtWait.returnKeyType = UIReturnKeyDone;
           cell.accessoryView = txtWait;
       }
       return cell;
   }
   return %orig;
}
      • 增加UISwitch切换时,触发的hookAutoAction:方法
%new
-(void)hookAutoAction:(UISwitch *)sender{
   NSLog(@"自动抢红包:%@", (sender.isOn ? @"启用" : @"禁用"));
}
%end
      • 真机运行项目,查看UI效果
    • 11、 实现功能
      • UI搭建完成后,实现交互功能的启用/禁用标识,以及手速设置,都要进行本地化保存
      • 增加宏定义
#define HOOKAUTOVALUE @"HookAutoValue"
#define HOOKWAITVALUE @"HookWaitValue"
      • 实现UISwitch切换的逻辑
%new
-(void)hookAutoAction:(UISwitch *)sender{
   [[NSUserDefaults standardUserDefaults] setBool:sender.isOn forKey:HOOKAUTOVALUE];
   [[NSUserDefaults standardUserDefaults] synchronize];
   [MSHookIvar<UITableView *>(self,"_tableView") reloadData];
}
      • 修改tableView:cellForRowAtIndexPath:方法,将UI和功能进行关联
BOOL isAutoEnable = [[NSUserDefaults standardUserDefaults] boolForKey:HOOKAUTOVALUE];
cell.imageView.image = [UIImage imageNamed:(isAutoEnable ? @"unlocked" : @"locked")];
cell.textLabel.text = @"自动抢红包";
UISwitch *switchAuto = [[UISwitch alloc] init];
[switchAuto addTarget:self action:@selector(hookAutoAction:) >forControlEvents:UIControlEventValueChanged];
switchAuto.on=isAutoEnable;
cell.accessoryView = switchAuto;
    • 完成手速设置逻辑
      • 添加UITextFieldDelegate
@interface WCTableViewManager : NSObject <UITextFieldDelegate>
@property(retain, nonatomic) NSMutableArray *sections;
@end
    • 增加textField:shouldChangeCharactersInRange:replacementString:方法,文本框内输入\n,视为输入完成,自动收起键盘
%new
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
   if ([string isEqualToString:@"\n"]) {
       [textField resignFirstResponder];
       return NO;
   }
   return YES;
}
    • 增加textFieldDidEndEditing:方法,输入完成,将文本框内存本地化保存
%new
-(void)textFieldDidEndEditing:(UITextField *)textField {
   [[NSUserDefaults standardUserDefaults] setObject:textField.text forKey:HOOKWAITVALUE];
   [[NSUserDefaults standardUserDefaults] synchronize];
}
    • 修改tableView:cellForRowAtIndexPath:方法,将UI和功能进行关联
cell.imageView.image = [UIImage imageNamed:@"clock"];
cell.textLabel.text = @"等待时间(秒)";
UITextField *txtWait=[[UITextField alloc] initWithFrame:CGRectMake(0, 0, 150, 40)];
txtWait.borderStyle = UITextBorderStyleRoundedRect;
txtWait.backgroundColor = [UIColor whiteColor];
txtWait.keyboardType = UIKeyboardTypeNumberPad;
txtWait.returnKeyType = UIReturnKeyDone;
txtWait.delegate = self;
txtWait.text = [[NSUserDefaults standardUserDefaults] objectForKey:HOOKWAITVALUE];
cell.accessoryView = txtWait;
    • 12、优化:
      • 整体的界面和功能都已经完成,还有两个小问题需要优化
        • 触发文本框,键盘弹出,会遮挡底部的功能区域
        • 设置页的列表滑动时,键盘无法自动收起,影响体验
      • 解决遮挡问题
        • 对NewSettingViewController进行HOOK,对键盘的通知进行监听和销毁
%hook NewSettingViewController
- (void)viewDidLoad{
   %orig;
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)dealloc{
   [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
   [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

%end
      • 实现键盘弹出方法
%new
- (void)keyboardWillShow:(NSNotification *)notification {
   CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
   CGSize viewSize = self.view.frame.size;
   self.view.frame = CGRectMake(0, -keyboardSize.height, viewSize.width, viewSize.height);
}
      • 实现键盘收起方法
%new
- (void)keyboardWillHide:(NSNotification *)notification {
   CGSize viewSize = self.view.frame.size;
   self.view.frame = CGRectMake(0, 0, viewSize.width, viewSize.height);
}
      • 解决列表滑动,自动收起键盘问题
        • 对NewSettingViewController进行HOOK,修改viewDidLoad方法
        • 增加UITableView.keyboardDismissMode属性的设置
- (void)viewDidLoad{
   %orig;
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
   
   WCTableViewManager *m_tableViewMgr = MSHookIvar<WCTableViewManager *>(self, "m_tableViewMgr");
   [MSHookIvar<UITableView *>(m_tableViewMgr, "_tableView") setKeyboardDismissMode:UIScrollViewKeyboardDismissModeOnDrag];
}

总结:

    • UI搭建
      • 使用class-dump,导出目标App的头文件
      • 使用MonkeyDev重签名并运行App
      • 使用Debug View,快速定位目标控制器
      • 使用Cycript、分析控制器中的视图、对象、数据源
      • 在对应的头文件中,找到关键的方法和属性
      • 需要精准定位到注入点,不能影响其他功能
      • 可以使用响应链条,找到控件与所属控制器的关联
      • 需要自定义图标,直接将图片导入App包即可
      • 添加的方法,方法名称加上自定义前缀,保证命名唯一
      • HOOK关键方法,完成界面与功能
      • NSHookIvar: 获取对象下的成员变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分子共价对接(Covalent Docking)

共价对接&#xff08;Covalent Docking&#xff09; 随着人们对共价抑制剂的发现越来越重视&#xff0c;越来越多的软件开始支持共价抑制的虚拟筛选。常用的共价对接软件有CovDock&#xff0c;AutoDock4&#xff0c;FITTED&#xff0c;GOLD&#xff0c;ICM-Pro与MOE等。共价抑制…

断网了,还能ping通 127.0.0.1 吗?为什么?

你女神爱不爱你&#xff0c;你问她&#xff0c;她可能不会告诉你。 但网通不通&#xff0c;你 ping 一下就知道了。 可能看到标题&#xff0c;你就知道答案了&#xff0c;但是你了解背后的原因吗&#xff1f;那如果把 127.0.0.1 换成 0.0.0.0 或 localhost 会怎么样呢&#x…

易基因:ChIP-seq等揭示热休克转录因子A1b调控植物高温胁迫响应的分子机制|应激反应

在拟南芥中&#xff0c;热休克转录因子A1b&#xff08;HEAT SHOCK TRANSCRIPTION FACTORA1b&#xff0c;HSFA1b&#xff09;通过影响种子产量来调控对环境胁迫的抗性。HSFA1b是生殖适应性的决定性因素&#xff0c;这种调控机制怎么形成的呢&#xff1f; 2018年&#xff0c;英国…

基于静态分析结果的测试用例自动生成方法

自动生成用例的方法有多种&#xff0c;主要包括随机法、遗传算法、等价类划分法、约束求解法等。各种方法的适用范围、性能及生成的用例质量各不相同&#xff0c;具体见表1。从表1可以看出&#xff0c;约束求解法效率高&#xff0c;生成的用例质量也高&#xff0c;所以本项目中…

RabbitMQ-Topic(主题模式)

Topic topics 模式支持模糊匹配RoutingKey&#xff0c;就像是sql中的 like子句模糊查询&#xff0c;而路由模式等同于sql中的where子句等值查询 topic 交换机背后的路由算法类似于 direct 交换&#xff0c;使用特定路由键发送的消息将被传递到使用匹配绑定键绑定的所有队列。…

期权价格上下限与期权平价关系

目录 1. 期权的基本概念 2. 期权的上下限 3. 期权的平价关系 1. 期权的基本概念 期权&#xff1a;是一种选择权&#xff0c;期权买方向卖方支付一定数额的 期权费 后&#xff0c;可获得在 一定时间&#xff08;到期日&#xff09;内以 一定价格&#xff08;执行价格&#x…

如何使用 Java 将 JSON 文件读取为字符串?这三种方法很管用!

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它可以用来存储和传输结构化的数据。在 Java 中&#xff0c;有多种方法可以将 JSON 文件读取为字符串&#xff0c;本文将介绍其中的几种。 方法一&#xff1a;使用 java.io 包中的类 java.io 包中提…

【MySQL】索引和事务的详细介绍

目录 一.索引 1.索引概念 2.查看索引 3.创建索引 4.索引使用的数据结构是什么 1.HASH&#xff08;不是&#xff09; 2.二叉搜索树&#xff08;不是&#xff09; 3.B树 N叉数&#xff08;不是&#xff09; 4.B树&#xff08;是滴&#xff09; 5.组合索引 6.索引覆盖 7…

Docker Compose与Docker Swarm的简介和区别,以及docker swarm的简单使用命令

Docker Compose与Docker Swarm的简介和区别 背景Compose 简介Swarm 简介Compose 和 Swarm区别docker swarm简单使用及常用命令背景&#xff1a;初始化集群节点加入启动docker程序&#xff0c;nginx服务1.22版本查看服务服务伸缩删除service服务创建密钥secret查看secret使用sec…

清徐乡村e镇助力醋企惊艳亮相全国糖酒会

陈醋香醇悠悠&#xff0c;美味酸爽袭人。4月12日至14日&#xff0c;第108届全国糖酒商品交易会在成都举行&#xff0c;其间启动“山西老陈醋专业镇成都行”&#xff0c;208家山西醋企首次集中亮相交易会&#xff0c;为山西醋代言&#xff0c;由阿里云创新中心运营的清徐乡村e镇…

操作系统概述和体系结构

操作系统的概念和功能 核心&#xff1a;作为系统资源的管理者 向上提供方便易用的服务 联机就好比问一句答一句&#xff1b;脱机就好比先问好多句然后统一依次回答。 上面是直接提供给用户使用的。 另外还有一种程序接口&#xff1a; 这就是程序员在编程时经常调用的各种函数接…

【Linux】3、Linux 的编辑器

目录 一、vi 和 vim二、vim&#xff08;vi&#xff09;的三种工作模式(1) 命令模式快捷键(2) 底线命令模式操作 一、vi 和 vim &#x1f516; vim 和 vi 是 Linux 中经典的文本编辑器 &#x1f516; vim 是 vi 的加强版 &#x1f516; vim&#xff1a; ① 兼容 vi 的全部指令…

(数字图像处理MATLAB+Python)第五章图像增强-第六节:其他图像增强技术

文章目录 一&#xff1a;基于对数图像处理模型的图像增强&#xff08;1&#xff09;对数图像处理模型&#xff08;LIP&#xff09;&#xff08;2&#xff09;基于对数图像处理模型的增强 二&#xff1a;图像去雾增强&#xff08;1&#xff09;图像去雾模型&#xff08;2&#x…

Flutter 布局探索 | 如何分析尺寸和约束

theme: cyanosis 前言 本文来分享一下&#xff0c;通过查看源码和布局信息解决的一个实际中的布局小问题&#xff0c;也希望通过本文的分享&#xff0c;当你遇到布局问题时&#xff0c;可以靠自己的脑子和双手解决问题。 如下所示&#xff0c;将 TextField 作为 AppBar 组件的 …

java版本工程项目管理系统平台源码,助力工程企业实现数字化管理

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

重塑元宇宙体验!元宇宙实时云渲染解决方案来了

元宇宙作为人工智能、云计算和数字孪生等前沿技术的结合体&#xff0c;近年来越发受到各大企业重视。 元宇宙的应用场景层出不穷&#xff0c;不仅包括营销推广场景&#xff0c;还有品牌活动和电商销售&#xff0c;能有效提升品宣和商业转化效果。 元宇宙也具有极大的建设价值…

2.Spring Security详细使用

目录 1. Spring Security详细介绍 2. Spring Security详细使用 3. Spring Security实现JWT token验证 4. JWT&#xff08;JSON Web Token&#xff0c;JSON令牌&#xff09; 5. Spring Security安全注解 认证流程 1.集中式认证流程 &#xff08;1&#xff09;用户认证 使用…

【Unity入门】15.鼠标输入和键盘输入

【Unity入门】鼠标输入和键盘输入 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;监听鼠标输入 (1) Input类 Unity的Input类提供了许多监听用户输入的方法&#xff0c;比如我们常见的鼠标&a…

redis复制的设计与实现

一、复制 1.1旧版功能的实现 旧版Redis的复制功能分为 同步&#xff08;sync&#xff09;和 命令传播。 同步用于将从服务器更新至主服务器的当前状态。命令传播用于 主服务器状态变化时&#xff0c;让主从服务器状态回归一致。 1.1.1同步 当客户端向服务端发送slaveof命令…

5款十分小众的软件,知道的人不多但却很好用

今天推荐5款十分小众的软件&#xff0c;知道的人不多&#xff0c;但是每个都是非常非常好用的&#xff0c;有兴趣的小伙伴可以自行搜索下载。 1.视频直播录制——OBS Studio OBS Studio可以让你轻松地录制和直播你的屏幕、摄像头、游戏等内容。你可以使用OBS Studio来创建多种…