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. |