这是某种铸造功能吗?如果是这样,为啥是__thiscall?
Posted
技术标签:
【中文标题】这是某种铸造功能吗?如果是这样,为啥是__thiscall?【英文标题】:is this some kind of casting function? if so, why is it __thiscall?这是某种铸造功能吗?如果是这样,为什么是__thiscall? 【发布时间】: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 FooDWORD x; public: DWORD getX()return x;
,我希望它编译成你上面的内容。 (阅读 cmets,现在,这是 Francois 所说的)
@PeteBecker 这是前面提到的,显示的代码是由反编译器生成的。其中大部分看起来像 C hack,这取决于编译器的具体细节。
【参考方案1】:
可能是解决方案:来自 cmets
“在我看来 sub_40A490 是某个类的成员函数,它返回一个 _DWORD 成员,它是该类的第一个成员。”
– 弗朗索瓦·安德里厄
【讨论】:
以上是关于这是某种铸造功能吗?如果是这样,为啥是__thiscall?的主要内容,如果未能解决你的问题,请参考以下文章