Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: bengy en 30 Mayo 2014, 06:34 am



Título: fasm consola
Publicado por: bengy en 30 Mayo 2014, 06:34 am
es posible trabajar por consola en FASM  ???


Título: Re: fasm consola
Publicado por: Eternal Idol en 30 Mayo 2014, 08:51 am
Si, claro. En Windows se usan las funciones de la API GetstdHandle con STD_OUTPUT_HANDLE y WriteFile.


Título: Re: fasm consola
Publicado por: _Enko en 30 Mayo 2014, 16:10 pm
Hola, yo prefiero usar la runtime de C para  la consola, se hace asi:
Código:
format PE  Console
entry start

include '%fasminc%/win32ax.inc'

section ".data" data readable writeable
        szMsg db 'Hola',0
        frmt db '%s',0
        szPause db 'PAUSE',0
        


section ".code" code readable writeable executable
start:

       cinvoke  printf, szMsg, frmt
       cinvoke  system, szPause
       invoke   ExitProcess,0

section ".idata" import data readable writeable

library kernel32,'kernel32.dll',\
        user32,'user32.dll',\
        msvcrt,'msvcrt.dll'

        include '%fasminc%\api\kernel32.inc'
        include '%fasminc%\api\user32.inc'
        include '%fasminc%\api\msvcrt.inc'

msvcrt.inc no viene con fasm, pero lo puedes agregar manualmente a los includes.
Con la ventaja de tener toda la libreria de c standard a mano; En el caso de la consola, obtiene el HANDLE automaticamente

http://bitshare.com/files/bwvzbp1q/MSVCRT.INC.html
colocas el archivo en INCLUDE/API

Saludos.


Título: Re: fasm consola
Publicado por: bengy en 31 Mayo 2014, 05:55 am
gracias por responder...

tienen algun ejemplo de como mostrar por consola los resultados de un procedimiento???

es decir que mi procedimiento devuelve varios resultados en un bucle, mi duda es como mostrar todos esos resultados


gracias a todos......


Título: Re: fasm consola
Publicado por: Eternal Idol en 31 Mayo 2014, 08:16 am
Podes usar printf perfectamente, busca su referencia en Google si nunca programaste en C/C++.


Título: Re: fasm consola
Publicado por: bengy en 1 Junio 2014, 04:03 am
pretendo mostrar dx pero no funciona
pueden revisar mi codigo? se lo agradeceria mucho...

Código:
format PE console
entry start
include 'win32w.inc'
 
;======================================
section '.data' data readable writeable
;======================================

Msg1  DB 'Introduzca el nombre:',0
Msg2  DB 'Total:$'
Msg3  DB 'Error',0dh,0ah
Avanza DB 0Dh,0Ah, '$'
BufEnt DB '*.*',0
       DB ?
ASCIIZ DB '*.*',0

DTASeg DW ?

;=======================================
section '.code' code readable executable
;=======================================
 
start:

 proc Entrada

               cld
               mov ax,@DATA
               mov ds,ax
               mov [DTASeg],es
               mov es,ax
               mov es,ax

               mov ah,4eh
               mov cx,17h
               mov dx,offset ASCIIZ
               int 21h
               jc Final

               
 Bucle:

         mov es,[DTASeg]
         mov di,80h+30

         mov cx,13
         xor al,al
         repne scasb
         dec di
         mov al,'$'
         stosb
         
         push ds

         mov ah,9
         mov ds,[DTASeg]
         mov dx,80h+30
         ccall   [printf],dx ; pretendo mostrar dx----------------------------------------
         int 21h
         pop ds
         
         mov ah,9
         mov dx,OFFSET Avanza

         int 21h

         mov ah,4Fh
         int 21h
         jc Final

         jmp Bucle
         
         Final:

         cmp ax,12h
          jne error

         mov ah,9
         mov dx,OFFSET Msg2
         int 21h
         

         
         Error:
         mov ah,9
         mov dx,OFFSET Msg3
         int 21h

         mov ax,4c01h
         int 21h

       endp
;====================================
section '.idata' import data readable
;====================================


library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll' ,\user32,'user32.dll'

import user32,MessageBoxA,'MessageBoxA'
 
import  kernel,\
        ExitProcess,'ExitProcess'
 
import  msvcrt,\
        printf,'printf',\
        getchar,'_fgetchar'


Título: Re: fasm consola
Publicado por: Eternal Idol en 1 Junio 2014, 09:09 am
¿int 21h?  :-X Estas mezclando codigo de 16 bits para MS-DOS en un programa de 32 bits para Windows que te dejo _Enko ...


Título: Re: fasm consola
Publicado por: bengy en 2 Junio 2014, 02:13 am
ouch es que aprendi assembler para 16 bits

como mostrar dx para 32 bits por consola???


Título: Re: fasm consola
Publicado por: _Enko en 2 Junio 2014, 16:05 pm
Hola, como te había comentado EternalIdol,
http://www.cplusplus.com/reference/cstdio/printf/

Código:

cinvoke printf, szFORMATO, edx

donde szFormato podría ser:
szFORMATO db "Este es el valor de DX: %i",0



recuerda que como es 32 bit, es dificil que pases como parametro DX solo, tienes que pasar el registro EDX completo.
Para que no haya problemas, recuerda hacer  XOR EDX, EDX al inicio, asi no tienes problemas con el bit alto. y Si modificas solamente DX, EDX tendrá el mismo valor.

i% significa que vas a pasar como parametro un nro entero, un INT.
printf va reemplazar %i con el valor del siguiente parametro.
Si usas por ejemplo "%i, %i"  tendrás que pasar como parametro 2 enteros.


Seria algo como
Código:
  ccall   [printf],szFORMATO, edx
szFORMATO es "%i",0

Puedes programar en fasm en 16bit tambien.
PE console  una aplicación con consola de 32 bit. No exiten interrupciones alli.
En Fasm puedes programar en 16bit tambien, si mal no recuerdo era format MZ, asi obtienes una aplicacion para DOS (que es  consola)




Saludos.


Título: Re: fasm consola
Publicado por: bengy en 2 Junio 2014, 21:28 pm
ya intente de varias formas y nada
creo que el problema es que no entra al procedimiento


Título: Re: fasm consola
Publicado por: Eternal Idol en 2 Junio 2014, 21:31 pm
Depuralo, si estas haciendo un programa para Windows con WinDbg, ya tenes todas las herramientas a mano, te toca trabajar para poder solucionarlo.


Título: Re: fasm consola
Publicado por: bengy en 2 Junio 2014, 22:24 pm
gracias... lo intentare
se que con esto mov ax,@DATA
                        mov ds,ax
guardo el segmento de datos pero me sale error para 32!!!

como lo soluciono?


Título: Re: fasm consola
Publicado por: _Enko en 3 Junio 2014, 04:09 am
Y para que quieres guardar el segmento de datos en 32bit? Es como irrelevante.


Título: Re: fasm consola
Publicado por: bengy en 3 Junio 2014, 04:18 am
es que para 16 bits es obligatorio o me equivoco??? en 32 bits no lo es?


Título: Re: fasm consola
Publicado por: _Enko en 3 Junio 2014, 15:39 pm
Nunca programé para DOS así que ni idea. Pero en windows definitivamente nunca me hizo falta.
El problema que veo ademas que estas mezclando codigo 16 bit con 32bit, es que efectivamente hay un copy past alli.
Te diría que deseches el codigo y simplemente. Ya te he pasado una plantilla para crear una consola y inclusive para imprimir una cadena.
Citar
Msg1  DB 'Introduzca el nombre:',0
Msg2  DB 'Total:$'
Msg1 es cadena que termina en NULLO como tiene que ser en Windows... pero la segunda en $ para DOS?

Dececha el copy past y escribe unas lineas, no matan, te lo aseguro :)


Título: Re: fasm consola
Publicado por: bengy en 3 Junio 2014, 23:35 pm
gracias por toda la ayuda que me dan, soy novato en asm, en serio gracias por todo.
y bueno borre todo y ahora estoy programando desde 0
asi que tengo mi primera duda... no puedo mostrar el nombre del primer elemento encontrado

este es mi codigo...

Código:
format PE console
entry start
include 'win32w.inc'
 
;======================================
section '.data' data readable writeable
;======================================

ASCIIZ DB '*.*',0
DTASeg DW ?

;=======================================
section '.code' code readable executable
;=======================================
 
start:
               xor eax,eax     ; limpio EAX
               mov ah,4eh      ; encuentro el primer archivo
               mov ecx,1Eh      ; obtengo el nombre del primer archivo
               mov edx,ASCIIZ
               ccall   [printf],edx




;====================================
section '.idata' import data readable
;====================================


library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll' ,\user32,'user32.dll'

import user32,MessageBoxA,'MessageBoxA'
 
import  kernel,\
        ExitProcess,'ExitProcess'
 
import  msvcrt,\
        printf,'printf',\
        getchar,'_fgetchar'


Título: Re: fasm consola
Publicado por: Eternal Idol en 4 Junio 2014, 08:02 am
¿Que hiciste ahora? ¿Copiaste parte del pasaje de parametros a int 21h y no la llamas? No podes mezclar ese codigo ... tenes que llamar a las funciones de la API de Windows que te dije usando stdcall.


Título: Re: fasm consola
Publicado por: bengy en 4 Junio 2014, 21:03 pm
no te entiendo!!! creo que no has notado que soy novato

pero bueno gracias de todas formas


ejjejjeje se enojjo el de abajo!!!
por lo menos eso logre


Título: Re: fasm consola
Publicado por: Eternal Idol en 4 Junio 2014, 21:43 pm
Mirate los hilos con chincheta entonces, tenes que leer mucho para pasar de hacer copy/paste.


Título: Re: fasm consola
Publicado por: bengy en 5 Junio 2014, 02:47 am
gracias a todos por ayudar a este novato... pero estoy entendiendo de a poco

hice este codigo utilizando la api de win

Código:
format PE console
entry start

include 'win32ax.inc'

section '.code' code readable executable
  start:



        invoke AllocConsole
        invoke GetStdHandle, STD_OUTPUT_HANDLE
        mov [_outhandle], eax
        invoke  FindFirstFile,buscado,wfd
        invoke WriteConsole, [_outhandle],wfd , 13, _written, 0



section '.data' data readable writeable
  _outhandle    dd   ?
  _written      dd   ?
  buscado DB '*.*',0
  wfd        WIN32_FIND_DATA


section 'idata' import data readable writeable
  library kernel, 'KERNEL32.DLL'

  import kernel,\
         AllocConsole, 'AllocConsole',\
         GetStdHandle, 'GetStdHandle',\
         WriteConsole, 'WriteConsoleA',\
         ReadConsole, 'ReadConsoleA',\
         ExitProcess, 'ExitProcess',\
          WriteFile,'WriteFile',\
          lstrlen,'lstrlen',\
          FindFirstFile,'FindFirstFileA',\
          FindNextFile,'FindNextFileA',\
          FindClose,'FindClose'.\          



Título: Re: fasm consola
Publicado por: Eternal Idol en 5 Junio 2014, 09:10 am
Tu programa ya es de consola, no hace falta llamar a AllocConsole.

¿De donde sale 13? No podes saber de antemano el tamaño de la cadena que contiene los nombres de los archivos/directorios ... ahi tenes lstrlen importada, usala.

¿Que estas tratando de comprobar si retorno correctamente? ¿FindFirstFile o WriteConsole? Si es la primera entonces el codigo esta mal, no podes hacer el cmp DESPUES de llamar a WriteConsole ya que esta igual que todas las funciones que retornan un valor va a hacerlo en EAX y va a sobreescribir el valor que retorno antes FindFirstFile. Incluso aunque no retornara nada, tenes que conocer la convencion de llamada stdcall, en la misma se especifica que EAX es un registro volatil y no preservado, es decir que cada funcion puede cambiarle el valor y retornar a la funcion llamadora sin restaurarlo al valor que tenia al ser esta funcion llamada.

Justamente ligado a lo anterior el primer parametro de FindNextFile es un HANDLE, el que devuelve FindFirstFile mas precisamente, no una cadena.

BOOL WINAPI FindNextFile(
  _In_   HANDLE hFindFile,
  _Out_  LPWIN32_FIND_DATA lpFindFileData
);

Tambien tenes que comprobar el valor de retorno antes de tratar de trabajar con lpFindFileData, eventualmente la funcion falla cuando no hay mas archivos/directorios.

La etiqueta Exit no tiene codigo, asi que ejecuta lo que sea que haya en memoria, ponele un ret al menos (tambien tenes importado ExitProcess, podrias usarlo).

¿Viste la cantidad de errores en tan poco codigo? Por eso repito: mirate los hilos con chincheta entonces, tenes que leer mucho para pasar de hacer copy/paste.


Título: Re: fasm consola
Publicado por: bengy en 5 Junio 2014, 16:53 pm
uy gracias!!! corregi algo pero no del todo alguna idea para seguir avanzando?



Título: Re: fasm consola
Publicado por: Eternal Idol en 5 Junio 2014, 17:04 pm
uy gracias!!! corregi algo pero no del todo alguna idea para seguir avanzando?

Si, aplica todo lo que te dije en el mensaje anterior, con eso sin duda podes hacerlo funcionar tal y como ya hice yo.

PD. Seguis sin pasarle el HANDLE devuelto por FindFirstFile a FindNextFile. Seguis usando 13 como magic number en la primera llamada a WriteConsole. Y FindNextFile no retorna INVALID_HANDLE_VALUE cuando falla sino 0, su tipo de retorno es booleano. No te acostumbres a usar EBX, no podes modificar su valor sin preservarlo como indica la convencion de llamada stdcall.


Título: Re: fasm consola
Publicado por: bengy en 15 Junio 2014, 00:55 am
disculpen la molestia pero necesito su ayuda nuevamente

como diferenciar si es un directorio o un archivo???

gracias por todo...


Título: Re: fasm consola
Publicado por: Eternal Idol en 15 Junio 2014, 01:04 am
En la estructura WIN32_FIND_DATA hay un campo llamado dwFileAttributes y el flag FILE_ATTRIBUTE_DIRECTORY es el que necesitas comprobar.