我正在查看IDA pro的代码转储。这个布局有一个功能:
garbled_name(int this...
unsigned int v5 ;
v5 = *(_Byte *)(this + 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)
<击> “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个字节。
击>