1

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

从 MS 文档中,__thiscall函数具有this使用 ECX 寄存器传递的非静态方法的成员。嗯,这个特殊的函数正确使用了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)

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

4

1 回答 1

1

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

例如

ClassB __thiscall functionName(param1)

将被编译为

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

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

于 2018-11-22T10:46:43.697 回答