0
点赞
收藏
分享

微信扫一扫

【Windows逆向】【Qt】资源解析

▒ 目录 ▒

🛫 导读

需求

开发环境

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

1️⃣ 分析思路

思路

获取资源路径的方法

2️⃣ c++正向编码

编码

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

使用流程

不使用Qt方式获取思路

3️⃣ frida方式获取Origin平台资源

win32 - 定位目标资源

win32 - 查找API含义

win32 - 查找《符号》构造frida本地函数

// 地址=79157BD0
// 类型=导出
// 序号=530
// 符号=??0QPixmap@@QAE@ABVQString@@PBDV?$QFlags@W4ImageConversionFlag@Qt@@@@@Z
// 符号(已解码)=public: __thiscall QPixmap::QPixmap(class QString const &,char const *,class QFlags<enum Qt::ImageConversionFlag>)
var fnQPixmap_QPixmap2 = new NativeFunction(
  Module.findExportByName('qt5gui.dll', '??0QPixmap@@QAE@ABVQString@@PBDV?$QFlags@W4ImageConversionFlag@Qt@@@@@Z'),
  'pointer', 
  ['pointer', 'pointer', 'pointer', 'int'],
  'thiscall'
);

// 参数含义解析:
// oQPixmap:this指针,作为第一个参数传递进去
// qStrPointer:自己封装的函数,构造一个QString对象,具体看后面的全部代码
// ptr(0): 传递一个值为0的指针
// 0:枚举类型Qt::AutoColor对应的值,frida中直接用整数就行了。
var oQPixmap = Memory.alloc(400);
var qStrPointer = ez_fnQString_fromUtf8(':/origin.png')
fnQPixmap_QPixmap2(oQPixmap, qStrPointer, ptr(0), 0)

win32 - 全部代码


var fnQString_fromUtf8 = new NativeFunction(
  Module.findExportByName('Qt5Core.dll', '?fromUtf8@QString@@SA?AV1@PBDH@Z'),
  'void', 
  ['pointer','pointer', 'int'],
  'mscdecl'
);
function ez_fnQString_fromUtf8(jsStr){
  var retQString = Memory.alloc(Process.pointerSize);
  var cStrPointer = Memory.allocUtf8String(jsStr);
  fnQString_fromUtf8(retQString, cStrPointer, -1);
  return retQString;
}

// 地址=79157C90
// 类型=导出
// 序号=533
// 符号=??0QPixmap@@QAE@QBQBD@Z
// 符号(已解码)=public: __thiscall QPixmap::QPixmap(char const * const * const)
var fnQPixmap_QPixmap = new NativeFunction(
  Module.findExportByName('qt5gui.dll', '??0QPixmap@@QAE@QBQBD@Z'),
  'pointer', 
  ['pointer', 'pointer'],
  'thiscall'
);
// 地址=79157BD0
// 类型=导出
// 序号=530
// 符号=??0QPixmap@@QAE@ABVQString@@PBDV?$QFlags@W4ImageConversionFlag@Qt@@@@@Z
// 符号(已解码)=public: __thiscall QPixmap::QPixmap(class QString const &,char const *,class QFlags<enum Qt::ImageConversionFlag>)
var fnQPixmap_QPixmap2 = new NativeFunction(
  Module.findExportByName('qt5gui.dll', '??0QPixmap@@QAE@ABVQString@@PBDV?$QFlags@W4ImageConversionFlag@Qt@@@@@Z'),
  'pointer', 
  ['pointer', 'pointer', 'pointer', 'int'],
  'thiscall'
);


// 地址=7A0A2E68
// 类型=导入
// 符号=qt5gui.?save@QPixmap@@QBE_NABVQString@@PBDH@Z
// 符号(已解码)=public: bool __thiscall QPixmap::save(class QString const &,char const *,int)const
// bool	save(const QString &fileName, const char *format = nullptr, int quality = -1) const
var fnQPixmap_save = new NativeFunction(
  Module.findExportByName('qt5gui.dll', '?save@QPixmap@@QBE_NABVQString@@PBDH@Z'),
  'void', 
  ['pointer', 'pointer', 'pointer', 'int'],
  'thiscall'
);


function ezSave(uri) {
  // 构造QPixmap
  var oQPixmap = Memory.alloc(400);
  var qStrPointer = ez_fnQString_fromUtf8(':/origin.png')
  console.log('1111111111111111')
  fnQPixmap_QPixmap2(oQPixmap, qStrPointer, ptr(0), 0)
  console.log('2222222222')

  // 保存图片
  var savePath = ez_fnQString_fromUtf8('D:\\origin.png')
  console.log('33333333')
  fnQPixmap_save(oQPixmap, savePath, ptr(0), -1)
  console.log('444444444444')
}

ezSave(':/origin.png')

win64 - TODO

🛬 文章小结

📖 参考资料

  • github源码 https://github.com/ninecents/MyOpen
  • [Qt] 00_Qt资源解析 https://bbs.pediy.com/thread-250691.htm
  • 代码注入下载地址 https://download.csdn.net/download/kinghzking/87254853
  • Qt官网文档 https://doc.qt.io/Qt-5/qpixmap.html
  • frida官网文档 https://frida.re/docs/javascript-api/#nativefunction
举报

相关推荐

0 条评论