例如,如果框架导出函数名称:
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