Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: hosuko en 15 Enero 2011, 21:26 pm



Título: Mov edi, edi
Publicado por: hosuko en 15 Enero 2011, 21:26 pm
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.


Título: Re: Mov edi, edi
Publicado por: Eternal Idol en 16 Enero 2011, 00:13 am
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.


Título: Re: Mov edi, edi
Publicado por: Karcrack en 16 Enero 2011, 00:35 am
Código:
http://msmvps.com/blogs/kernelmustard/archive/2005/04/25/44413.aspx


Título: Re: Mov edi, edi
Publicado por: hosuko en 16 Enero 2011, 10:02 am
     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?.


Título: Re: Mov edi, edi
Publicado por: Eternal Idol en 16 Enero 2011, 11:17 am
¿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.


Título: Re: Mov edi, edi
Publicado por: hosuko en 16 Enero 2011, 12:14 pm
     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.


   


Título: Re: Mov edi, edi
Publicado por: Eternal Idol en 16 Enero 2011, 16:21 pm
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.


Título: Re: Mov edi, edi
Publicado por: Space.Medafighter.X en 21 Enero 2011, 01:42 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.

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.