Bueno amigos, he leido un poco de ASM y la verdad ayuda demaciado, practicando me propuse hacer un bucle simple usando MessageBoxA y no resulto tan facil pero al fin lo hice y creo haber sacado mis conclusiones.

Código: Seleccionar todo

include 'Tu ruta de win32ax.inc'

.data
 msg db 'Provando un bucle',0
 title db 'Test',0

.code

start:

xor ecx,ecx; ECX = 0
add ecx,5d;  ECX = 5
Bucle: invoke MessageBoxA,0,msg,title,0 ; Call MessageBox
pop ecx ; Sacamos ultimo parametro de la pila
pop ecx ; Sacamos penultimo dato de la pila
pop ecx ;  ''
pop ecx ;  ''
Dec ecx ; Decrementamos ECX en 1
JNZ Bucle ; Si ECX <> 0 Saltamos al bucle


Push 0 ; Ingresamos parametro de la API ExitProcess a la pila
Call [ExitProcess]; Llamamos a la API

.end start
Compilado en FASM.

Mi conclusion segun este pequeño codigo es que cuando usamos registros y a la vez Apis, los registros almacenan valorer de parametros de estas apis, por eso sin sacar los parametros de la pila el bucle no era el correcto.

Comentarios, sugerencias, criticas o correcciones son Bienvenidas

Salu2!
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
Edito: Te pego un Bucle Infinito que lo codde ahora en 5 minutos

Código: Seleccionar todo

include 'E:\FASM\FAsm\INCLUDE\WIN32AX.INC' ; Tu Ruta de Win32ax.inc
.data
 data ?
hola db 'poison',0
adios db 'poison1'
.code
start:
jota:
push 0
push hola
push adios
push 0
call [MessageBoxA]
jmp jota
call [ExitProcess]
.end start
Este no para de lanzar el MsgBox,pero con CMP y un salto (jne,jmpe,je) puedes hacer algo similar a un For,una condicion...

Salu2
Blog técnico dedicado a la seguridad informática y al estudio de nuevas vulnerabilidades.
Blog: http://www.seginformatica.net
Twitter: https://twitter.com/#!/p0is0nseginf
yeaah! como me gusta estos chicos, ahi dandole duro al ASM buen trabajo! aun que no halla entendido nada

SALUDOS!!
Soy un camaleón, en tu cama, leona ♪
The Swash escribió:Bueno amigos, he leido un poco de ASM y la verdad ayuda demaciado, practicando me propuse hacer un bucle simple usando MessageBoxA y no resulto tan facil pero al fin lo hice y creo haber sacado mis conclusiones.

Código: Seleccionar todo

include 'Tu ruta de win32ax.inc'

.data
 msg db 'Provando un bucle',0
 title db 'Test',0

.code

start:

xor ecx,ecx; ECX = 0
add ecx,5d;  ECX = 5
Bucle: invoke MessageBoxA,0,msg,title,0 ; Call MessageBox
pop ecx ; Sacamos ultimo parametro de la pila
pop ecx ; Sacamos penultimo dato de la pila
pop ecx ;  ''
pop ecx ;  ''
Dec ecx ; Decrementamos ECX en 1
JNZ Bucle ; Si ECX <> 0 Saltamos al bucle


Push 0 ; Ingresamos parametro de la API ExitProcess a la pila
Call [ExitProcess]; Llamamos a la API

.end start
Compilado en FASM.

Mi conclusion segun este pequeño codigo es que cuando usamos registros y a la vez Apis, los registros almacenan valorer de parametros de estas apis, por eso sin sacar los parametros de la pila el bucle no era el correcto.

Comentarios, sugerencias, criticas o correcciones son Bienvenidas

Salu2!
The Swash, este código está mal.
el programa no sale porque se haya cumplido el bucle y llegue al ExitProcess, sino porque revienta la pila y lo cierra Windows.
No puedes hacer esos "pop ecx" después de la llamada a MessageBox porque con ellos sacas valores de la pila que son necesarios para el buen funcionamiento del programa.
El bucle no te funciona bien porque la API MessageBox usa ecx, con lo que pierde su valor de 5, lo que tendrías que hacer es guardar ese valor y luego recuperarlo.
Por cierto, si vacias ecx y luego le sumas 5, ¿no será más lógico poner 5 en ecx directamente? así que el código te quedaría algo así:

Código: Seleccionar todo

.code

start:

mov ecx,5d;  ECX = 5
Bucle:
push ecx; Guardamos el valor de ecx
invoke MessageBoxA,0,msg,title,0 ; Call MessageBox
pop ecx ; Recuperamos el valor de ecx
Dec ecx ; Decrementamos ECX en 1
JNZ Bucle ; Si ECX <> 0 Saltamos al bucle

invoke ExitProcess, 0
.end start
En este caso hay un "pop ecx" porque previamente he hecho un "push ecx" (envío un valor a la pila y lo recupero) y no pierdo la posición de la pila.

Lo mejor que puedes hacer es abrir el ejecutable que generas con algún debugger como el OllyDbg y ver, instrucción a instrucción que es lo que hace.

Saludos.
Imagen
Grande PeterPunk muchas gracias por que la verdad no me convencia del todo pero parecia funcionar.... Mil gracias nuevamente!
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
Ya hemos aprendido para la proxima Swash

Salu2
Blog técnico dedicado a la seguridad informática y al estudio de nuevas vulnerabilidades.
Blog: http://www.seginformatica.net
Twitter: https://twitter.com/#!/p0is0nseginf
Responder

Volver a “Fuentes”