Vraag:
Waarom wordt JMP gebruikt met CALL?
TheRookierLearner
2013-09-29 20:53:39 UTC
view on stackexchange narkive permalink

Ik probeer een oud malwarevoorbeeld in OllyDbg te analyseren. Het heeft instructies in het formaat CALL <JMP.&KERNEL32.SetUnhandledExceptionFilter>

Ik ben geen expert in assemblage. Ik weet dat CALL wordt gebruikt om een ​​subroutine aan te roepen en JMP wordt gebruikt om naar een bepaald adres in het geheugen te springen, maar wat is het resultaat van het gebruik van CALL met JMP? Kan iemand er opheldering over geven? Zelfs aanwijzingen waar ik antwoorden zou kunnen vinden, zouden zeer nuttig zijn. Bedankt.

Drie antwoorden:
Jason Geffner
2013-09-29 21:39:58 UTC
view on stackexchange narkive permalink

Het zien van een aanroep in de vorm CALL <JMP.&KERNEL32.SetUnhandledExceptionFilter> suggereert dat het binaire bestand is gecompileerd met de optie / INCREMENTAL van Visual C ++, dus de tabel met jump thunks.

... een incrementeel gekoppeld uitvoerbaar (.exe) bestand of dynamic-link library (DLL):

...

  • Kan jump thunks bevatten om verplaatsing van functies naar nieuwe adressen af ​​te handelen.

...

Ange
2013-09-29 21:42:21 UTC
view on stackexchange narkive permalink

je hebt gelijk, het kan direct worden aangeroepen in plaats van te worden gesprongen na een oproep.

Het maakt het echter gemakkelijker als het adres van de API maar één keer wordt verwezen, en deze enkele verwijzing zou een JMP zijn (anders zou het de stapel veranderen).

Er is dus maar één geheugenreferentie naar de API, via een enkele JMP . Elke keer dat de API wordt gebruikt, wordt deze JMP CALL -ed, dus de uitvoering wordt transparant overgedragen en aan het einde van de API is het oorspronkelijke adres van de beller nog steeds op de stapel, zal de beller transparant worden teruggestuurd naar.

Is dit wat de Jump-tafel vormt?
peter ferrie
2013-09-30 07:03:25 UTC
view on stackexchange narkive permalink

De reden is voor de laadprestaties - de sprongen worden verzameld in een enkele regio die tijdelijk schrijfbaar is gemaakt met het doel de API-adressen te plaatsen, en is meestal slechts een enkele pagina groot. Dit vermijdt meerdere aanroepen van VirtualProtect () door de lader, om de hele coderuimte naar elke verwijzing naar een bepaalde API te schrijven.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...