我正在使用radare2分析macOS应用程序,该应用程序依赖于许多Qt框架。当我打印出应用程序主要可执行文件的导入符号时,框架函数的名称中包含奇怪的字符。

例如,如果框架导出函数名称:QLocalServer::listen(QStringconst&),则在主可执行文件的导入中它变为_sym.imp._ZN12QLocalServer6listenERK7QString

另一个示例:
QNetworkProxyFactory::setUseSystemConfiguration(bool)变为
sym.imp._ZN20QNetworkProxyFactory25setUseSystemConfigurationEb

谁能解释为什么有那些字符?在分析框架的导出功能时,我看不到这些字符。

#1 楼

这些“怪异”名称是由编译器生成的,称为名称修改或名称修饰。这些名称由radare2显示,但不是由其产生或生成的。

引用MSDN:


C和C ++中的函数,数据和对象程序在内部用修饰的名称表示。装饰名称是编译器在编译对象,数据,
或函数定义时创建的编码字符串。它记录调用约定,类型,函数参数和其他信息以及名称。这种
名称修饰(也称为名称修饰)可以在链接可执行文件时帮助链接程序找到正确的函数和对象。


有关名称修饰的Wikipedia文章有一些由GCC制作的C ++的名称处理示例。我建议您仔细阅读以更好地理解该主题。它解释了如何生成变形的名称,并描述了名称的结构。


radare2和许多不同的Disassembler一样,都知道如何分解不同的名称。有几个配置变量可以处理名称处理:确保告诉radare2加载已解散的符号。您可以通过将e asm.demangle = true设置为true来实现。您可能需要再次加载二进制文件-为此,请使用e bin.demangle。就像这样使用它:oo用于C ++名称修改。

评论


最奇怪的是,它的整个用途与(直言不讳地)假设的OP恰好相反:这是因为原始声明('(,),:,&,〜)中出现的所有那些“奇怪”字符都不在链接器符号中允许。

–杂件
18 Jun 29'在8:33



感谢Megabeets提供了非常详细的答案!有效。我只想指出,拆解不适用于导入符号(即ii命令的结果)

– Thanh Bui
18-6-29在16:52