首页
社区
课程
招聘
[求助]关于thiscall调用的this指针由ecx传递问题
发表于: 2009-1-20 23:22 9445

[求助]关于thiscall调用的this指针由ecx传递问题

2009-1-20 23:22
9445
this指针在函数被调用前就先传给ECX了吗?
还是通过什么方式得到的?

问题源自《加密与解密》(第三版)P77的thiscall调用的反汇编代码。

请指点

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
;请教this指针是如何传给ECX的?怎么看出this指针是对象的地址呢?谢谢!
//源代码如下:
/*******************************************************
*  this指针                                                                                                        *
*   (c)  看雪软件安全网站 www.pediy.com 2000-2008                       *
********************************************************/
#include <stdio.h>

class CSum
{
public:
        int Add(int a, int b) //实际Add原型具有如下形式:Add(this,int a,int b)
        {
                return (a + b);
        }
};

void main()
{     
        CSum sum;
    sum.Add(1, 2);
}

;部分反汇编代码如下:
;  sum.Add(1,2)
00401000  /$  55            push    ebp                             
00401001  |.  8BEC          mov     ebp, esp
00401003  |.  51            push    ecx
00401004  |.  6A 02         push    2
00401006  |.  6A 01         push    1
00401008  |.  8D4D FC       lea     ecx, dword ptr [ebp-4]
0040100B  |.  E8 10000000   call    00401020
00401010  |.  8BE5          mov     esp, ebp
00401012  |.  5D            pop     ebp
00401013  \.  C3            retn

;  int Add(int a, int b){}
00401020  /$  55            push    ebp                              
00401021  |.  8BEC          mov     ebp, esp
00401023  |.  51            push    ecx
00401024  |.  894D FC       mov     dword ptr [ebp-4], ecx
00401027  |.  8B45 08       mov     eax, dword ptr [ebp+8]
0040102A  |.  0345 0C       add     eax, dword ptr [ebp+C]
0040102D  |.  8BE5          mov     esp, ebp
0040102F  |.  5D            pop     ebp
00401030  \.  C2 0800       retn    8
2009-1-21 22:37
0
雪    币: 226
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
在调用前放到ECX中去。至于怎么看的,好象有很多种方法,第一种排除法,总共也就那几种调用约定一个个的排。如果是VC等编写的。看到有在调用前对ECX操作,则很有可能就是thiscall 如果调用API的话,则一般是STDCALL有的是FASTCALL,不可能是THISCALL。如果是VC的类函数调用。可以通过反汇编给出的线索判断。则一般是THIS CALL 等等 。 方法很多种。关键要多分析。时间长了就有感觉了
2009-1-22 00:21
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对象内容
00370FE0: 00410104 00001234 00005678
vptr内容
00410104: 004016a0 00401640 00401f70

有以上内容可以看出,对象内容包括虚表指针,调用方法把指针地址传过去,目的是如果方法中用到类的值的话,可以通过this指针地址获取,尤其是对于多态方式的调用。指针是动态的。
2010-10-13 17:05
0
游客
登录 | 注册 方可回帖
返回
//