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 装饰在那里也用过。
使用 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 装饰在那里也用过。