__此调用具有u stdcall行为 我是一个逆向工程,一个旧的C++代码,我发现了一些我无法理解的东西,如何从一个普通的C++代码中完成。来自DLL的函数签名是一个损坏的名称,可以恢复为public:void\uu thiscall MyClass::MyClass(int)

__此调用具有u stdcall行为 我是一个逆向工程,一个旧的C++代码,我发现了一些我无法理解的东西,如何从一个普通的C++代码中完成。来自DLL的函数签名是一个损坏的名称,可以恢复为public:void\uu thiscall MyClass::MyClass(int),c++,calling-convention,C++,Calling Convention,在MS文档中,\u thiscall函数具有使用ECX寄存器传递的this成员(对于非静态方法)。这个particulcar函数正确使用了ECX寄存器,但是,从反汇编代码来看,第一个参数不是int参数,而是指向对象的指针 这是我从DLL公共名称中看到的: void __thiscall MyClass::MyClass(int); main() { MyClass *pmc; MyClass *pmc2; pmc = new MyClass(pmc2,0); }

在MS文档中,
\u thiscall
函数具有使用ECX寄存器传递的
this
成员(对于非静态方法)。这个particulcar函数正确使用了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将被忽略。

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

比如说

ClassB __thiscall functionName(param1)
将被编译为

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

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

如何实现类似的功能?与前一个问题一样——为什么会有这样令人惊讶的事情?您遇到了一个构造函数,正如预期的那样,它遵守了_thiscall调用约定。我想OP要问的是,“如果this指针已经通过ECX传递了,那么为什么它看起来也被推到了堆栈上?”我的问题是“首先,您是如何完成反向名称损坏的?”(例如,向我们展示损坏的名称)。以及“您是如何分解函数以相信调用模式也会在堆栈上传递‘this’”(向我们展示分解过程)。使用dumpbin,DLL在其他导出的条目中显示:使用dumpbin,DLL在其他导出的条目中显示:
70 3B 0000552A??GCSLOleDateTimeSpan@@QBE?AV0@ABV0@@Z
。使用unmangle:
public:class CSLOleDateTimeSpan\uu此调用CSLOleDateTimeSpan::operator-(class CSLOleDateTimeSpan const&)const
。此方法的调用代码是:
leaeax,[ebp+arg0];push eax;leaeax,[ebp+work];push eax;mov esi,ecx;call CSLOleDateTimeSpan::operator-(CSLOleDateTimeSpan const&)
。请注意,堆栈中有三个参数,其中一个是指针传递到ECX的参数。如何实现类似于什么的功能?与前面的问题相同——为什么会出现这种情况?正如所料,您遇到了一个构造函数,它遵守了u thiscall调用约定。我想OP在问什么,是“如果此指针已经通过ECX传递,那么为什么它看起来也被推到堆栈上?”我的问题是“您是如何首先完成反向名称损坏的?”(例如,向我们显示损坏的名称)。以及”您是如何分解函数以相信调用模式也会在堆栈上传递“this”的。使用dumpbin,DLL在其他导出的条目中显示:使用dumpbin,DLL在其他导出的条目中显示:
70 3B 0000552A??GCSLOleDateTimeSpan@@QBE?AV0@ABV0@@Z
。使用unmangle:
public:class CSLOleDateTimeSpan\uu此调用CSLOleDateTimeSpan::operator-(class CSLOleDateTimeSpan const&)const
。此方法的调用代码是:
leaeax,[ebp+arg0];push eax;leaeax,[ebp+work];push eax;mov esi,ecx;call CSLOleDateTimeSpan::operator-(CSLOleDateTimeSpan const&)
。请注意,有三个参数被推入堆栈中,其中一个参数将指针传递到ecx。