2010-10-31 11 views

risposta

53

Supponendo x86 a 32 bit, utilizzare la seguente funzione:

get_eip: mov eax, [esp] 
     ret 

Quindi, per ottenere il valore di PEI in EAX, semplicemente:

call get_eip 
+2

Questo è fantastico: D – Mehrdad

+0

vorrei che ci fosse un modo per farlo senza etichette o conteggio dei byte – Dmitry

9
call foo 
foo: 
    pop eax ; address of foo 
+8

Questo approccio ha un problema sottile. I processori moderni cercano di prevedere gli indirizzi di ritorno: una chiamata che non è associata a un ritorno incasina la previsione. Vedi http://blogs.msdn.com/b/oldnewthing/archive/2004/12/16/317157.aspx – user200783

+0

@Paul Baker di solito non è un problema critico. Per esempio 'call @f/db '123', 0/@@:' è una pratica comune – Abyx

+0

call foo, pop eax, push eax, ret –

22

On x86-64 (a differenza di 32 bit x86), c'è l'indirizzamento relativo RIP (RIP è l'analogo a 64 bit di EIP). Quindi, in codice a 64 bit, si può solo fare

lea rax, [rip] 

per spostare il contenuto corrente della RIP-RAX (è possibile utilizzare lea ma non mov per questo).

+0

Commento eccellente. Ho cancellato la mia risposta errata. I commenti non devono essere pubblicati come risposte. –

+0

Hmmm, questo non funziona in un blocco __asm ​​{} 'di VC++ 2015. :(Ottieni l'errore "Errore C2415: tipo operando improprio". – Adrian

Problemi correlati