2013-04-09 96 views
0

我正在阅读某人的代码,他正在调用这样的函数。该块中的“this”是一个指向虚拟方法表的指针,他正在使用偏移量来调用表中的函数。如果你想知道这是一件黑客事情。这是怎么回事?

__asm 
{ 
    MOV EDI, this 
    LEA ECX, [EDI + 0x4] 
    MOV EDX, DWORD PTR DS:[ECX] 
    CALL [EDX + 0x24] 
} 

他的代码更简单位,只是称“这个” +偏移,但我对什么是在这个事情感到困惑。我可以发布Ida的vtable转储,如果这样会有所帮助的话。

+0

哦,是的,该函数返回一个指向结构的指针,如果有帮助的话。 – haze 2013-04-09 03:34:43

+0

你能澄清一下“发生了什么”的含义吗?你是否要求解释个别装配说明?或者是“个别装配说明”是你正在寻找的答案? – 2013-04-09 03:47:01

+0

我只想知道作者是如何从0xD4获得偏移量的。另外,什么是“DWORD PTR DS:[ECX]”部分在做什么?这几乎是我想要弄清楚的。 – haze 2013-04-09 03:54:31

回答

0

看起来像多重继承。在这种情况下,每个继承的类接口都有单独的vtables。因此,2nd和3rd指令计算指定的继承类接口的vtable的开始。调用是显而易见的,24只是一个幻数,是在该继承类中调用的函数的已知偏移量。

0

this在C++中是一个关键字,它可以在对象范围内用来表示对象本身。

class A{ 
    private: 
     int x; 

    void method(){ 
     this->x = 5; //"this" is a pointer to the object itself 
    } 
}; 

在本例中,“this”是A* const

+0

感谢您的回应,但我知道“这”是什么。我在问这个代码中作者究竟做了什么。他以某种方式得到一个远离基地址的0xD4的函数,而我无法弄清楚如何。 – haze 2013-04-09 03:51:56

+0

对不起,我误解了。 – 2013-04-09 03:58:00