【iOS逆向与安全】插件开发之某音App直播间自动发666

news2024/11/17 3:40:33
1.目标

由于看直播的时候主播叫我发 666,支持他,我肯定支持他呀,就一直发,可是后来发现太浪费时间了,能不能做一个直播间自动发 666 呢?于是就花了几分钟做了一个。

2.操作环境
  • 越狱iPhone一台

  • frida

  • mac

 3.流程

下载最新某音App

既然是发送消息,那关键词 sendmessage 则是我们的切入点

在终端执行
//模糊匹配sendmessage
frida-trace -U  -m "*[* *messag*]" xxxxx音   

执行命令后,获取到信息列表:

经过一筛查打印以上方法的入参和返回值,输出的日志参数,引起了我们的注意

关键信息:sendComment
-[HTSLiveCommentFragment sendComment:0x9e4d4021463d8688 source:0x0 messageSource:0x0 completion:0x0]

验证我们的猜想

在终端执行,继续 hook

frida-trace -UF  -m "-[HTSLiveCommentFragment sendComment:source:messageSource:completion:]"

获取到信息列表:

 -[HTSLiveCommentFragment sendComment:666666666 source:0x0 messageSource:0x0 completion:0x0]

其中“6666666” 就我在直播间发送的内容

那么问题来了,发现这个发送方法是 减号 -[xxxx xxxxxx]

这样就没法直接调用 HTSLiveCommentFragment

那就继续 hook  HTSLiveCommentFragment,看看她是在哪里创建的

在终端执行,继续 hook
frida-trace -UF -m "-[HTSLiveCommentFragment *]"

获取到信息列表: 

  3964 ms  -[HTSLiveCommentFragment initWithStore:0x2836ef200]
  3964 ms  -[HTSLiveCommentFragment initWithStore:<HTSLiveCommentStore: 0x2836ef200>]

 发现 HTSLiveCommentFragment 是由 initWithStore 创建而来。

那就直接 hook 创建,在调用sendComment  来实现发送消息。

3、编写deb插件 logs

NSString *nickname=@"未获取昵称";

HTSLiveCommentFragment *liveComm;//全局 储存创建好的对象 类

%hook HTSLiveCommentFragment
//HTSLiveCommentStore
- (HTSLiveCommentFragment *)initWithStore:(id)arg1{
    
//    id mHTSLiveUser = MSHookIvar<id>(arg1,"_currentUse");//HTSLiveUser
//    NSString *name = MSHookIvar<NSString *>(mHTSLiveUser,"nickname");
//    nickname =name;
    
    liveComm = %orig;//获取到创建好的对象 类(每切换一次,自动覆盖

    return liveComm;
}

%end
 获取直播页面

HTSLiveAudienceViewController,给他添加一个按钮

 页面添加小圆圆 按钮
BallUIView *upASUserInfo;//移动圆圆

//直播页面 Controller
%hook HTSLiveAudienceViewController

- (void)viewDidLoad{
    %orig;// 页面加载完毕
    
    __weak typeof(self) weakSelf = self;
    if(upASUserInfo == nil){
        //配置
        CGRect rect_screen = [[UIScreen mainScreen]bounds];
        CGSize size_screen = rect_screen.size;
        int height = size_screen.height;
        int width  = size_screen.width;
        
        // 移动圆圆
        upASUserInfo = [[BallUIView alloc] initWithFrame:CGRectMake(width-80, height/2-200, 50, 50)];
        upASUserInfo.backgroundColor = [UIColor whiteColor];
        upASUserInfo.layer.cornerRadius = 25;
        upASUserInfo.layer.masksToBounds = YES;
        
        //小圆球 图标
        UIImageView *imgViewM = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"AppIcon60x60@2x.png"]];
        imgViewM.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        imgViewM.frame = CGRectMake(0, 0, 50, 50);
        [upASUserInfo insertSubview:imgViewM atIndex:0];
        
        
        
    }
    
    [weakSelf.view addSubview:upASUserInfo];
    
    upASUserInfo.btnClick = ^(UIButton *sender) {
        UIAlertController *ac = [UIAlertController alertControllerWithTitle:@"当前标识"
                                                                    message:nickname
                                                             preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *ala1 = [UIAlertAction actionWithTitle:@"666666" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){

        }];
        UIAlertAction *ala2 = [UIAlertAction actionWithTitle:@"发送消息" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
            [xddCode userInfoModel:liveComm];//传入获取到的 对象,发送消息
        }];
        UIAlertAction *ala3 = [UIAlertAction actionWithTitle:@"退出应用" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action){
            exit(0);
        }];
        UIAlertAction *Cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            
        }];
        
        [ac addAction:ala1];
        [ac addAction:ala2];
        [ac addAction:ala3];
        [ac addAction:Cancel];
        
        [weakSelf presentViewController:ac animated:YES completion:nil];
    };
    
    
    
}
%end

 

xddCode.m

#import "xddCode.h"

@implementation xddCode

+(NSString *) userInfoModel:(HTSLiveCommentFragment*)info {

    [info sendComment:@"666666666" source:0x0 messageSource:0x0 completion:0x0];
}

@end

小园球源码

BallUIView.h


#import <UIKit/UIKit.h>

typedef void (^floatBtnClick)(UIButton *sender);

NS_ASSUME_NONNULL_BEGIN

@interface BallUIView : UIView
// 属性 机,记录起点

@property(nonatomic,assign)CGPoint startPoint;


//按钮点击事件
@property (nonatomic, copy)floatBtnClick btnClick;

@end

NS_ASSUME_NONNULL_END

BallUIView.m



#import "BallUIView.h"


#define screenW  [UIScreen mainScreen].bounds.size.width
#define screenH  [UIScreen mainScreen].bounds.size.height

@interface BallUIView()
//悬浮的按钮
//@property (nonatomic, strong) MNFloatContentBtn *floatBtn;
@end

@implementation BallUIView{
    
    //拖动按钮的起始坐标点
    CGPoint _touchPoint;
    
    //起始按钮的x,y值
    CGFloat _touchBtnX;
    CGFloat _touchBtnY;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//    NSLog(@"按下 获取起点1");
    
    //获取 触摸 对象
    
    UITouch *touch = [touches anyObject];
    
    _touchBtnX = self.frame.origin.x;
    _touchBtnY = self.frame.origin.y;
    
    //找到点击的起点
    self.startPoint = [touch locationInView:self];
    
}

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//    NSLog(@"移动  让小球的运动起来2");
    
    //先回去  触摸对象
    
    UITouch * touch = [touches anyObject];

    //获取移动中的点
    CGPoint newPoint = [touch locationInView:self];
    
    //计算x y 坐标分别移动了多少
    CGFloat dx = newPoint.x - self.startPoint.x;
    CGFloat dy = newPoint.y - self.startPoint.y;
    
    //改变小球的位置
    self.center = CGPointMake(self.center.x + dx,
                                      self.center.y + dy);
    

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
//    NSLog(@"按下 结束3");
    
    CGFloat btnY = self.frame.origin.y;
    CGFloat btnX = self.frame.origin.x;
    CGFloat minDistance = 3;
    
    //结束move的时候,计算移动的距离是>最低要求,如果没有,就调用按钮点击事件
    BOOL isOverX = fabs(btnX - _touchBtnX) > minDistance;
    BOOL isOverY = fabs(btnY - _touchBtnY) > minDistance;
    
    if (isOverX || isOverY) {
        //超过移动范围就不响应点击 - 只做移动操作
        //NSLog(@"move - btn");
        //设置移动方法
        [self setMovingDirectionWithBtnX:btnX btnY:btnY];
    }else{
        //NSLog(@"call - btn");
        if (self.btnClick) {
            self.btnClick(nil);
        }else{
            //[self changeEnv];
        }
    }
    
    
}

static CGFloat floatBtnW = 50;
static CGFloat floatBtnH = 50;
- (void)setMovingDirectionWithBtnX:(CGFloat)btnX btnY:(CGFloat)btnY{
//    switch (_type) {
//        case MNAssistiveTypeNone:{
            //自动识别贴边
            if (self.center.x >= screenW/2) {

                [UIView animateWithDuration:0.5 animations:^{
                    //按钮靠右自动吸边
                    CGFloat btnX = screenW - floatBtnW;
                    self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH);
                }];
            }else{

                [UIView animateWithDuration:0.5 animations:^{
                    //按钮靠左吸边
                    CGFloat btnX = 0;
                    self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH);
                }];
            }
//            break;
//        }
//        case MNAssistiveTypeNearLeft:{
//            [UIView animateWithDuration:0.5 animations:^{
//                //按钮靠左吸边
//                CGFloat btnX = 0;
//                self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH);
//            }];
//            break;
//        }
//        case MNAssistiveTypeNearRight:{
//            [UIView animateWithDuration:0.5 animations:^{
//                //按钮靠右自动吸边
//                CGFloat btnX = screenW - floatBtnW;
//                self.frame = CGRectMake(btnX, btnY, floatBtnW, floatBtnH);
//            }];
//        }
//    }
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end
  最后

就可以愉快的玩耍了,主播以后再也不会说我不支持他了。

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

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

相关文章

Java【手撕链表】LeetCode 2. “两数相加“, 图文详解思路分析 + 代码

文章目录 前言一、两数相加1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, 链表, 堆…

五、过拟合问题与正则化

一、过拟合问题 &#xff08;一&#xff09;问题的提出 过拟合问题的定义&#xff0c;以线性回归为例&#xff0c;在房价预测的数据集中&#xff0c;假设函数产生的曲线有三种情况&#xff0c;如下图&#xff1a; &#xff08;1&#xff09;欠拟合&#xff08;2&#xff09;…

保姆级 -- Zookeeper超详解

1. Zookeeper 是什么(了解) Zookeeper 是一个 分布式协调服务 的开源框架, 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上是 一个分布式的小文件存储系统 . 提供基于类似于文件系统的目录树方式的数据存储, …

【Linux】线程同步和互斥

目录 一、线程互斥1.相关概念2.互斥锁&#xff08;mutex&#xff09;3.互斥锁的原理4.自定义封装一个锁 二、可重入和线程安全三、死锁死锁概念死锁四个必要条件如何避免死锁 四、线程同步1.条件变量概念条件变量接口基于阻塞队列实现生产者消费者模型 2.信号量概念信号量操作接…

Databend 源码阅读:配置管理

作者&#xff1a;尚卓燃&#xff08;PsiACE&#xff09;澳门科技大学在读硕士&#xff0c;Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer https://github.com/PsiACE 对于 Databend 这样复杂的数据库服务端程序&#xff0c;往往需要支持大量的可配置选项&am…

探索Lighthouse性能分数计算背后的奥秘

本文作者为 360 奇舞团前端开发工程师 作为开发我们都知道&#xff0c;页面性能很重要&#xff0c;一个性能良好的页面可以给用户带来非常好的用户体验。那么&#xff0c;怎么能知道自己写的页面性能是好是坏呢&#xff1f; Lighthouse 是Chrome提供给开发者用来测量页面性能的…

原生js之变量、作用域与内存

原生js之变量、作用域与内存 变量变量类型原始值引用值 复制值传递参数判断类型typeofinstanceof不常用的判断方法constructor构造方法判断Object.getPrototypeOf() 最好用的判断数据类型的方法!toString.call小总结 作用域链垃圾回收标记清理引用计数v8回收v8对GC的优化新生代…

对标8155体验,降本20%以上!这家企业用“量产”证明

智能座舱逐渐成为智能汽车标配。 根据高工智能汽车研究院监测的数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车搭载智能数字座舱&#xff08;大屏语音车联网OTA&#xff09;前装标配交付795.05万辆&#xff0c;同比增长40.59%&#xff0c;前装搭…

卫星通信链路预算(附程序)

文章目录 简介链路基本概念信息速率与传输速率载波占用带宽载波与噪声功率比 天线参数天线增益波束宽度极化损耗 有效全向辐射功率接收系统品质因数自由空间的传播损耗链路计算程序 简介 卫星通信链路是指从信源开始&#xff0c;通过编码调制及微波上变频、发射机和天线&#…

流量卡不带通话功能,这样的流量卡用着真的安全?

哈喽大家好&#xff0c;很多朋友私信小编&#xff0c;咨询关于纯流量卡的一些问题&#xff0c;可能大家都知道&#xff0c;现在正规的号卡也推出了“纯流量版”&#xff0c;也就是不带通话功能&#xff0c;那么&#xff0c;网上的带手机号的纯流量卡真的用着安全吗&#xff1f;…

企业数字化转型要怎么做?在线报修系统是如何解决维修难题的?

随着科技互联网等新技术的不断发展&#xff0c;企业服务已从信息化迈向数字化阶段。大型企业正迫切地向数字化转型&#xff0c;并需要技术革新和与云的融合&#xff0c;以应对当今市场的挑战。为满足这一需求&#xff0c;广东工程宝科技有限公司推出了一款新一代故障报修产品—…

如何快速搭建一个react项目?如何使用react脚手架快速搭建项目?

如何使用react脚手架快速搭建项目&#xff1f; 一、前提 电脑已经安装了node和npm环境。 react文档中要求Node > 8.10 和 npm > 5.6&#xff0c;查看版本&#xff1a;node -v&#xff1b;npm -v&#xff1b; 二、步骤 1、在合适的文件夹中打开命令行窗口cmd 2、全局安…

前端项目配置 prettier、eslint、lint-stages、husky、commitlint 、style-lint设置代码书写和提交规范

prettier中文网&#xff1a;Options Prettier 中文网 eslint中文网 &#xff1a;ESLint 中文网 github husky &#xff1a; https://github.com/typicode/husky commitlint.js 官网&#xff1a;commitlint - Lint commit messages 、github&#xff1a;GitHub - conventiona…

为什么大力推行国密算法SSL证书

国密算法SSL证书是一种采用我国自主研发的SM2公钥算法体系&#xff0c;支持SM2、SM3、SM4等国产密码算法及国密SSL安全协议的数字证书。相比于普通SSL证书&#xff0c;国密SSL证书具有以下特点&#xff1a; 自主可控&#xff1a;国密SSL证书采用我国自主研发的SM2公钥算法体系&…

十一,从摄像机打印HDR环境贴图

越来越接近真相了。我们很自然地想到&#xff0c;如果把漫游器放在中心打印&#xff0c;是不是就可以打印整个等距柱状投影图了呢&#xff1f;是的&#xff0c;但是&#xff0c;只是要注意的是&#xff0c;立方体贴图的内部和外部尽管一样&#xff0c;但是还是稍微有点模糊&…

Git 学习(2)

Git 学习&#xff08;2&#xff09; 版本号 Git 中文件的版本号是 40 位十六进制的数字字符串&#xff0c;采用 SHA-1 加密算法计算获得 这样一方面可避免在合并时的冲突问题 另一方面可以用于文件定位&#xff0c;其中前两位表示文件夹&#xff0c;后 38 位表示文件 指令介…

DDS信号发生器Verilog波形发生器FPGA

名称&#xff1a;DDS信号发生器Verilog波形发生器 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 1.可产生正弦波&#xff0c;锯齿波&#xff0c;三角波&#xff0c;方波4种波形&#xff0c;频率可调 2.具有波形选择、起动、停止功能。 代码下载&…

Flink on yarn 实战和源码分析

版本&#xff1a;1.13.6 目录 Flink on yarn 的3种模式的使用 yarn session 模式源码分析 yarn per-job模式源码分析 application模式源码分析 Flink on yarn 的3种模式的使用 Application Mode # ./bin/flink run-application -t yarn-application ./examples/streaming…

Apollo简易地图制作

在Apollo中模拟障碍物 一、准备工作 在模拟障碍物之前&#xff0c;需要下载并编译Apollo源码&#xff0c;过程可以依据Apollo开放平台文档&#xff0c;其中可能遇到的问题在这里或许可以寻找到答案 二、运行Dreamview 进入容器 cd ~/apollobash docker/scripts/dev_start.s…

515万新作者投身电商事业,抖音电商将投入更多资源扶持作者长期发展

9月27日&#xff0c;2023抖音电商作者峰会在上海举办。上千位抖音电商作者、MCN机构、精选联盟服务商、商家等重要生态伙伴参会&#xff0c;围绕大会主题“向新成长”进行了深入探讨。会上&#xff0c;抖音电商总裁魏雯雯提到&#xff0c;电商作者的事业有更多发展方向。为助力…