这里发生了什么:v5 = *(_ Byte *)(这+ 4)?

时间:2010-12-04 01:35:41

标签: c++ ida

我正在查看IDA pro的代码转储。这个布局有一个功能:

garbled_name(int this...
    unsigned int v5 ;
    v5 = *(_Byte *)(this + 4);
    ...

我真正好奇的是'+ 4'到底在做什么?这是一个补充还是其他什么?

由于

4 个答案:

答案 0 :(得分:3)

代码取整数'this',向其加4,将其转换为指向字节的指针,然后将'v5'设置为该地址处字节的值。

答案 1 :(得分:2)

它只是C ++类的成员函数,this是指向对象的指针。该对象的签名可能是:

class some_class {
    int i;    // int, void*, short, anything with sizeof() <= 4, and it's not char. 
              // It also can be absent if it's a virtual class (AFAIK it's compiler dependend)
    unsigned char c; // or c[N]
    ...
};

有问题的代码是:

some_class::some_fn(...){
    unsigned int v5 = c; // or c[0]
    ...
};

答案 2 :(得分:1)

它是对象开头的第五个字节的引用。根据编译器生成的代码,很可能是类顺序中的项目位于对象实例的第五个字节。

答案 3 :(得分:0)

编辑:叹了口气,我错过了“IDA Pro”部分。我将这里放在娱乐价值中,以防有人想知道普通C ++代码中“这个+ 4”是做什么的。

<击> “this + 4”取你当前的指针,向前移动四倍大小。然后它将其转换为字节指针并读取它。

考虑一下:

struct A {
    void foo();

    int x;
    int y;
};

sizeof(A),在32位系统上,很可能是8个字节。

A myArray[8];
A *pA = myArray;

现在pA指向&amp; myArray [0]。

pA++;

现在pA指向&amp; myArray [1],即它向前移动了8个字节。

void A::foo() {
    A *pA = this + 4;
}

如果你在&amp; myArray [0]上调用它,它将指向&amp; myArray [4],即未来的32个字节。