• Usando APIs con Bucle! [Ejemplo simple]

 #192749  por The Swash
 15 Jun 2010, 23:28
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: [ Debe registrarse para ver este enlace ]
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!
 #193069  por p0is0n-123
 16 Jun 2010, 18:14
Edito: Te pego un Bucle Infinito que lo codde ahora en 5 minutos
Código: [ Debe registrarse para ver este enlace ]
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
 #193594  por $DoC
 17 Jun 2010, 18:33
yeaah! como me gusta estos chicos, ahi dandole duro al ASM buen trabajo! aun que no halla entendido nada

SALUDOS!!
 #193872  por PeterPunk
 18 Jun 2010, 11:18
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: [ Debe registrarse para ver este enlace ]
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: [ Debe registrarse para ver este enlace ]
.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.
 #194049  por The Swash
 18 Jun 2010, 20:06
Grande PeterPunk muchas gracias por que la verdad no me convencia del todo pero parecia funcionar.... Mil gracias nuevamente!