17、Logos使用摘要

news/2024/4/25 23:08:08/文章来源:https://blog.csdn.net/SharkToping/article/details/130343464

        本篇将讲述如何将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.luyixian.cn/news_show_103649.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直升机空气动力学基础---002 桨叶的主要参数

源于 1.桨叶的平面形状和主要参数 由于其设计制造比较简单&#xff0c;早期直升机大多采用矩形桨叶&#xff0c;缺点是在高速气流中&#xff0c;无法抑制桨尖涡&#xff0c;会消耗向下的诱导速度&#xff0c;降低旋翼的拉力。现代多采用梯形桨叶。 桨尖后掠能够降低桨尖涡 …

Flowable打印调用原生API查询接口的SQL日志

一.简介 建议在 Spring Boot 的 application.properties 中添加如下配置&#xff0c;开启 flowable 日志&#xff1a; logging.level.org.flowabledebug这个配置表示开启 flowable 的日志&#xff0c;开启日志的好处是可以看到底层的 SQL语句。 二.查询部署信息 例如查询流…

使用 chat_flutter 进行聊天记录展示

前言 最近需要实现一个聊天记录的页面展示&#xff0c;在网上发现没有适合自己的&#xff0c;于是自己就造了一个&#xff0c;总体感觉还不赖。 下面奉上地址、效果图和教程。 效果图 地址 github: https://github.com/xiaorui-23/chat_fluttergitee: https://gitee.com/xi…

selenium_交互 (谷歌浏览器驱动下载 xpath插件安装)

安装selenium &#xff08;1&#xff09;查看谷歌浏览器版本 谷歌浏览器右上角 ‐‐> 帮助 ‐‐> 关于 查看 浏览器版本&#xff1a; &#xff08;2&#xff09;操作谷歌浏览器驱动下载地址 http : // chromedriver . storage . googleapis . com / index . html 找到…

YOLOv5网络模型的结构原理讲解(全)

目录 前言1. 基本概念2. 输入端2.1 Mosaic 图像增强2.2 自适应锚框计算2.3 自适应图片缩放 3. Backbone层3.1 Focus结构3.2 CSP结构 3. Neck网络3.1 SPP结构3.2 PAN结构 4. 输出端4.1 Bounding box损失函数4.2 NMS非极大值抑制 前言 YOLOv5有几种不同的架构&#xff0c;各网络…

Qt信号槽原理

Qt之信号槽原理 一.概述 所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目的的&#xff0c;类似广播。如果有对象对这…

Openswan安装和简单配置

Openswan安装和简单配置 安装环境&#xff1a; 操作系统&#xff1a;Ubuntu20.0.4TLS 用户权限&#xff1a;root下载Openswan: wget https://github.com/xelerance/Openswan/archive/refs/tags/v3.0.0.zip安装Openswan: 解压Openswan&#xff1a;&#xff08;PS&#xff1a…

银行数字化转型导师坚鹏:商业银行数字化风控(2天)

商业银行数字化风控 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚商业银行数字化风控发展现状&#xff1f; 不清楚对公业务数字化风控工作如何开展&#xff1f; 不知道零售业务数字化风控工作如何开展&#xff1f; 课程特色…

海光信息业绩高歌猛进,但其作为国产CPU龙头的“地基”并不牢固

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在“芯片寒冬”的大背景下&#xff0c;2022年全球头部芯片半导体公司纷纷下调业绩预期&#xff0c;英特尔、英伟达、美光等无一幸免。但是随着AIGC异军突起&#xff0c;仿佛寒冬中的一股暖流&#xff0c;催生着半导体市场行…

C. Trailing Loves (or L‘oeufs?)(求某个质因子在n的阶乘中的个数 + 思维)

Problem - C - Codeforces Aki喜欢数字&#xff0c;尤其是那些带有尾随零的数字。例如&#xff0c;数字9200有两个尾随零。Aki认为数字拥有的尾随零越多&#xff0c;它就越漂亮。 然而&#xff0c;Aki认为&#xff0c;一个数字拥有的尾随零的数量并不是固定的&#xff0c;而是…

idea中导入spring源码;在spring源码中添加注释

标题&#xff1a;idea中导入spring源码;在spring源码中添加注释 我是跟着他操作的&#xff0c;下文是一些补充说明&#xff1a; 这个也可以借鉴 gradle下载链接【使用网盘下载】,不过有的没有&#xff0c; gradel下载链接&#xff1a;这个比较全 1.Spring源码编译环境 spr…

Karl Guttag:现有Micro LED/LCoS+光波导AR眼镜对比解析

轻量化是未来AR眼镜的发展趋势&#xff0c;为了缩减尺寸&#xff0c;AR眼镜厂商尝试了多种方案&#xff0c;长期来看Micro LED光机在小型化上更有优势&#xff0c;但现阶段LCoS光机的图像表现更好。在CES 2023期间&#xff0c;DigiLens、Lumus、Vuzix、OPPO、Avegant也展出了不…

linux编译安装python的全过程,pip python不与linux系统环境混乱

因为使用要求&#xff0c;使得我需要在linux环境下安装一个独立的python环境&#xff0c;不干扰其他环境。 预安装 在安装python之前&#xff0c;请在linux系统下安装下面这些包&#xff1a; sudo apt-get install namelibssl-dev libcurl4 libcurl4-openssl-dev zlib-devel…

27-Servlet执行原理

目录 1.Tomcat详解 ①接收请求&#xff1a; ②根据请求计算响应&#xff1a; ③返回响应&#xff1a; 2.Tomcat执行流程 2.1.Tomcat 初始化流程 2.2.Tomcat 处理请求流程 2.3.Servlet 的 service 方法的实现 在 Servlet 的代码中并没有写 main ⽅法&#xff0c;那么对应…

【C++关联容器】map的成员函数

目录 map 1. 构造、析构和赋值运算符重载 1.1 构造函数 1.2 析构函数 1.3 赋值运算符重载 2. 迭代器 3. 容量 4. 元素访问 5. 修改器 6. 观察者 7. 操作 8. 分配器 map map是关联容器&#xff0c;它按照特定的顺序存储由关键字值和映射值的组合形成的元素。 在一…

【Springboot系列】项目启动时怎么给mongo表加自动过期索引

1、前言 在之前操作mongo的过程中&#xff0c;都是自动创建&#xff0c;几乎没有手动创建过表。 这次开发中有张表数据量大&#xff0c;并且不是特别重要&#xff0c;数据表维护一个常见的问题是过期数据没有被及时清理&#xff0c;导致数据量过大&#xff0c;查询变得缓慢。…

LeetCode-242. 有效的字母异位词

题目链接 LeetCode-242. 有效的字母异位词 题目描述 题解 题解一&#xff08;Java&#xff09; 作者&#xff1a;仲景 首先&#xff0c;满足条件的情况下&#xff0c;两个字符串的长度一定是相等的&#xff0c;不相等一定不满足条件 使用Hash表来存储字符串s中各个字符出现的…

Spring Security实战(九)—— 使用Spring Security OAuth实现OAuth对接

一、OAuth2.0介绍 OAuth2.0是一种授权协议&#xff0c;允许用户授权第三方应用程序代表他们获取受保护的资源&#xff0c;如个人信息或照片等。它允许用户授权访问他们存储在另一个服务提供商上的资源&#xff0c;而无需将其凭据共享给第三方应用程序。OAuth2.0协议建立在OAuth…

【具体到每一步】从0制作一个uniapp的新闻类页面(界面篇)

目录 项目初始化 / 基础配置 项目创建 配置路由/页面/tabbar pages.json配置tabbar 配置图标/静态资源 导航栏和字体颜色 scroll-view实现横向滚动条样式 公共模块定义components组件 新建组件 使用组件 组件里的结构 布局个人中心页面 组件差异化处理 数据传递 导航…

DevExpress:报表在winform窗体上显示(使用documentViewer控件)

一&#xff1a;控件认识 documentViewer&#xff08;版本DX22.2&#xff09;,老版本中的可能是printControl&#xff08;工具箱面板中可能找不到&#xff09;&#xff0c;通过官网搜索发现&#xff0c;这个控件现在继承于documentViewer这个控件。因此&#xff0c;使用documen…