IDA中dword_XXXX和偏移量dword_XXXX是什么意思?

逆向工程 艾达 x86 纳姆
2021-06-26 22:31:30

考虑以下代码:

在 C++ 中:

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

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

在 IDA(内部someFunction)中:

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

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

printf("Address of pointer = %p, pointer's value = %p\n", &otherPointer, otherPointer);

我得到了:

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

call printf

因此dword_XXXX似乎是一个指针的值,offset dword_XXXX似乎是一个指针的地址。

但是,我注意到另一个代码(可以与我上面提供的 c++ 函数表示相同):

SomeClass2* globalPointer2;

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

IDA 出人意料地给了我(里面someFunction2):

mov eax, dword_XXXX ; eax = globalPointer2
mov ecx, offset dword_XXXX ; ecx = &globalPointer2
jmp dword ptr [eax+5Ch] ; call [globalPointer2+0x5C] with &globalPointer2 as this?? It should be call vtable[0x5C]

我检查了这些值,发现 IDA 以某种方式“改变”了 的含义dword_XXXX,在这种情况下,它实际上是:

mov eax, dword_XXXX ; eax = vtable
mov ecx, offset dword_XXXX ; ecx = globalPointer2
jmp dword ptr [eax+5Ch] ; call vtable[0x5C]

为什么dword_XXXX在第二种情况下的含义不同?在第一种情况下它只是pointer,但在第二种情况下它是*pointer

offset dword_XXXX在第一种情况下的含义&pointer,在第二种情况下是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

感谢这个网站,我知道上面的说明等于:

push [0xAAAAAAAA]; push otherPointer
push 0xAAAAAAAA;   push &otherPointer

所以,在这种情况下,dword_XXXX等于一个指针的值。但是,在第二种情况下(再次假设dword_AAAAAAAA而不是 general dword_XXXX):

A1 AA AA AA AA    mov eax, dword_AAAAAAAA ; eax = vtable
B9 AA AA AA AA    mov ecx, offset dword_AAAAAAAA ; ecx = globalPointer2

它等于:

mov eax, [0xAAAAAAAA] ; eax = vtable
mov ecx, 0xAAAAAAAA ; ecx = globalPointer2

因此在这种情况下dword_XXXX等于*pointer而不是pointer

因此,我认为答案是:视情况而定。我们需要理解是什么dword_XXXX意思——它可以是一个指针,一个指针的地址,甚至是指向指针的指针,等等。但是 IDA 给了我们一个提示:offset dword_XXXX意味着任何事物的原始值dword_XXXXdword_XXXX给出它的取消引用值。