【Windows逆向】【Qt】日志信息打印

news2024/11/18 21:38:31

▒ 目录 ▒

    • 🛫 导读
      • 需求
      • 开发环境
    • 1️⃣ 示例程序Demo
    • 2️⃣ 编写功能(QtCreator版本)
    • 3️⃣ 编写功能(VS版本)
    • 🛬 文章小结
    • 📖 参考资料

🛫 导读

需求

调试是编程中常见的定位手段,打印合适的调试信息能帮助我们快速定位问题,大多数程序都会有很多调试日志代码,Qt中使用qDebug进行日志调试,通过qInstallMsgHandler和qInstallMessageHandler进行调试信息定制,我们也将根据这两个函数将程序中未显示的调试信息显示出来。其它程序可以根据hook指定的函数实现调试信息的显示。
也可以直接hook QDebug类中的函数来实现!!!

开发环境

版本号描述
文章日期2022-12-09

1️⃣ 示例程序Demo

在窗口程序中创建一个按钮,并实现其点击功能,打印几行信息,代码及效果图如下所示:
在这里插入图片描述
有了上面的代码,默认还是会将调试内容直接输出到dbgview中,所以,我们调用函数qInstallMessageHandler先将程序的调试信息隐藏不输出。

void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
}
 
int main(int argc, char *argv[])
{
    qInstallMessageHandler(outputMessage);
    // ...
}

2️⃣ 编写功能(QtCreator版本)

由于我使用的MingW的工程写的Demo,我们这里也使用MingW的编译器创建工程mydll,工程为dll工程。内容很简单,创建一个类Mydll,并创建个全局对象Mydll g_dll;,在构造函数中调用保存文件的逻辑,具体代码如下:

Mydll g_dll;
 
void MyLog(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    OutputDebugStringA(msg.toStdString().data());
}
 
void test_qdebug()
{
    qInstallMessageHandler(MyLog);
}
 
Mydll::Mydll()
{
    test_qdebug();
    return;
}

同上节一样,使用代码注入器将mydll.dll注入到目标进程Demo.exe。然后点击按钮打印,查看dbgview可以查看到调试信息。

3️⃣ 编写功能(VS版本)

其实编写注入模块mydll.dll并不一定必须要使用QtCreator,只要让程序能调用目标进程的功能函数就可以了。下面我们使用另一个函数qInstallMsgHandler实现日志打印。

首先我们分析下qInstallMsgHandler和qInstallMessageHandler,前者是旧版本的日志接口,函数原型为qInstallMsgHandler(void ()(QtMsgType, char const)),传入的参数为两个参数的函数指针,在Qt5中不能直接被调用,会编译失败。而qInstallMessageHandler参数为三个参数的函数指针,多了一个QMessageLogContext参数。如果使用VS,我们当然使用简单的qInstallMsgHandler函数来实现了,具体代码如下:

void MyLog2(DWORD, char const*s)
{
    OutputDebugStringA(s);
}
 
void Hook_qInstallMessageHandler()
{
    typedef void(*QtMessageHandler)(DWORD, DWORD);
    HMODULE h = LoadLibraryA("Qt5Core.dll");
    FARPROC fn = (FARPROC)GetProcAddress(h, "_Z18qInstallMsgHandlerPFv9QtMsgTypePKcE");     // qInstallMessageHandler
    if (fn == NULL)
    {
        OutputDebugStringA("********************     fn == NULL\n");
        return;
    }
 
    __asm {
        push MyLog2
        call fn
        add esp, 4
    }
}

🛬 文章小结

不要用中文路径,可能编译失败。

📖 参考资料

  • github源码:https://github.com/ninecents/MyOpen。

**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。

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

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

相关文章

字节一面,操作系统这题没答好,可惜了

问题引入: 在曾经我们学习Linux的经历中,我们也是多次使用信号的。比如:当我们在使用xshell时,在命令行中按Ctrlc,这个键盘输入产生了一个硬件中断,被操作系统获取,解释成信号,发送…

两百行C++代码实现yolov5车辆计数部署(通俗易懂版)

这周用opencv简单实现了一下基于yolov5检测器的车辆计数功能,方法是撞线计数,代码很简单一共就两百多行,测试视频是在b站随便下载的。注:该代码只能演示视频demo效果,一些功能未完善,离实际工程应用还有距离…

JMeter整体综述

JMeter整体综述1. JMeter体系结构及运行原理1.1 主要的组件1.2 运行原理2. 元件执行顺序和作用域2.1 元件执行顺序2.2 元件执行作用域3. 参考1. JMeter体系结构及运行原理 负载模拟:负责模拟用户请求。如取样器有参数化的需求,可通过配置元件或前置处理器…

15.JavaScript 01

文章目录一、概念二、功能三、 JavaScript发展史四、 ECMAScript:客户端脚本语言的标准1、基本语法1. 与html结合方式2. 注释3. 数据类型4. 变量5. 运算符6. 流程控制语句7. JS特殊语法8. 练习:99乘法表2、基本对象1. Function:函数(方法)对象…

上线3天,下载4万,ChatGPT 中文版VSCode插件来了

ChatGPT 的 Debug 功能,有人应用化了。 ChatGPT 这几天可谓是风头无两。作为一个问答语言模型,它最大的优点就是可以回答与编程相关的问题,甚至回复一段代码。 尽管有人指出 ChatGPT 生成的代码有错误,但程序员们还是对它写代码、…

图像配准开源数据集资源汇总

Brown 数据集 数据集下载链接:http://suo.nz/3042bh 数据集由 1024 x 1024 位图 (.bmp) 图像组成,每个图像包含一个 16 x 16 图像块阵列。每个补丁都被采样为 64 x 64 灰度,具有规范的比例和方向。 ETHZ Toys 数据集下载链接&#xff1a…

Java中的语法糖(真甜)

什么是语法糖(Syntactic sugar) 语法糖是一个计算机数据,特指在编程语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。 糖嘛&#xff0c…

08.DashBoard流监控配置

08.DashBoard流监控配置 每个服务提供者都需要实现actuator&#xff0c;才可以实现流量监控。 导入Maven依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><…

【图像去噪】空域+频域滤波图像去噪【含GUI Matlab源码 914期】

⛄一、获取代码方式 获取代码方式1&#xff1a; 完整代码已上传我的资源&#xff1a;【图像去噪】基于matlab GUI空域频域滤波图像去噪【含Matlab源码 914期】 获取代码方式2&#xff1a; 通过订阅紫极神光博客付费专栏&#xff0c;凭支付凭证&#xff0c;私信博主&#xff0…

移动端防抓包实践

目录介绍 01.整体概述介绍 1.1 项目背景1.2 思考问题1.3 设计目标1.4 收益分析 02.市面抓包的分析 2.1 Https三要素2.2 抓包核心原理2.3 搞定CA证书2.4 突破CA证书校验2.5 如何搞定加解密2.6 Charles原理2.7 抓包原理图2.8 抓包核心流程 03.防止抓包思路 3.1 先看如何抓包3.2 …

C++计算机视觉库OpenCV在Visual Studio 2022的配置方法

本文介绍在Visual Studio 2022中配置、编译C 计算机视觉库OpenCV的方法。 1 OpenCV库配置 首先&#xff0c;我们进行OpenCV库的下载与安装。作为一个开源的库&#xff0c;我们直接在其官方下载网站&#xff08;https://opencv.org/releases/&#xff09;中进行下载即可&#x…

实现无入侵式C++代码mock工具

为了实现真正无侵入式的mock&#xff0c;我们基于开源Hook框架Frida-gum提供的API&#xff0c;利用C模板进行封装&#xff0c;作者编写了一个简单实用的mock工具&#xff0c;在此开源分享&#xff08;代码详见附录&#xff09;。背景在单元测试中&#xff0c;往往需要减少被测函…

如何实现高性能网络编程-ChatGPT怎么看

hi ,大家好&#xff0c;我是大师兄。听说最近chatgpt特别火&#xff0c;那我们邀请一下chatgpt如何实现&#xff1a;我们先来小试牛刀&#xff1a;刚开始用先用英文交流一下&#xff0c;然后试一下中文&#xff1a;元芳你怎么看&#xff1f;下期直播主题--网络编程 (如何实现高…

用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (7)- 用状态机实现红绿灯

AWPLC 目前还处于开发阶段的早期&#xff0c;写这个系列文章的目的&#xff0c;除了用来验证目前所做的工作外&#xff0c;还希望得到大家的指点和反馈。如果您有任何疑问和建议&#xff0c;请在评论区留言。 1. 背景 AWTK 全称 Toolkit AnyWhere&#xff0c;是 ZLG 开发的开源…

kaggle实战:基于超市消费数据的用户个性化分析案例

大家好&#xff0c;今天给大家分享一篇 kaggle 数据集的新文章&#xff1a;基于一份超市消费数据集的用户个性化分析以及用户分群的实现。 更多详细内容参考原数据集地址&#xff1a; https://www.kaggle.com/code/sonalisingh1411/customer-personality-analysis-segmentati…

实验八 网络优化与正则化(3)不同优化算法比较

目录7.3 不同优化算法的比较分析7.3.1 优化算法的实验设定7.3.1.1 2D可视化实验7.3.1.2 简单拟合实验7.3.1.3 与Torch API对比&#xff0c;验证正确性7.3.2 学习率调整7.3.2.1 AdaGrad算法7.3.2.2 RMSprop算法7.3.3 梯度估计修正7.3.3.1 动量法7.3.3.2 Adam算法7.3.4 不同优化器…

java基于Springboot的简历系统-计算机毕业设计

项目介绍 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;简历系统当然也不能排除在外。简历系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;…

SAP ABAP CDS view Association 引入的缘由

ABAP CDS view 支持三种 join 方式&#xff1a; Inner JoinLeft Outer joinRight outer join 我们使用 ABAP Development Tool 的 CDS view 向导创建一个 CDS view&#xff1a; 向导里包含的 $ 和大括号就是占位符&#xff0c;需要开发人员自己指定&#xff1a; 我们把占位符…

奇舞周刊475期:2022年 CSS 生态圈技术趋势!

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■2022年 CSS 生态圈技术趋势&#xff01;一年一度的 State of CSS 调查结果正式公布&#xff01;通过本文看看2022年 CSS 生态圈的技术趋势&#xff01;React Streaming SSR 原理解析Re…

BI技巧丨RANKX浮点运算

RANKX这个函数&#xff0c;白茶之前已经写过很多期了&#xff0c;本期是对RANKX函数一个细节问题的补充。 我们常见的数据类型有很多&#xff0c;用来聚合的主要有三种数据类型&#xff1a;文本、整数、小数。 在大部分场合&#xff0c;小数是实际FACT数据中最为常见的数据类…