2010-10-31 12 views

Respuesta

53

Suponiendo x86 de 32 bits, utilice la siguiente función:

get_eip: mov eax, [esp] 
     ret 

Entonces, para obtener el valor de la EIP en EAX, simplemente:

call get_eip 
+2

Esto es increíble: D – Mehrdad

+0

Ojalá hubiera una manera de hacer esto sin etiquetas o byte contando – Dmitry

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

Este enfoque tiene un problema sutil. Los procesadores modernos intentan predecir direcciones de retorno: una llamada que no está emparejada con un retorno arruina la predicción. Ver http://blogs.msdn.com/b/oldnewthing/archive/2004/12/16/317157.aspx – user200783

+0

@Paul Baker, por lo general, no es un problema crítico. Por ejemplo 'call @f/db '123', 0/@@:' es una práctica común – Abyx

+0

call foo, pop eax, push eax, ret –

22

en x86-64 (a diferencia de 32 bit x86), hay RIP-direccionamiento relativo (RIP es el análogo de 64 bits de EIP). Así, en código de 64 bits, sólo puede hacer

lea rax, [rip] 

para mover el contenido actual de RIP a RAX (se puede utilizar lea pero no mov para esto).

+0

Excelente comentario. Borré mi respuesta incorrecta Los comentarios no deben publicarse como respuestas. –

+0

Hmmm, esto no funciona en un bloque VC++ 2015 '__asm ​​{}'. :(Obtenga 'error C2415: error tipo de operando incorrecto'. – Adrian

Cuestiones relacionadas