我想对为 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
给出0x7ffffffdf50
,printqs5static str
结果的地址。
问题是当只有内存地址可用时如何检查 QStrings ?
编辑:我所指的网页此时已关闭,但这里有一个兑现版本。
如果有可用的符号名称,gdb
漂亮的打印机也可以打印 QStrings。仍然不知道如何在没有它们的情况下工作。