▒ 目录 ▒
🛫 导读
需求
开发环境
版本号 | 描述 | |
---|---|---|
文章日期 | 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