首页 > 系统相关 >Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式

Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式

时间:2023-05-10 09:00:36浏览次数:46  
标签:需要 Qt 调试模式 QString 调试程序 使用 进程 共享内存 sharedMemory

共享内存

就之前不是开发了一个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,调试模式,QString,调试程序,使用,进程,共享内存,sharedMemory
From: https://www.cnblogs.com/Leventure/p/17386900.html

相关文章

  • QT中线程睡眠对数据IO的影响——串口bug记录
    这两天用QT做一个上位机,涉及到有一个数据发送完后需要用到延时,我一开始使用了线程休眠的方式进行延时://发送读取指令if(serialport->write(data)==-1){qDebug()<<"发送失败!";}QThread::msleep(1000);serialport->clear();然后我发现data并没有被发......
  • Qt XML读写之 QXmlStreamReader、QXmlStreamWriter
    OverviewQtXML将不再接收额外的功能。对于迭代地读取或编写XML文档(SAX),Qt建议使用QtCore的QXmlStreamReader和QXmlStreamWriter类。这些类既易于使用,又更符合XML标准。但是遗憾的是如果想修改更新XML文档,这个模块没有提供解决方案,还只能使用QDomDocument。QXmlStreamReader类......
  • MQTT-保留消息和遗嘱消息
    保留消息为什么需要保留消息        如果不考虑持久会话的因素,那么MQTT订阅只有在客户端连接之后才能创建,所以服务端不能提前预知某个主题会被哪些服务端订阅或者某个客户端会订阅哪些主题,所以当消息到达服务端之后,服务端只会把消息分发给当前已经存在的订阅者,......
  • QT 获取下载文件大小
    1开发环境linux版本:统信UOS1030(可以认为是特殊的ubuntu)开发语言:C++QT:5.9.92实现代码头文件#include<QtNetwork>Qt.pro中需要加对应一行QT+=network函数代码:intgetFileInfoSize(QStringurl){qDebug()<<"getFileInfoSizeurl:"<<url.toSt......
  • 【PyQt6】Python实现QComboBox显示文本与对应值不同的方法
    问题实现QComboBox显示文本与对应值不同的方法。比如下拉框显示“正确”和“错误”,但程序中想要获取“1”和“0”,但又不想再根据显示内容来判断。解决#设置combobox.addItem("正确",1)combobox.addItem("错误",0)#获取text=combobox.currentText()#正确/错误val......
  • Qt音视频开发45-音视频类结构体参数的设计
    一、前言视频监控内核组件重构和完善花了一年多时间,整个组件个人认为设计的最好的部分就是各种结构体参数的设计,而且分门别类,有枚举值,也有窗体相关的结构体参数,解码相关的结构体参数,同时将部分常用的结构体参数的获取和设置单独提供了函数,参阅海康大华等大厂的sdk的设计方式,也是......
  • Android Studio中使用断点调试程序
    1.设置断点在希望中断的位置左边label一下,设置一个断点。例如下方图片所示在ActivityResultRegistry类中的第147行设置了一个断点,以及在365行dispatchResult()方法处设置了一个断点。设置好断点后,可以在菜单栏依次点击Run->ViewBreakpoints查看所设置的全部的断点,并进行删减......
  • QT设置窗口边框圆角
    1.直接设置样式  setStyleSheet("border:5pxsolidred;border-radius:10px")2.this->setAttribute(Qt::WA_TranslucentBackground);//设置窗口背景透明this->setWindowFlags(Qt::FramelessWindowHint);//设置无边框窗口 voidSystemWarnDialog::paintEvent(Q......
  • CMake+Visual Studio构建Qt程序
    转载:https://www.codenong.com/cs106288798/转载:https://zhuanlan.zhihu.com/p/400804242一、编写代码文件main.cpp#include<QApplication>#include"Mainwindow.h"intmain(intargc,char*argv[]){QApplicationapp(argc,argv);MainWindowmain......
  • QT5 QJson与QString相互转换
    QT5QJson与QString相互转换QString转QJsonQJsonObjectMainWindow::QstringToJson(QStringjsonString){QJsonDocumentjsonDocument=QJsonDocument::fromJson(jsonString.toLocal8Bit().data());if(jsonDocument.isNull()){qDebug()<<"StringNULL&......