正常一次最多邀请40人进群在这里插入图片描述
超过40人的拉群,会变成邀请,需要对方同意在这里插入图片描述
新版本修复了漏洞,但还是可以用老版本进行强制拉群

虽然官方也做了版本过低的限制,但还是有办法绕过

要么修改版本号或者登录几天新版本,之后就可以登录老版本

关键是,新版本的修复漏洞的方案并不彻底

深入研究发现更严重的漏洞,最新版本也能强制拉群

而且这个漏洞是Duilib框架层面的,影响的不只是拉群老版本强制拉群漏洞
1、正常情况

点击主界面的添加群成员在这里插入图片描述
会弹出一个选择用户的界面

再去点主界面的添加群成员

选择用户的界面还是同一个在这里插入图片描述
2、异常情况

工作台-客户群-前往查看客户群-添加群成员

点多少次就会出现多少个选择用户的界面在这里插入图片描述
分析漏洞背后的原因
父界面的句柄
企业微信的界面框架是Duilib

弹出子界面之后,还能点击父界面

第一反应是创建子界面没有传父界面的句柄

拦截创建界面的函数Create,发现都有传父界面的句柄

1、正常情况在这里插入图片描述
2、异常情况在这里插入图片描述
好玩的是,正常和异常情况的两个选择用户界面可以同时出现

因为“工作台-客户群-前往查看客户群”这一步,创造新界面的时候没有传父窗口句柄在这里插入图片描述
调用堆栈
既然都传了父界面的句柄,那差异可能是代码逻辑不一样

继续拦截创建界面的函数Create,看调用堆栈有什么差异

1、正常情况

调用堆栈有DispatchMessageW,并且窗口事件是0x403

0x403代表的是自定义消息,说明创建子界面的异步的在这里插入图片描述
2、异常情况

调用堆栈有WndProc,并且窗口事件是0x202

说明是鼠标弹起之后,直接同步地创建子界面在这里插入图片描述
窗口属性
正常情况异步创建子界面,但父界面没响应

异常情况同步创建子界面,但父界面有响应

都有父窗口句柄,说明正常情况额外加了逻辑

用spy++看一下父界面窗口的样式属性

1、正常情况

创建子窗口之前在这里插入图片描述
创建子窗口之后

多了WS_DISABLED,因此父界面没响应在这里插入图片描述
2、异常情况

创建子窗口之前在这里插入图片描述
创建子窗口之后

没有WS_DISABLED,因此父界面有响应在这里插入图片描述
漏洞的原因就定位到了:异常情况,父窗口的样式因为没有WS_DISABLED导致能被点击多次

最新版本利用这个原理,正常情况点击添加群成员,代码去掉WS_DISABLED,可以被点击多次在这里插入图片描述
没有WS_DISABLED是最终结果,好奇代码层面到底是哪里出问题

对SetWindowLong下断点,看下是不是异常情况少了这个逻辑

发现正常情况和异常情况都没有命中SetWindowLong这个函数

影响WS_DISABLED的API还有EnableWindow,继续下断点

确实正常情况会调用EnableWindow,异常情况则不会

EnableWindow对应在Duilib里面是ShowModal在这里插入图片描述
问题就出在:异常情况没有调用ShowModal,导致父窗口没有锁定

但因为异常情况是同步创建子窗口,如果直接调用ShowModal会进入新的消息循环,同一线程的父窗口消息循环会被阻塞,自己维护一下EnableWindow会好一些

不过就像前面说的,正常情况有调用ShowModal,去掉WS_DISABLED还是能强制拉群

想要保证窗口的唯一性,还是得在逻辑代码上加判断,不能只是依赖Duilib框架本身的限制

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

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

相关文章

Python编译器(Pycharm Jupyter)

Pycharm下载不过多赘述pycharm导入anaconda创建的python环境选择想要的环境 Jupyter Jupyter 是一个开源的交互式计算环境,能够让用户将代码、文本(包括 Markdown)、可视化结果等内容整合在一个文档中,非常适合进行数据分析、科学…

漏洞修复与Fiddler抓包工具的使用

漏洞描述 1. 短信轰炸漏洞 Type:存在三个不同的值。Login是登录处,register是注册账号处的短信验证码获取值,还有一个update值。未注册的用户也可以进行发送短信。 2. 手机号绕过,修改密码漏洞(逻辑漏洞) 目前注册使用手机号与忘记密码的手机号验证测试都可以绕过, …

对象存储-OSS

目录 对象存储背景 阿里云OSS 对象存储背景 单节点环境下,文件往往存储在tomcat服务器内,随着业务需求的增多,单节点已不能满足需求,项目架构需要扩展到多节点(见下图),此时文…

C语言函数的声明

1定义:在C语言中,函数是一段具有特定功能的独立代码块,它可以接收输入参数、执行相关操作并返回结果。2为什么需要函数(1)代码复用:避免重复编写相同功能的代码, (2)模块…

AI人工智能名片小程序源码系统,名片小程序+分销商城+AI客服,包含完整搭建教程

智能名片核心功能AI人工智能名片小程序的核心功能设计旨在彻底改变传统商务交流方式,为用户提供前所未有的智能化体验。个性化名片展示是系统的基础功能,用户可以通过丰富的模板库和自定义设计工具,创建独具特色的电子名片。系统提供多种预设…

React 教程:井字棋游戏

React 教程:井字棋游戏 使用 React 实现一个交互式的井字棋游戏,并配上好看的样式 // 导入必要的CSS样式和React库 import "./App.css"; import { useState } from "react";// Square组件 - 表示棋盘上的一个格子 function Square({…

React源码2 React中的工厂函数:createRoot()

#React V18.2 源码前置基础知识:工厂函数工厂函数是一种设计模式,用于动态创建对象或函数实例。其核心思想是通过封装对象创建的细节,提供统一的接口,从而增强代码的灵活性和可维护性,有一些核心作用:解耦创…

《UE5_C++多人TPS完整教程》学习笔记42 ——《P43 瞄准(Aiming)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P43 瞄准(Aiming)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Stephen Ulibarri…

SQL Server 临时表、表变量与WITH语句的用法与区别

引言 在SQL Server数据处理中,临时表、表变量和WITH语句(CTE)是关键的中间结果集管理工具。临时表适合大数据量操作,表变量优化小数据量场景,而CTE则简化复杂查询逻辑。三者选择需综合考量数据量级、事务需求及代码可读性。本文将深入解析其工作机制,通过实测对比指导场…

【Android】组件及布局介绍

一:代码分析 1:Android界面开发方式 (1)JavaView(传统视图系统) 这是 Android 早期的开发方式,用 Java 或 Kotlin 代码配合 XML 布局文件 来构建界面。(简单了解即可) 分…

Android 音视频 IPC序列化工具-Flattenable

Android Binder与AIDL与Service使用案例及分析-CSDN博客 讲讲这个类,被用在Android音视频中,跨进程序列化反序列化用。与Binder驱动有很强的联系。位于: feameworks/native/utils/Flattenable.h Flattenable, 译为令人满意的。可能是作者十分满意自己的这些作品吧,起了这…

文献学习|全面绘制和建模水稻调控组景观揭示了复杂性状背后的调控架构。

摘要: 解析调控复杂性状的机制对于推进作物改良至关重要。在此,我们提出了一个全面的水稻(Oryza sativa)调控组图谱,涵盖了来自三个代表性品种的23种不同组织的染色质可及性。我们的研究揭示了117,176个独特的开放染色…

Linux的压缩与解压缩

一、使用tar命令进行打包与解包 1.0、tar命令简介和常用选项 tar命令是Linux中经常使用的归档工具,它的主要功能是【对文件或者目录进行打包归档】,归档为一个文件,但是并不进行压缩;tar命令的归档操作效果如下: tar命…

OpenCV+OCR实现弧形文字识别

以下是基于OpenCV与OCR实现弧形文字识别的完整技术方案,结合了图像预处理、几何变换与OCR引擎调用等关键步骤,并提供优化技巧:🔍 一、技术原理弧形文字识别的核心在于​​将弯曲文本转换为水平直线​​,便于OCR引擎处理…

【保姆级目标检测教程】Ubuntu 20.04 部署 YOLOv13 全流程(附训练/推理代码)

前言 YOLOv13 是 YOLO 系列的全新一代实时目标检测框架,在保持极高推理速度的同时显著提升了检测精度,广泛适用于嵌入式部署、工业质检、智能安防等多种场景。该版本提供了 Nano、Small、Large、X-Large 四种模型规格,用户可以根据计算资源和…

【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?

文章目录背景:什么是Agent?背景:为什么需要Function Calling或者MCP?Function Calling和MCP在用户请求中的整体流程Function Calling(函数/工具调用)MCP (Model Context Protocol)ReAct (Reasoning and Act…

CANDENCE 17.4 进行元器件缓存更新

在我从立创商城导入CANDENCE元器件后,在ORCAD放置元器件时出现了下面的错误解决办法:1、在左边找到 Design Cache文件夹,在文件夹上鼠标右击选择 Cleanup Cache2、再放置该元器件,不管这个,点击确定3、这时候成功放上…

深入理解Kafka幂等性:原理、边界与最佳实践

一、什么是真正的消息幂等性? 消息系统的幂等性经常被误解,我们需要明确其精确含义和能力边界: 1. 正确定义 Kafka幂等性保证的是:在消息传输过程中,无论因网络重试、生产者重启等故障导致的消息重复发送,B…

【RTSP从零实践】8、多播传输H264码流的RTSP服务器——最简单的实现例子(附带源码)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

【Linux】基础开发工具(3)

1. 版本控制器Git1.1 Git的简史Git 的历史可以追溯到 2005 年1。当时 Linux 内核项目的开发团队一直使用 BitKeeper 进行版本管理,但由于一位 Linux 开发成员写了一个连接 BitKeeper 仓库的外挂,BitMover 公司决定中止 Linux 免费使用 BitKeeper 的授权1…