Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Erik# en 6 Julio 2009, 13:10 pm



Título: Hola mundo en FASM
Publicado por: Erik# en 6 Julio 2009, 13:10 pm
No se si hay un hola mundo en fasm, pero es el que programo yo actualmente, y os quiero poner un hola mundo tanto con MessageBox como con printf.
+==============MESSAGEBOXA=============+

Código
  1. include 'win32ax.inc'
  2. .data
  3.    holatit db 'Hola Mundo',0
  4.    hola db 'Hola Mundo, un saludo',0
  5. .code
  6. start:
  7. push 0
  8. push hola
  9. push holatit
  10. push 0
  11. call [MessageBoxA]
  12. push 0
  13. call [ExitProcess]
  14. .end start

Primero declaramos la libreria con la que programaremos, en fasm es win32ax, puedes cambiar la dirección de la ruta según donde la tengas tu.
Despues abrimos el sector de código .data donde declararemos variables..
Declaramos dos variables del tipo string (db) y llenamos su contenido con comillas simples y ponemos un 0 al final.
Después abrimos el sector code donde escribiremos nuestro código y metemos start: para indicar el del comienzo del código, seguidamente usaremos la función MessageBoxA de win32.
Si os dais cuenta la sintaxis seria en otro lenguaje: MessageBox(0,hola,holatit,0);
El primer 0 corresponde al ultimo de por ejemplo en C, el holatit corresponde al titulo, el hola corresponde al mensaje a mostrar, y el ultimo 0 corresponde al primer 0 de la función en C(ejemplo).
Después invocaremos la función ExitProcess para acabar el code sin que nos salte errores.
Indicamos un 0 y después hacemos la llamada a ExitProcess.
La función call sirve para llamar a funciones o tambien se puede usar invoke.

+==============PRINTF===============+

Para usar printf invocaremos de diferentes librerias X función, se puede hacer al principio incluyendola o en el sector idata que a mi me parece más comodo, usaremos este ultimo.

Código
  1. format pe console
  2. entry start
  3. include 'win32ax.inc'
  4. .code
  5. start:
  6. invoke printf,'Hola Mundo'
  7. invoke getchar
  8. invoke ExitProcess,0
  9. section '.idata' import data readable
  10. library msvcrt,'msvcrt.dll',kernel32,'kernel32.dll'
  11. import msvcrt,printf,'printf',getchar,'_fgetchar'
  12. import kernel32,ExitProcess,'ExitProcess'

Primero comenzamos declarando que tipo de programa sera, podemos indicar GUI, console...
Después indicamos el entry start para comenzar el código de consola.
Seguidamente declaramos la libreria win32ax.
Ahora introducimos el sector de code para indicar que utilizaremos ya a programar código visible.
Ahora invocamos la función printf que posteriormente la declararemos y imprimimos Hola Mundo.
Ahora usamos la función getchar para pausar el proyecto y que podamos ver lo del printf.
Ahora utilizamos la función ExitProcess, para que no nos salte error.
Ahora utilizaremos section '.idata' import data readable para declarar dll y funciones.
Primero indicamos el nombre que les daremos para usar a las dll msvcrt y kernel32.
Ahora desde msvcrt importamos la función printf y le damos el nombre de printf y despues la función _fgetchar y le damos el nombre de getchar.
Y por utltimo desde la dll kernel32 importamos la función ExitProcess.


Título: Re: Hola mundo en FASM
Publicado por: ny0x en 6 Julio 2009, 18:03 pm
nada mas ten cuidado con las apis que utilicen la convencion cdecl porque necesitas equilibrar la pila despues de llamar la funcion. yo no acostumbro a usar invoke asi que no me acuerdo si te equilibra la pila. Solo tenlo en cuenta o puedes tener errores.


Título: Re: Hola mundo en FASM
Publicado por: Karcrack en 7 Julio 2009, 09:44 am
nada mas ten cuidado con las apis que utilicen la convencion cdecl porque necesitas equilibrar la pila despues de llamar la funcion. yo no acostumbro a usar invoke asi que no me acuerdo si te equilibra la pila. Solo tenlo en cuenta o puedes tener errores.
Con FASM si no me equivoco puedes llamarlas poniendo 'cinvoke' :D


Título: Re: Hola mundo en FASM
Publicado por: Eternal Idol en 7 Julio 2009, 09:48 am
Es correcto lo que dice Karcrack, el codigo que use invoke con funciones cuya convencion de llamada sea C y tengan parametros jodera la pila.

"invoke in FASM is implemented as an external macro; as such, it cannot determine if the function being invoked is being called via import or directly, or if it's stdcall or c type (the PROTO directive is not used in FASM).
In other words, the invoke keyword in MASM, must be replaced in FASM with the appropriate macro:

● invoke (For stdcall function via import).
● cinvoke (For c function via import).
● stdcall (For direct call stdcall function).
● ccall (For direct call c function). "

http://www.winasm.net/what-is-fasm.html