2010-10-31 13 views

Odpowiedz

53

Zakładając 32-bit x86, należy wykonać następującą funkcję:

get_eip: mov eax, [esp] 
     ret 

Następnie, aby uzyskać wartość EIP w EAX, po prostu:

call get_eip 
+2

To jest niesamowite: D – Mehrdad

+0

Chciałbym móc to zrobić bez etykiet i bajtów zliczających – Dmitry

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

To podejście ma subtelny problem. Nowoczesne procesory próbują przewidzieć adresy zwrotne - połączenie, które nie jest sparowane z powrotem, powoduje przepełnienie prognozy. Zobacz http://blogs.msdn.com/b/oldnewthing/archive/2004/12/16/317157.aspx – user200783

+0

@Paul Baker zazwyczaj nie jest to krytyczny problem. Na przykład 'call @f/db '123', 0/@@:' jest powszechną praktyką – Abyx

+0

call foo, pop eax, push eax, ret –

22

Na x86-64 (w przeciwieństwie do 32-bitowego x86), adresowanie korelacyjne (RIP jest 64-bitowym odpowiednikiem EIP). Tak w kodzie 64-bitowym, można po prostu zrobić

lea rax, [rip] 

przenieść bieżącą zawartość RIP do RAX (można użyć lea ale nie mov do tego).

+0

Doskonały komentarz. Usunąłem moją niepoprawną odpowiedź. Komentarze nie powinny być publikowane jako odpowiedzi. –

+0

Hmmm, to nie działa w bloku '__asm ​​{}' VC++ 2015. :(Pobierz komunikat o błędzie C2415: nieprawidłowy typ argumentu operacji. – Adrian

Powiązane problemy