Tänk på följande kod:
I C ++:
SomeClass * globalPointer; // vi vet inte vad det pekar på, men det är inte noll en pekare, det initialiseras försvinna someFunction () {globalPointer->someVirtualFunction ();}
I IDA (inuti someFunction
):
mov ecx, dword_XXXX; ecx = globalPointermov eax, [ecx]; eax = vtablejmp dword ptr [eax + 30h]; call vtable [0x30]
Betydelsen av dword_XXXX
är bara ett pekervärde. Jag försökte kontrollera det på detta sätt:
printf ("Adress för pekaren =% p, pekarens värde =% p \ n", &otherPointer, otherPointer);
Och jag fick:
push dword_XXXX; annanPointerpush offset dword_XXXX; &otherPointerpush offsetformat; "Pekarens adress =% p, pekarens värde =% p \ n" samtal printf
Således dword_XXXX
verkar vara ett pekarens värde och offset dword_XXXX
verkar vara en adress för pekaren.
Jag märkte emellertid en annan kod (som kan uttryckas på samma sätt som c ++ -funktionen jag tillhandahöll ovan):
SomeClass2 * globalPointer2; ogiltig someFunction2 () {globalPointer2->someVirtualFunction2 ();}
Och IDA gav mig överraskande (inuti someFunction2
):
mov eax, dword_XXXX; eax = globalPointer2mov ecx, offset dword_XXXX; ecx = &globalPointer2jmp dword ptr [eax + 5Ch]; ring [globalPointer2 + 0x5C] med &globalPointer2 som detta ?? Det borde kallas vtable [0x5C]
Jag kollade värdena och fick reda på att IDA på något sätt "ändrar" betydelsen av dword_XXXX
, i det här fallet var det faktiskt :
mov eax, dword_XXXX; eax = vtablemov ecx, offset dword_XXXX; ecx = globalPointer2jmp dword ptr [eax + 5Ch]; ring vtabell [0x5C]
Varför betydelsen av dword_XXXX
var annorlunda i det andra fallet? I det första fallet var det bara
Och innebörden av &pointer
och i det andra fallet var pointer
.
Jag är ledsen om något är oklart, jag försökte verkligen för att förenkla det så mycket som möjligt.