Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式
共享内存
就之前不是开发了一个Leventure_DeveloperKey用以调试程序嘛,在这里简单聊一下调试模式的方案。
这里的调试分为了两种,一种是调试模式,一种是开发者模式。需要这两种模式的原因也很简单:1.在远程调试的时候,我可能需要程序从头开始进入调试,这就要求程序一直卡在开头的某个位置。2.在程序使用的时候可能需要一些特殊的按钮,这个按钮就可以让它有一个后门,让它能够以一些特别的状态进入开发者模式,比如一些设置,一些按钮,可以直达某个函数或者某个接口。
为了实现这个功能,主要是要通过一个Leventure_DeveloperKey的认证,也就是当我们打开这个Leventure_DeveloperKey的时候,需要让系统内的所有程序都认识到这个程序的存在,而且要根据不同模式的设置,其他程序对这个程序的认知还不同。
之前的方案是直接修改窗口名称,比如现在是调试模式,就叫DebugMode,现在是开发者模式,就叫Developer,每次程序启动的时候都需要扫描系统内所有程序的窗口名称,并从中扫描出需要的窗口。
但是这样有两个问题:一是修改窗口名称,获取窗口名称的代码比较复杂,读取窗口名称的函数并没有想象中的那么方便。二是这个方案并不跨平台,在windows下可以用,但是在别的平台下就不可用了。
鉴于以上原因,我们就需要一个新的方案:
共享内存的方案
共享内存是一种高效的进程间通讯方式,其基本原理是将同一个物理内存块映射到多个进程的虚拟地址空间中,从而使这些进程可以直接读写相同的内存区域。不同于消息传递或管道等方式,共享内存数据不需要进行复制,因此它更加高效,能够大幅度减少CPU时间和内存的开销。
在使用共享内存时,需要三个步骤:
创建共享内存区域,并将其挂载在进程虚拟地址空间中。
在多个进程之间共享访问该内存区域的句柄/标识符。
通过该句柄/标识符,在多个进程中读写共享内存中的数据。
共享内存的优点包括:
高效:共享内存不需要复制大量数据,因此速度较快,对系统资源使用较少。
方便:所有映射到该内存区域的进程都可以方便地访问该内存,无需通过其他IPC机制来传递数据。
灵活:长期存在,可随时修改数据。
可扩展性强:可以增加多个进程共享单个内存区域。
然而,使用共享内存也需要注意一定的安全问题,如避免出现数据混乱、避免重复映射等。
共享内存使用场景:
共享内存是一种在进程之间传递数据的高效方法,因为它避免了数据复制的不必要开销。共享内存适用于以下情况:
数据量较大:如果数据量很大,将它们复制到其他进程中可能会导致性能问题和额外的系统负担。使用共享内存可以避免这些问题。
进程需要频繁访问相同的数据:如果多个进程需要对同一个数据集进行频繁的读写访问,则使用共享内存往往比使用管道或套接字等 IPC 机制更有效。
需要高速通信:共享内存操作非常快速,因为它直接访问内存而无需复制数据或通过加/解锁来同步访问。这使得它特别适合需要快速通信的应用程序,例如实时数据流、多媒体传输等。
进程需要使用共享的状态信息:如果多个进程或线程需要访问使用相同的状态信息,则将这些信息放在共享内存区域中是最好的方式之一。
给定应用程序的要求:有些应用程序需要使用共享内存进行通信。这主要取决于应用程序的设计、复杂性和性能需求。
值得注意的是,使用共享内存要小心,因为多个进程同时访问同一块内存可能会导致数据不一致问题。因此,在使用共享内存时需要正确地管理锁和同步机制以确保数据的正确性。
使用例:
Leventure_DeveloperKey中可以放上如下代码:
#include <QtSharedMemory>
#include <QString>
int main(int argc, char *argv[])
{
// 创建共享内存,并指定唯一的键名
QSharedMemory sharedMemory("Leventure_Developer");
// 如果共享内存已经被创建过,则释放它
if (!sharedMemory.create(sizeof(QString))) {
sharedMemory.attach();
sharedMemory.deleteLater();
sharedMemory.create(sizeof(QString));
}
// 将要写入共享内存的字符串
QString developer = "Developer";
// 锁定共享内存,确保数据可以正确写入
if (sharedMemory.lock()) {
// 将字符串拷贝到共享内存中
QString *data = (QString*)sharedMemory.data();
*data = developer;
// 解锁共享内存
sharedMemory.unlock();
}
return 0;
}
在需要植入后门程序的代码中放入类似代码:
#include <QtSharedMemory>
#include <QString>
int main(int argc, char *argv[])
{
// 创建共享内存,并指定唯一的键名
QSharedMemory sharedMemory("Leventure_Developer");
// 锁定共享内存,以便读取数据
if (sharedMemory.lock()) {
// 从共享内存中读取数据并转换为 QString 类型
QString *data = (QString*)sharedMemory.data();
QString developer = *data;
// 解锁共享内存
sharedMemory.unlock();
// 处理从共享内存读取到的数据
qDebug() << developer;
}
return 0;
}
Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式的更多相关文章
- qt的共享内存
https://blog.csdn.net/gdutlyp/article/details/50468677
- Linux环境进程间通信(五): 共享内存(上)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- 【转】Linux环境进程间通信(五) 共享内存(上)
转自:https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以 ...
- <转>Linux环境进程间通信(五): 共享内存(上)
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写 ...
- Linux环境进程间通信: 共享内存
Linux环境进程间通信: 共享内存 第一部分 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进 ...
- (转)Linux环境进程间通信系列(五):共享内存
原文地址:http://www.cppblog.com/mydriverc/articles/29741.html 共享内存可以说是最有用的进程间通信方式,也是最快的 IPC 形式.两个不同进程 A ...
- linux 进程间通信 共享内存 mmap
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进程A可以即时看到进程B对共享内存中数据的更新,反 ...
- ACE框架 基于共享内存的进程间通讯
ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...
- boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)
本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...
- Qt之进程间通信(共享内存)
简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...
随机推荐
- Docker命令之export|import、save|load
1.export|import export docker export -o /ly/myexport-redis 49c26f7431d1 -o : 指定一个不存在的文件夹,存放导出的镜像 imp ...
- JDK1.8下载 用阿里云盘
JDK1.8下载 用阿里云盘 jdk-8u202-windows-x64.exe https://www.aliyundrive.com/s/jJhWUk17jMt 点击链接保存,或者复制本段内容,打 ...
- Ubuntu图形界面root登录“sorry, that didn't work please
https://blog.51cto.com/u_14757092/2484490 ssh登录主机执行下vim /etc/pam.d/gdm-autologin 注释行 "auth requ ...
- Huggy Lingo: 利用机器学习改进 Hugging Face Hub 上的语言元数据
太长不看版: Hub 上有不少数据集没有语言元数据,我们用机器学习来检测其语言,并使用 librarian-bots 自动向这些数据集提 PR 以添加其语言元数据. Hugging Face Hub ...
- Hystrix:Spring Cloud服务熔断与降级组件
Hystrix:Spring Cloud服务熔断与降级组件 问题总结 熔断器? Spring Cloud Hystrix? Hystrix服务降级? 全局降级方法? 解耦降级逻辑? Hystrix服务 ...
- Angular 集成 Material UI 后组件显示不正常 踩坑日记
在使用了 npm 下载 Material 后, 项目不能正常使用 Material 组件, 随后又使用官方命令使用 Material 组件, 仍然不能正常使用 Material 组件. npm 命令 ...
- 提取 PE文件 / 目标程序 的各种信息
前段时间项目需要实现对 Windows PE 文件版本信息的提取,如文件说明.文件版本.产品名称.版权.原始文件名等信息.获取这些信息在 Windows 下当然有一系列的 API 函数供调用,简单方便 ...
- MySQL篇:第四章_详解DML语言
DML语言 插入 一.方式一 语法: insert into 表名(字段名,...) values(值1,...); 特点: 1.字段类型和值类型一致或兼容,而且一一对应 2.可以为空的字段,可以不用 ...
- 如何正确使用Python临时文件
摘要:临时文件通常用来保存无法保存在内存中的数据,或者传递给必须从文件读取的外部程序.一般我们会在/tmp目录下生成唯一的文件名,但是安全的创建临时文件并不是那么简单,需要遵守许多规则. 1.前言 临 ...
- 教你从零搭建Web漏洞靶场OWASP Benchmark
摘要:Owasp benchmark 旨在评估安全测试工具的能力(准确率.覆盖度.扫描速度等等),量化安全测试工具的扫描能力,从而更好得比较各个安全工具优缺点. 本文分享自华为云社区<Web漏洞 ...