Ida 反汇编名称修改

Ida Disassembly Name Mangling

使用 IDA Pro 时,我有时会在 idata 段中得到类似 ??0CSGString@@QAE@ABV0@@Z 的名称。它们看起来很奇怪,但那是因为名称修改。但有时我会得到像 __imp__DoPopup@4 这样的名字,由于名称修改,这似乎不是这样。除此之外,我还在另一个反汇编的 idata 段中获得了相同的函数,但名称为 DoPopup。所以我的问题是:第二个是有效的函数名吗?还是 IDA 给它起的名字?

@4 不是 C++ 名称修改; stdcall 函数的惯例是用它们弹出的堆栈参数的字节数来装饰 ret 4,而不是普通的 ret。在不匹配的情况下,这会产生链接器错误而不是难以调试的运行时怪异。

在 C++ 中,函数是 extern "C" DoPopup(some_4byte_type)
我们无法推断 return 类型。

__imp__foo 是 DLL 中 asm 符号 _foo 的 DLL 导入 thunk,所以这实际上不是 C++ _imp__DoPopup。这是 C++ 名称修改的补充,我假设,所以如果它不是 extern "C" 那么你可能已经 __imp__??0CSGString@@QAE@ABV0@@Z 用于导入该函数。

用前导下划线装饰符号是 32 位 Windows 的事情,尽管它在这里不适用,因为 __imp__ 是它自己的装饰形式来代替它。


32 位 fastcall 也使用同名 mangling 的 callee-pops,但前 2 个参数在寄存器中传递。 (我忘记了 @n 是否包含 space 寄存器参数是否会使用。)


请注意,Windows x64 不会在 asm 符号名称和它们的 C 名称中添加前导下划线,并且使用不同的调用约定,这不是 callee-pops,因此不会有 @number 装饰在那里也用过。