在使用idata时,我有时会在idata段中获得类似??0CSGString@@QAE@ABV0@@Z的名称。他们看上去很奇怪,但那是因为名字损坏。但有时我会得到像__imp__DoPopup@4这样的名字,但由于名字的损坏,这种情况似乎不是这样的。此外,我还在另一个反汇编的idata段中获得了相同的函数,但名称为DoPopup。那么我的问题是:第二个函数名有效吗?或者仅仅是IDA弥补了它的一个名字?
发布于 2021-08-13 05:22:58
@4不是C++名称损坏;它是使用堆栈args的字节数来修饰stdcall函数的约定,例如,使用ret 4而不是普通的ret。这会产生链接器错误,而不是在不匹配的情况下难以调试运行时。
在C++中,函数是extern "C" DoPopup(some_4byte_type)。
我们无法推断返回类型。
__imp__foo是DLL中asm符号_foo的DLL导入,所以这实际上不是C++ _imp__DoPopup。除了C++名称mangling之外,我猜想,如果它不是extern "C",那么您可能已经有了__imp__??0CSGString@@QAE@ABV0@@Z来导入该函数。
对于32位Windows来说,用前导下划线来装饰符号是件很重要的事情,尽管它不适用于这里,因为__imp__是它自己的装饰形式,可以代替它。
32位的fastcall也使用名称相同的被调用pops,但是前两个are是在寄存器中传递的。(我忘了@n是否包括寄存器args将使用的空间。)
请注意,Windows没有为x64符号名和它们的C名称添加前导下划线,并且使用了不同的调用约定-pops,所以这里也不会使用@number装饰。
https://stackoverflow.com/questions/68767075
复制相似问题