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

🛫 导读

需求

调试是编程中常见的定位手段,打印合适的调试信息能帮助我们快速定位问题,大多数程序都会有很多调试日志代码,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:**文章中内容仅用于技术交流,请勿用于违规违法行为。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值