Mov edi, edi

Iniciado por hosuko, 15 Enero 2011, 21:26 PM

0 Miembros y 1 Visitante están viendo este tema.

hosuko

Hola que tal?, soy nuevo en esto del ensamblador y al mirar que hacia la libreria user32.dll cuando le llamas a MessageBox usando OllyDbg, me encontré con este código:
.  Mov edi, edi

Cuando lo ejecuto carga los datos que puse en la pila. ¿Acaso mov no se limita a mover los datos de un argumento a otro?.
   Si alguien me pudiera explicar el porqué de esa instrucción y su funcionamiento, gracias.

Eternal Idol

No pasa eso que decis, depura de nuevo, cuando lo ejecutas no cambia nada, esa instruccion mueve al registro edi el valor contenido en el registro edi, esta ahi para otra cosa (hotpatching) que sinceramente no viene al caso.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Karcrack

http://msmvps.com/blogs/kernelmustard/archive/2005/04/25/44413.aspx

hosuko

     Gracias por las respuestas.

     Creo que lo entiendo. En realidad mov edi, edi no sirve para nada, según entendí, mi inglés tampoco es para tirar flores, lo que ocurre es que si hay un 'hook' sustituye esa linea y las 5 anteriores en las que no hay código, solamente NOP, por un salto a otra función que es la encargada de realizar la lectura de la pila o lo que sea.

     Si no entendí mal, el HotPaching lo que hace es sustituir o actualizar código binario sin necesidad de reiniciar. El echo de poner mov edi, edi y no dos nop es porque resulta más rápido leer una instrucción de 2 bytes que no 2 nop, de modo que si no se necesita realizar el hotpaching es más rápido de esa manera.

     Me queda una duda. ¿Es posible mirar a donde salta y lo que hace?.

Eternal Idol

¿Que tiene que ver la pila? La funcion hara todo lo que tiene que hacer, eso es un detalle, puede no tener parametros y obviar el uso de la pila. En lugar de comprender tu primera duda te pones a investigar un tema avanzado ... mejor lee sobre la pila (instrucciones push, pop, registros esp y ebp, etc).

Y si, con el depurador podes ver a que direccion van ambos saltos, el primero (el de mov edi, edi) es uno corto que va al segundo y este (el que se pone en los nop's) va al hook.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

hosuko

     Gracias por responder tan rápido. Lo de la pila lo digo porque esa era la duda. Todo viene a que no me di cuenta que añade a la pila datos, creo que necesito gafas  :rolleyes:.

     Ahora que estaba escribiendo aquí el contenido de la pila ya lo he visto, vaya que fallo. Este es el contenido de la pila, ahora ya lo entiendo  :P:

     Antes del mov edi, edi:

6FFB0    0401014    Call to MessageBoxA from 2.0040100E
6FFB4    0000000    hOwner = 0
6FFB8    0402000    Text = "Hola"
6FFBC    040200C   Title = "Titulo"
6FFC0    00000000  Style = MB_OK | MB_APPLMODAL
6FFC4    7C817077  Return to kernel32.7C817077
6FFC8    7C920228  ntdll.7C920228

     Después de ejecutar dicha linea:
6FFB0    0401014 Return to 2.0401014 from user32.MessageBoxA
6FFB4    0000000
     Añade estas 2 lineas.


   

Eternal Idol

Lee con atencion, no añade nada de nada y el contenido es exactamente el mismo:

6FFB0    0401014    Call to MessageBoxA from 2.0040100E
6FFB4    0000000    hOwner = 0
6FFB8    0402000    Text = "Hola"
6FFBC    040200C   Title = "Titulo"
6FFC0    00000000  Style = MB_OK | MB_APPLMODAL
6FFC4    7C817077  Return to kernel32.7C817077
6FFC8    7C920228  ntdll.7C920228

     Después de ejecutar dicha linea:
6FFB0    0401014 Return to 2.0401014 from user32.MessageBoxA
6FFB4    0000000

Lo que figura como texto es simplemente una ayuda del OllyDbg.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Space.Medafighter.X

Cita de: hosuko en 16 Enero 2011, 10:02 AM
En realidad mov edi, edi no sirve para nada

Claro que sirve, sirve de relleno para facilitar el "hotpatching" o "hooking" -como quieran llamarlo- y completar un tamaño determinado al comienzo del API.

Cita de: hosuko en 16 Enero 2011, 10:02 AM
Si no entendí mal, el HotPaching lo que hace es sustituir o actualizar código binario sin necesidad de reiniciar.

No, en este caso sería para que una aplicación X ejecute código cuando llame al API.