C++反汇编类的this指针,怎么区分各种函数调用约定来确定哪个是this指针呢?

this 到底是什么
this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。

https://blog.csdn.net/qq_38576022/article/details/97170077

  1. 先了解下各种调用约定一般的方式, 这个只是约定, 部分细节不同编译器是不一样的, 如VS2010/32
    调用方式 参数 栈恢复
    __fastcall ecx,edx,esp n
    __stdcall esp 0
    __cdecl esp n
    __stdcall(class) ecx,esp n
    __cdecl(class) ecx,esp 0
    __fastcall(class) ecx,edx,esp n
    如果用其他编译器, 这些是不一样的

x64的汇编一般只有一种 fastcall

  1. this只是一个指向对象的指针, 在代码中实际是无法严格判断一个函数是否是类成员函数, 还是普通函数
    比如 class A
    int A::fun1() return 1;
    int fastcall fun2(class A *obj) return 2;
    fun1 和 fun2的结构是一样的, ecx都是一个对象的指针, 但是无法判断是否是类成员函数, 也就是this

参考链接

C++-逆向分析-类的成员函数地址与对象地址动态绑定-this指针-成员函数和成员虚函数反汇编解析_插件开发的博客-CSDN博客_c++成员函数逆向 尽管我们想要调用的是 Bar::b() ,但是 Foo::f() 却被调用了,因为fptr是静态绑定(翻译君注:这里的静态绑定,即指在编译阶段,fptr的值已经确定了,所以即使进行强制转换,依然调用的是Foo类的f()函数)。通过汇编码发现,普通成员函数时通过地址直接调用,而虚成员函数时通先调用vcall函数,然后由vcall函数查询虚表调用相应的虚函数,由此可以看出,一个类里面的每一给虚函数都有一个vcall函数与之对应,通过vcall函数来调用相应的虚函数。为了减少代码长度,将部分无关汇编代码省略。 https://blog.csdn.net/m0_67316550/article/details/127314921?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166778417816782391856476%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166778417816782391856476&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-127314921-null-null.nonecase&utm_term=C%2B%2B%E5%8F%8D%E6%B1%87%E7%BC%96%E7%B1%BB%E7%9A%84this%E6%8C%87%E9%92%88%EF%BC%8C%E6%80%8E%E4%B9%88%E5%8C%BA%E5%88%86%E5%90%84%E7%A7%8D%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A%E6%9D%A5%E7%A1%AE%E5%AE%9A%E5%93%AA%E4%B8%AA%E6%98%AFthis%E6%8C%87%E9%92%88%E5%91%A2%EF%BC%9F&spm=1018.2226.3001.4450

C++成员函数 this指针 调用约定_陆业聪的博客-CSDN博客 摘要:介绍了如何取成员函数的地址以及调用该地址.关键字:C++成员函数 this指针 调用约定一、成员函数指针的用法  在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而 https://blog.csdn.net/mba16c35/article/details/12362077?ops_request_misc=&request_id=&biz_id=102&utm_term=C++%E5%8F%8D%E6%B1%87%E7%BC%96%E7%B1%BB%E7%9A%84this%E6%8C%87%E9%92%88%EF%BC%8C%E6%80%8E%E4%B9%88%E5%8C%BA%E5%88%86%E5%90%84%E7%A7%8D%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A%E6%9D%A5%E7%A1%AE%E5%AE%9A&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-0-12362077.nonecase&spm=1018.2226.3001.4450