[FASM] Downloader

Iniciado por k0ws, Mayo 19, 2013, 06:39:49 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Bueno, empece con ASM hace poco y ayer estuve un buen rato bicheandolo para jugar con las apis y salio esto:

Código: ASM
include 'include\win32ax.inc' ;Incluimos para el uso de ciertas apis.
.data ;Seccion de datos.
remote_file db 'http://underc0de.org/foro/Themes/underc0de/images/theme/logo.png',0 ;Definimos una variable para la URL.
local_file db 'deje.png',0 ;Definimos otra variable para el nombre del archivo local.
.code ;Seccion de codigo.
start: ;Comenzamos el codigo
call loading ;Llamamos a la subrutina para cargar las funciones necesarias.
call download ;Llamamos a la subrutina para descargar el archivo.
call execute ;Llamamos a la subrutina para ejecutar el archivo.
exit:
invoke ExitProcess,0 ;Salida del programa.
.end start ;Terminamos.
download: ;Cargamos en la pila los datos necesarios mediante push.
push eax
push 0
push 0
push local_file
push remote_file
push 0
call eax ;llamamos a la funcion UrlDownloadToFileA (Su direccion)
pop eax ;La sacamos de la pila.
invoke FreeLibrary, eax ; "La Liberamos"
call execute ; Nos vamos a la ejecucion del archivo.
loading:
invoke LoadLibrary, 'urlmon.dll' ;Llamamos a la libreria que contiene nuestra funcion.
invoke GetProcAddress, eax, 'URLDownloadToFileA' ;Sacamos la direccion de nuestra funcion.
call download ;Una vez definida la funcion a usar, podemos para a descargar el fichero.
execute:
invoke ShellExecuteA, 0, 0, local_file, 0, 0, SW_SHOW ;Ejecutamos el archivo y salimos...
call exit ;Llamamos a la salida...


-Saludos-

Estás llamando a las etiquetas con call por lo tanto debes acabar con ret para volver desde dónde fuiste llamado. De otra forma llenas el stack de punteros de retorno que no usas y la aplicación crashearía si no fuese porque acabas el proceso xD

Saludos
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Hola K0ws, como te dijo Kacrack tienes que acabar con ret si lamas con call para que retorne.

Por si no te as dado cuenta de los tres calls primeros solo te hace efecto el primero ya que a las otras dos funciones las vas llamando desde otras funciones y no desde el main.

Tambien haces mal el FreeLibrary ya que en ese momento EAX = URLDownloadToFile.

Te dejo tu código corregido  :)

Código: asm
include 'win32ax.inc' ;Incluimos para el uso de ciertas apis.

.data ;Seccion de datos.
      remote_file db 'http://underc0de.org/foro/Themes/underc0de/images/theme/logo.png',0 ;Definimos una variable para la URL.
      local_file db 'deje.png',0 ;Definimos otra variable para el nombre del archivo local.

      urlmon dd ?
.code ;Seccion de codigo.
start: ;Comenzamos el codigo
       call loading ;Llamamos a la subrutina para cargar las funciones necesarias.
       call download ;Llamamos a la subrutina para descargar el archivo.
       call execute ;Llamamos a la subrutina para ejecutar el archivo.

       exit:
       invoke ExitProcess,0 ;Salida del programa.

       download: ;Cargamos en la pila los datos necesarios mediante push.

       ;push eax

       push 0
       push 0
       push local_file
       push remote_file
       push 0
       call eax ;llamamos a la funcion UrlDownloadToFileA (Su direccion)

       ;pop eax ;La sacamos de la pila.

       invoke FreeLibrary, [urlmon] ; "La Liberamos"

       ret
       ;call execute ; Nos vamos a la ejecucion del archivo.

       loading:
       invoke LoadLibrary, 'urlmon.dll' ;Llamamos a la libreria que contiene nuestra funcion.
       mov [urlmon],eax
       invoke GetProcAddress, eax, 'URLDownloadToFileA' ;Sacamos la direccion de nuestra funcion.
       ret
       ;call download ;Una vez definida la funcion a usar, podemos para a descargar el fichero.

       execute:
       invoke ShellExecuteA, 0, 0, local_file, 0, 0, SW_SHOW ;Ejecutamos el archivo y salimos...
       ret
       ;call exit ;Llamamos a la salida...

.end start ;Terminamos.


un saludo.

Muchisimas gracias compa, ya me esperaba que al ser mi primer "programilla" en ASM estuviera repleto de errores, tomo nota de ellos  ;)

-Saludos-

Como anotación simplemente, nunca esta de más hacer lo siguiente en una función:

Código: asm

push ebp
mov ebp, esp
...
...
codigo
...
...
leave
ret


Así no pisas en la pila los datos que tuvieras de otras funciones ;).

Sa1uDoS