首页 > 软件和应用 > 常用软件教程 > 【转】无源码,定位Qt程序的函数响应地址
2016
06-16

【转】无源码,定位Qt程序的函数响应地址

本文原作者为看雪论坛 Arcade 由于作者将原文章删除了,我在这里做个备份,方便以后查阅。

以下为文章原文:

水平有限,错误在所难免,求指点。

Qt 是跨平台的 C++ UI 库,不少的商业公司都采用 Qt 开发,有的时候我们需要去分析一下商业软件的实现, 但是 Qt 的程序有和普通的 Windows 程序有所区别,其界面上的控件都是没有句柄的,所以我们需要用特殊的办法去定位相关响应函数。

编译一份 Qt 官方自带的例子先:D:\Qt\Examples\Qt-5.6\widgets\widgets\calculator

Qt里面有2个比较重要的宏,一个是SLOT, 一个是SIGNAL。

其实这2个宏只是个字符串的链接而已。例如 SLOT(HelloFunction), 其实变成 “1HelloFunction”,SIGNAL(HelloFunction) 其实变成 “2HelloFunction”。

其次要想使用这2个宏还需要在类的定义中加上 Q_OBJECT。

Q_OBJECT 是个宏,其实帮你加上了以下代码:

在 void Calculator::digitClicked() 函数下个断点,点个数字按钮,栈回溯大概如下。

【转】无源码,定位Qt程序的函数响应地址 - 第1张  | 扩软博客

Calculator::qt_static_metacall 在 moc_calculator.cpp 文件里面,这个文件是用 Moc 程序自动生成的,此文件其实是 Q_OBJECT 宏所加上的那几个函数的实现。

搜索 Calculator::staticMetaObject, 发现被 Calculator::staticMetaObject 引用。

Calculator::staticMetaObject 类型是 QMetaObject,QMetaObject 中包含的结构体变量如下:

这里主要看下 staticMetaObject 里面的 stringdata, data, StaticMetacallFunction, 也就是 qt_meta_stringdata_Calculator.data, qt_meta_data_Calculator, qt_static_metacall 3个。

qt_meta_data_Calculator 实际对应的类是 QMetaObjectPrivate。

可以看到 qt_static_metacall 函数的 _id 次序和 qt_meta_stringdata_Calculator 的 stringdata 的字符串信息是一一对应的。所以我们就可以通过 qt_meta_stringdata_Calculator 的字符串,定位到具体的实现。

【转】无源码,定位Qt程序的函数响应地址 - 第2张  | 扩软博客

【转】无源码,定位Qt程序的函数响应地址 - 第3张  | 扩软博客

以 Genymotion 2.4.0 版本。在注册对话框,如果没有输入符合格式的注册码,注册按钮是灰色的,不可用:

【转】无源码,定位Qt程序的函数响应地址 - 第4张  | 扩软博客

以正向编码猜测 注册对话框的某个 slot 函数 绑定了 textview 的 textchanged singal。

hooper 查找 2textchanged,发现多次字符串引用:

【转】无源码,定位Qt程序的函数响应地址 - 第5张  | 扩软博客

一一排除,得到 1serialChanged(), 去掉1, 查找 serialChanged(), 来到 0x00000001000cbee0

【转】无源码,定位Qt程序的函数响应地址 - 第6张  | 扩软博客

查找对 0x00000001000cbee0 引用,来到 sub_1000bc430,伪代码如下:

【转】无源码,定位Qt程序的函数响应地址 - 第7张  | 扩软博客

对比 Calculator 类,其对应的是 Calculator::qt_metacast。

在 sub_1000bc430 函数,上下3个函数去找,如何有间断的 数字判断跳转语句,得到 sub_1000bc4a0 ,也就是对应的 qt_static_metacall 函数了。(标准的是继续通过字符串的引用去找,这边是用了取巧的办法)。
qt_static_metacall 函数伪代码如下:

【转】无源码,定位Qt程序的函数响应地址 - 第8张  | 扩软博客

判断注册按钮是否可用的函数伪代码如下(也就是 sub_10005bb20 AboutDialog::serialChanged 函数)

【转】无源码,定位Qt程序的函数响应地址 - 第9张  | 扩软博客

点击注册按钮的函数伪代码如下,(也就是 sub_10005ed40 AboutDialog::registerLicense)

【转】无源码,定位Qt程序的函数响应地址 - 第10张  | 扩软博客

简单 patch 了一下 player (注意不是 genymotion),从字符串入手(例如Network),免费版本和付费版本的按钮在初始化时候传递的状态参数不同,定位以下2处代码,patch 一下强制所有按钮可用。

修改 0x00000001000c8a00 指令为 xor edx , edx 补上需要的 nop。

【转】无源码,定位Qt程序的函数响应地址 - 第11张  | 扩软博客

修改 0x00000001000c9a64 指令为 mov esi, 1 , 补上需要的 nop

【转】无源码,定位Qt程序的函数响应地址 - 第12张  | 扩软博客

开启付费功能后

【转】无源码,定位Qt程序的函数响应地址 - 第13张  | 扩软博客

本例的例子是很简单的,实际中 Qt 中还有有包含 properties, enums 等情况,包含 slot 或者 singal 函数也可以带参数的,需要再进行分析,可以自己写个包含各种属性的 Qt 测试程序来辅助练习。

最后编辑:
作者:
百度ID:“度娘程序员”,博主。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

发表回复

你的邮箱地址不会被公开,垃圾评论将被删除。

有人回复时邮件通知我