考虑以下代码:在C ++中:

在Q4312078q中
在IDA(在someFunction内):

SomeClass* globalPointer; // we don't know what it points to, but it's not null a pointer, it's initialized

void someFunction()
{
  globalPointer->someVirtualFunction();
}


dword_XXXX的含义只是一个指针值。我试图用这种方式检查它:

mov     ecx, dword_XXXX ; ecx = globalPointer
mov     eax, [ecx] ; eax = vtable
jmp     dword ptr [eax+30h] ; call vtable[0x30]


我得到了:是指针的值,而dword_XXXX似乎是指针的地址。

但是,我注意到了另一个代码(可以表示为与我上面提供的c ++函数相同): br />
printf("Address of pointer = %p, pointer's value = %p\n", &otherPointer, otherPointer);


IDA出人意料地给了我(offset dword_XXXX内部):

push dword_XXXX ; otherPointer
push offset dword_XXXX ; &otherPointer
push offset format ; "Address of pointer = %p, pointer's value = %p\n"

call printf

改变了someFunction2的含义,在这种情况下实际上是:

SomeClass2* globalPointer2;

void someFunction2()
{
  globalPointer2->someVirtualFunction2();
}


为什么第二种情况下dword_XXXX的含义不同?第一种情况是dword_XXXX,而第二种情况是pointer

第一种情况中*pointer的含义是offset dword_XXXX,第二种情况是&pointer

很抱歉,如果有一些不清楚的地方,我真的尽力简化了。

评论

从问题中删除您的答案,并将其添加为答案。您可以发布自己的问题的答案

#1 楼

我想我知道发生了什么事。

用于打印的操作码是(假设dword_AAAAAAAA而不是一般的dword_XXXX):到此站点,我知道上述指令等于:

FF 35 AA AA AA AA    push dword_AAAAAAAA; otherPointer
68 AA AA AA AA       push offset dword_AAAAAAAA; &otherPointer


因此,在这种情况下,dword_XXXX等于指针的值。但是,在第二种情况下(再次假设使用dword_AAAAAAAA代替一般的dword_XXXX): >
因此在这种情况下dword_XXXX等于*pointer而不是pointer

因此,我认为答案是:取决于。我们需要了解dword_XXXX的含义-它可以是一个指针,该指针的地址,甚至是指向该指针的指针,等等。但是IDA给了我们一个提示:offset dword_XXXX表示dword_XXXX的原始值,而dword_XXXX给出它的解引用值。