【问题标题】: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 Foo{DWORD x; public: DWORD getX(){return x;}},我希望它编译成你上面的内容。 (阅读 cmets,现在,这是 Francois 所说的)
  • @PeteBecker 这是前面提到的,显示的代码是由反编译器生成的。其中大部分看起来像 C hack,这取决于编译器的具体细节。

标签: c++ x86 reverse-engineering calling-convention


【解决方案1】:

可能是解决方案:来自 cmets

“在我看来 sub_40A490 是某个类的成员函数,它返回一个 _DWORD 成员,它是该类的第一个成员。”

– 弗朗索瓦·安德里厄

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 2015-10-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多