这是某种铸造功能吗?如果是这样,为啥是__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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们使用 'this->' 而不是 'this'。访问成员?

PHP优化这是正确的吗?

为啥要用one-hot编码

铸造跟CNC哪种好?为啥?

散装机自动铸造

C语言为啥可以重写标准库函数?