【发布时间】:2021-08-26 15:59:56
【问题描述】:
我正在对一个程序进行逆向工程,发现一个成员方法如下所示:
int __thiscall sub_40A490(void *this)
{
return *(_DWORD *)this;
}
IDA 生成此代码,原始程序集如下所示:
sub_ proc near
mov eax, [ecx]
retn
sub_ endp
这是什么?如果是简单的演员表,为什么是__thiscall?
这个函数有很多交叉引用。例如,我们这里有一个这样称呼它:
char __cdecl sub_4011B0(int a1, int a2)
{
char v2; // bl
int v3; // esi
_DWORD *v4; // eax
int v5; // eax
if ( !a1 || !a2 )
return 0;
v2 = byte_593B70[4 * *(_DWORD *)(a1 + 504) + *(_DWORD *)(a2 + 504)];
if ( !v2 )
{
v3 = 0;
if ( sub_40A490((void *)(a1 + 1196)) > 0 )
{
while ( 1 )
{
v4 = (_DWORD *)sub_40A480(v3);
v5 = sub_40A0E0(*v4);
if ( v5 )
{
if ( *(_DWORD *)(v5 + 44) == *(_DWORD *)(a2 + 44) )
return 1;
}
else
{
sub_4CE390(v3);
}
if ( ++v3 >= sub_40A490((void *)(a1 + 1196)) )
return 0;
}
}
}
return v2;
}
【问题讨论】:
-
__thiscall不是标准的 C++ 功能。它是specific to Windows。它可能在其他平台上定义,如果您不在 Windows 上,则应查看您平台的文档。 -
__thiscall是一个调用约定:en.wikipedia.org/wiki/X86_calling_conventions#thiscall -
@geo10 我错过了你问题的那一部分。在我看来
sub_40A490是某个类的成员函数,它返回一个_DWORD成员,这是该类的第一个成员。 -
如果你编译了
class Foo{DWORD x; public: DWORD getX(){return x;}},我希望它编译成你上面的内容。 (阅读 cmets,现在,这是 Francois 所说的) -
@PeteBecker 这是前面提到的,显示的代码是由反编译器生成的。其中大部分看起来像 C hack,这取决于编译器的具体细节。
标签: c++ x86 reverse-engineering calling-convention