__此调用具有__stdcall行为

__thiscall with __stdcall behaviour

本文关键字:stdcall 行为 调用      更新时间:2023-10-16

我正在对一个旧的C++代码进行逆向工程,我发现了一些我无法理解如何从普通C++代码中实现的东西。DLL中的函数签名是一个损坏的名称,可以恢复为public: void __thiscall MyClass::MyClass(int)

在MS文档中,对于非静态方法,__thiscall函数具有使用ECX寄存器传递的this成员。这个特殊函数正确地使用了ECX寄存器传递,但从反汇编的代码来看,第一个参数不是int参数,而是指向对象的指针。

这是我可以从DLL公共名称中看到的:

void __thiscall MyClass::MyClass(int);  
main() {  
  MyClass *pmc;  
  MyClass *pmc2;  
  pmc = new MyClass(pmc2,0);  
}

因此,在这种情况下,构造函数(以及其他方法)似乎被定义为:

void __thiscall MyClass:MyClass(MyClass *arg0, int arg1)

有什么想法可以完成这样的事情吗?

我找到了答案。当函数或方法返回非基本类型时,在调用方进行内存分配,函数(或方法)只接收指针。

例如

ClassB __thiscall functionName(param1)

将被编译为

ClassB var1;
ClassB * __thiscall functionName(&var1, param1)

在程序集级别,返回类型地址将最后推入堆栈。如果functionName是一个类方法,ECX将指向该类实例。否则,ECX将被忽略。