导入包含奇怪字符的符号

逆向工程 雷达2 苹果系统
2021-06-24 21:02:33

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

例如,如果一个框架导出一个函数名称:QLocalServer::listen(QStringconst&),它就会_sym.imp._ZN12QLocalServer6listenERK7QString出现在主可执行文件的导入中。

另一个例子: QNetworkProxyFactory::setUseSystemConfiguration(bool)变成 sym.imp._ZN20QNetworkProxyFactory25setUseSystemConfigurationEb

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

1个回答

这些“奇怪”的名字是由编译器产生的,被称为 Name Mangling 或 Name Decoration。这些名称由radare2 显示,但不是由它产生或生成的。

引用自MSDN

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

维基百科关于 Name Mangling 的文章有一些由 GCC 生成的 C++ 的 Name Mangling 的很好的例子我建议你仔细阅读它以更好地理解这个主题。它解释了如何产生错误的名称并描述了它的结构。


radare2,正如许多不同的反汇编,明知轧车的不同的名字。有几个配置变量可以处理 Name Mangling:

asm.demangle: Show demangled symbols in disasm
bin.demangle: Import demangled symbols from RBin
bin.demanglecmd: run xcrun swift-demangle and similar if available (SLOW)
bin.lang: Language for bin.demangle

因此,如果您希望radare2 向您显示程序集上的损坏名称,请使用e asm.demangle = true. 确保告诉radare2 加载被破坏的符号。您可以通过设置e bin.demangle为 true来执行此操作您可能需要再次加载二进制文件 -oo为此使用

如果您只想对特定名称进行解码,则可以使用iD <lang> <name>which 来对特定语言的符号名称进行解码。只需像这样使用它:iD cxx <mangled name>用于 C++ Name Mangling。