论坛首页 逆向工程技术区 阅读主题

[原创] Qt6 MetaObject解析脚本

377 浏览 0 回复
#1 楼主 2026-06-01 21:08:48
Qt6 MetaObject解析脚本

参考自 Qt5 程序初步逆向分析+解析脚本

Github -> a1cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6q4c8f1g2q4K9r3g2^5i4K6u0r3f1i4c8y4k6i4c8S2f1r3q4J5M7$3g2J5
0. 前言
众所周知, 逆向Qt程序的时候要是能找到信号和槽的关系就能事半功倍 (¬‿¬).
但是Qt6的数据结构改变了, 导致参考文献中的脚本不再适用了, 因此需要重新分析一下.
1. Qt5 回顾
在 Qt5 中, moc编译器生成的核心数据包括:

qt_meta_stringdata_XXX —— 一个含有 QByteArrayData 数组和紧随其后的 C 字符串的复合结构体
qt_meta_data_XXX —— 一个 uint 数组, 包含 QMetaObjectPrivate 头部及方法/属性/枚举的描述数据
staticMetaObject —— 一个 QMetaObject 实例, 其 d 成员指向以上数据

const QMetaObject TsignalApp::staticMetaObject = {
{ &QMainWindow::staticMetaObject, qt_meta_stringdata_TsignalApp.data,
qt_meta_data_TsignalApp, qt_static_metacall, Q_NULLPTR, Q_NULLPTR}

其对应的结构体QMetaObject.d为 源码:
// Qt5 qobjectdefs.h
struct QMetaObject {
const QMetaObject *superdata;
const QByteArrayData *stringdata; // 指向 QByteArrayData 数组
const uint *data;
typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
StaticMetacallFunction static_metacall;
const QMetaObject * const *relatedMetaObjects;
void *extradata;
} d;

看一下在ida中对应的数据形如(supderdata为NULL):根据这些信息还可以还原出class名, method名, 以及参数类型和名称:
2. Qt6 moc代码
用 Qt 6.11.0 重新编译一下参考文章中的代码:
#include "tsignalapp.h"

#include <QMessageBox>
#include <QString>

TsignalApp::TsignalApp(QWidget *parent)
: QMainWindow(parent)
// Qt6 语法
connect(this,
QOverload<>::of(&TsignalApp::mySignal),
this,
QOverload<>::of(&TsignalApp::mySlot));

connect(this,
QOverload&lt;int&gt;::of(&TsignalApp::mySignal),
this,
QOverload&lt;int&gt;::of(&TsignalApp::mySlot));

connect(this,
QOverload&lt;int, int&gt;::of(&TsignalApp::mySignalParam),
this,
QOverload&lt;int, int&gt;::of(&TsignalApp::mySlotParam));

void TsignalApp::mySlot()
QMessageBox::about(this,
"Tsignal",
"This is a signal/slot sample without parameter.");

void TsignalApp::mySlot(int x)
QMessageBox::about(this,
"Tsignal",
QString("This is a signal/slot sample with one parameter. x=%1").arg(x));

void TsignalApp::mySlotParam(int x, int y)
QMessageBox::about(this,
"Tsignal",
QString("x: %1 y: %2").arg(x).arg(y));

void TsignalApp::slotFileNew()
emit mySignal();
emit mySignal(5);
emit mySignalParam(5, 100);

拿到新的moc编译器产出的代码:
/****************************************************************************
** Meta object code from reading C++ file 'tsignalapp.h'
** Created by: The Qt Meta Object Compiler version 69 (Qt 6.11.0)
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "../../../tsignalapp.h"
#include &lt;QtCore/qmetatype.h&gt;

#include &lt;QtCore/qtmochelpers.h&gt;

#include &lt;memory&gt;


#include &lt;QtCore/qxptype_traits.h&gt;
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'tsignalapp.h' do

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290839.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号