Fråga:
Vad betyder dword_XXXX och offset dword_XXXX i IDA?
anx199
2018-07-31 19:41:25 UTC
view on stackexchange narkive permalink

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 pekare , men i det andra fallet var det *pekare.

Och innebörden av förskjutning dword_XXXX i det första fallet var &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.

Ta bort ditt svar från frågan och lägg till det som ett svar. Du kan skicka svar på dina egna frågor
Ett svar:
anx199
2018-07-31 23:03:59 UTC
view on stackexchange narkive permalink

Jag tror att jag räknat ut vad som händer.

Opkoderna för utskriften var (förutsatt dword_AAAAAAA istället för allmänt dword_XXXX ):

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

Tack vare denna sida vet jag att ovanstående instruktioner är lika med:

  push [0xAAAAAAA]; tryck på andraPointerpush 0xAAAAAAAA; tryck på &otherPointer  

Så i det här fallet är dword_XXXX lika med värdet för en pekare. I det andra fallet (återigen antar vi dword_AAAAAAAA istället för allmänt dword_XXXX):

  A1 AA AA AA AA mov eax, dword_AAAAAAA; eax = vtableB9 AA AA AA AA mov ecx, offset dword_AAAAAAAA; ecx = globalPointer2  

Och det är lika med:

  mov eax, [0xAAAAAAA]; eax = vtablemov ecx, 0xAAAAAAAA; ecx = globalPointer2  

Således är dword_XXXX i detta fall lika med * pekare snarare än pekare .

Därför tror jag att svaret är: det beror på. Vi måste förstå vad dword_XXXX betyder - det kan vara en pekare, en adress till pekaren eller till och med pekare till pekare till pekare och så vidare. Men IDA ger oss en ledtråd: förskjutning dword_XXXX betyder ett råvärde av vad som helst dword_XXXX är och dword_XXXX ger ett dereferensvärde av det.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 4.0-licensen som det distribueras under.
Loading...