这些“奇怪”的名字是由编译器产生的,被称为 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。