逆向 Qt 应用

逆向工程 数据库 qt
2021-06-13 13:56:14

我想对为 linux 编写的 Qt 破解版进行逆向工程。我想跟踪介绍文本的位置。我发现这个 gdb宏可以打印 QStrings (Qt5)。为了测试它,我编写了一个简单的 helloworld 应用程序,其中包含:

QString str("almafa");
qDebug() << str;

这将按预期打印 QString。

(gdb) printqs5static str
(Qt5 QString)0xffffdf50 length=6: "almafa"

在此之后,我尝试检查没有变量名称的 QStrings。

编译后的代码看起来像(在radare2):

|           0x00400ab7      488d45b0       leaq -0x50(%rbp), %rax
|           0x00400abb      488d55c0       leaq -0x40(%rbp), %rdx
|           0x00400abf      4889d6         movq %rdx, %rsi
|           0x00400ac2      4889c7         movq %rax, %rdi
|           0x00400ac5      e816feffff     callq sym.QMessageLogger::debug
|           0x00400aca      488d55a0       leaq -0x60(%rbp), %rdx
|           0x00400ace      488d45b0       leaq -0x50(%rbp), %rax
|           0x00400ad2      4889d6         movq %rdx, %rsi
|           0x00400ad5      4889c7         movq %rax, %rdi
|           0x00400ad8      e863020000     callq sym.QDebug::operator__

我没有调试 Qt 应用程序的经验,但我希望从上面的代码片段中0x400ad8可以看到,rsi或者rdi将是 QString。不幸的printqs5static $rsi是不工作。i r $rsi给出0x7ffffffdf50printqs5static str结果的地址

问题是当只有内存地址可用时如何检查 QStrings ?

编辑:我所指的网页此时已关闭,但这里有一个兑现版本如果有可用的符号名称,gdb漂亮的打印机也可以打印 QStrings。仍然不知道如何在没有它们的情况下工作。

1个回答

你试了printqs5static $rdi吗?假设调用转到具有原型的函数QDebug & QDebug::operator<<(const QString & s),那么它rdi应该包含QString,而不是 RSI。

另一种选择是在rdi周围转储内存rsi我怀疑这个对象是不是超级复杂,所以附近应该有一个指向普通 C 字符串的指针。