添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
私奔的硬盘  ·  python 3.x - binary ...·  1 年前    · 
千杯不醉的回锅肉  ·  [GNN]Understanding ...·  2 年前    · 

从图中可以看到,android模拟器、魔兽战网平台、Origin游戏平台、x64dbg都使用了qt框架,除此之外还有很多应用使用了Qt,市面上对Qt的逆向也很多,在这里我们将分析如何导出Qt中的图片资源,其他资源暂时未找到方法,有大神知道的不吝赐教。

创建含有资源的Qt程序示例

关于如何创建Qt工程,添加资源文件不详细介绍了。随便百度搜一下就行了,这里参考了教程 Qt中为工程添加资源文件、给按钮添加图片

下面我我的工程资源文件截图,包含了资源:

我们的任务就是将logo.ico文件从生成的exe中导出来。

通过Qt官网文档可以知道,项目中的res.qrc文件,会被编译为qrc_res.cpp。我们通过Hex Workshop查看文件二进制内容;通过python查看文件大小;通过Qt Creator打开qrc_res.cpp。我们先看下下面截图内容:

  • 在文件qrc_res.cpp中的注释,我们可以知道,qt_resource_data数组保存了logo.ico文件内容;
  • 查看文件大小为67,646 字节,通过python查看文件大小为0x1083e;0x1083e也的确被保存在了qt_resource_data数组中,内容为 0x0,0x1,0x8,0x3e,
  • 比对Hex Workshop文件内容和qt_resource_data数组,可以发现内容是不一样的,显然内容被压缩了。
  • 分析到这里,可以确定文件不是简单的被保存的PE文件的资源段中的,而且有可能被压缩处理了。那就换个思路,通过调用资源文件的方式将文件调用到内存中。

    Qt中加载文件是通过路径“:/new/prefix1/logo.ico”加载的,直接构造对象QPixmap,即可加载图片资源,调用QPixmap的save函数即可将文件保存起来,那么我们写个dll,直接执行这些函数是不是就可以了呢。

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

    Mydll g_dll;
    Mydll::Mydll()
        char *res = ":/new/prefix1/logo.ico";
        QString localname = QString("D") + res;
        QPixmap icon(res);
        icon.save(localname);
        return;
    

    使用流程如下图所示:

    如果用其它的开发工具,比如VS这种,要怎么实现呢?

    如果只有vs,不使用qt,需要构造相关的数据结构,比如QString等;或者直接调用Qt5Core.dll导出函数构造相关的数据结构。简单的包含一此头文件,编译会失败的。

    怎么知道一个资源的路径呢

  • CE搜索字符串“:/”
  • OD、IDA字符串删选“:/”
  • 关注资源,对应的构造函数,下断点或者IDA查找一下,都能定位资源路径
  • 不要用中文路径,可能编译失败。
  • debug和release调用的qt库是不一样的,需要特别注意。
  • MingW的工程和VS的工程也是不一样的,需要特别注意。
  • 测试下一个Qt5.6的某exe,使用Qt5.8的dll,依然可以将文件导出。
  • github源码:https://github.com/ninecents/MyOpen
  • 九分出品,欢迎吐槽。更多精彩,可以前往博客地址