在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
给出它的解引用值。
评论
从问题中删除您的答案,并将其添加为答案。您可以发布自己的问题的答案