elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Funciones en FASM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funciones en FASM  (Leído 4,948 veces)
fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Funciones en FASM
« en: 10 Julio 2011, 13:25 pm »

Os dejo algunas funciones en FASM que e ido haciendo desde que empece con asm.

Función que compara dos cadenas:

Código
  1.    proc Comparar,cadena1,cadena2
  2.            ;Si son iguales  EAX = 1
  3.            ;Si son diferentes EAX = 0
  4.            mov esi,[cadena1]
  5.            mov ecx,[cadena2]
  6.            dec ecx
  7.            bucle:
  8.                inc ecx
  9.                lodsb
  10.                cmp byte[ecx],al
  11.                jne diferentes
  12.                cmp al,0
  13.                je comprovar
  14.                jmp bucle
  15.            comprovar:
  16.                cmp byte[ecx],0
  17.                je iguales
  18.                jne diferentes
  19.            diferentes:
  20.                mov eax,0
  21.                ret
  22.            iguales:
  23.                mov eax,1
  24.                ret
  25.         endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.        palabra db 'Drinky94',0
  5.        palabra2 db 'Drinky94',0
  6.  
  7.    .code
  8.    start:
  9.        stdcall Comparar,palabra,palabra2
  10.        .if eax = 0
  11.            invoke MessageBoxA,0,'Son Diferentes',0,0
  12.        .else
  13.            invoke MessageBoxA,0,'Son Iguales',0,0
  14.        .endif
  15.        ret
  16.  
  17.        proc Comparar,cadena1,cadena2
  18.            ;Si son iguales  EAX = 1
  19.            ;Si son diferentes EAX = 0
  20.            mov esi,[cadena1]
  21.            mov ecx,[cadena2]
  22.            dec ecx
  23.            bucle:
  24.                inc ecx
  25.                lodsb
  26.                cmp byte[ecx],al
  27.                jne diferentes
  28.                cmp al,0
  29.                je comprovar
  30.                jmp bucle
  31.            comprovar:
  32.                cmp byte[ecx],0
  33.                je iguales
  34.                jne diferentes
  35.            diferentes:
  36.                mov eax,0
  37.                ret
  38.            iguales:
  39.                mov eax,1
  40.                ret
  41.         endp
  42.    .end start



Función que mide la longitud de una cadena:

Código
  1.    proc Len,Cadena
  2.            ;ECX = Longitud de la cadena.
  3.            mov eax,[Cadena]
  4.            mov ecx,-1
  5.            bucle:
  6.                inc ecx
  7.                cmp byte[eax+ecx],0
  8.                jne bucle
  9.            ret
  10.    endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.        palabra db 'Drinky94',0
  5.        longitud dd ?
  6.    .code
  7.    start:
  8.        stdcall Len,palabra
  9.        mov [longitud],ecx
  10.        invoke GlobalAlloc,GPTR,1024
  11.        push eax
  12.        invoke wsprintfA,eax,"%d",[longitud]
  13.        pop eax
  14.        invoke MessageBox,0,eax,0,MB_OK
  15.        leave
  16.        ret
  17.  
  18.        proc Len,Cadena
  19.            ;ECX = Longitud de la cadena
  20.            mov eax,[Cadena]
  21.            mov ecx,-1
  22.            bucle:
  23.                inc ecx
  24.                cmp byte[eax+ecx],0
  25.                jne bucle
  26.            ret
  27.        endp
  28.    .end start



Función que puede servir de remplazo a GlobalAlloc:

Código
  1.    proc DGlobalAlloc,cantidad
  2.            sub esp,[cantidad]
  3.            mov eax,esp
  4.            ret
  5.    endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.        palabra db 'Drinky94',0
  5.        longitud dd ?
  6.    .code
  7.    start:
  8.  
  9.        stdcall Len,palabra
  10.        mov [longitud],ecx
  11.        stdcall DGlobalAlloc,1024
  12.        push eax
  13.        invoke wsprintfA,eax,"%d",[longitud]
  14.        pop eax
  15.        invoke MessageBox,0,eax,0,MB_OK
  16.        leave
  17.        ret
  18.  
  19.        proc Len,Cadena
  20.            mov eax,[Cadena]
  21.            mov ecx,-1
  22.            bucle:
  23.                inc ecx
  24.                cmp byte[eax+ecx],0
  25.                jne bucle
  26.            ret
  27.        endp
  28.  
  29.        proc DGlobalAlloc,cantidad
  30.            sub esp,[cantidad]
  31.            mov eax,esp
  32.            ret
  33.        endp
  34.    .end start



Código para saber si nos están debuggeando (usa el PEB):

Código
  1.    format PE GUI 4.0
  2.    entry start
  3.  
  4.    include 'win32ax.inc'
  5.  
  6.        SiDbg db 'Hay Debugger',0
  7.        NoDbg db 'No hay Debugger',0
  8.  
  9.    start:
  10.            mov eax,dword[fs:18h]
  11.            mov eax,dword[eax+30h]
  12.            mov bl,byte[eax+2]  ; si bl = 1 Nos estan debujeando.
  13.  
  14.            .if bl = 1
  15.                invoke MessageBoxA,0,SiDbg,0,0
  16.            .else
  17.                invoke MessageBoxA,0,NoDbg,0,0
  18.            .endif
  19.            ret
  20.  
  21.    data import
  22.            library user32,'user32.dll'
  23.  
  24.            import user32,MessageBoxA,'MessageBoxA'
  25.  
  26.    end data            



Simple cifrado Xor:

Código
  1.    proc Cifrar,Cadena
  2.                xor ecx,ecx
  3.                mov eax,[Cadena]
  4.                .bucle:
  5.                    .if byte[eax+ecx] = 0
  6.                        jmp .salir
  7.                    .endif
  8.                    xor byte[eax+ecx],7
  9.                    inc ecx
  10.                    jmp .bucle
  11.                .salir:
  12.                ret
  13.             endp

Ejemplo de su uso:

Código
  1.    include 'win32ax.inc'
  2.  
  3.    .data
  4.            hola db 'hola',0
  5.  
  6.    .code
  7.    start:
  8.             stdcall Cifrar,hola
  9.             invoke MessageBoxA,0,eax,0,0
  10.             ret
  11.  
  12.             proc Cifrar,Cadena
  13.                xor ecx,ecx
  14.                mov eax,[Cadena]
  15.                .bucle:
  16.                    .if byte[eax+ecx] = 0
  17.                        jmp .salir
  18.                    .endif
  19.                    xor byte[eax+ecx],7
  20.                    inc ecx
  21.                    jmp .bucle
  22.                .salir:
  23.                ret
  24.             endp
  25.    .end start    



Función que pasa un número entero a cadena:

Código
  1. proc NumToString,Numero
  2.                ;Función creada por Drinky94. Agradecimientos a Jep.
  3.                locals
  4.                        divisor dw ?
  5.                        ; buffer rb 20  Agregar esta variable en la sección data
  6.                        ; El numero 20 es la longitud que tendra la cadena
  7.                        ;si nuestro numero tiene 4 cifras tendremos que poner 4
  8.                        ; CadenaFinal rb 20  ; lo mismo que con la variable buffer.
  9.                endl
  10.  
  11.                mov [divisor],10
  12.                xor eax,eax
  13.                xor ebx,ebx
  14.                mov eax,[Numero]
  15.                bucle:
  16.                        xor edx,edx
  17.                        div [divisor]
  18.                        add dl,0x30
  19.                        mov byte[buffer+ebx],dl
  20.                        inc ebx
  21.                        cmp eax,0
  22.                            jne bucle
  23.                inc ebx
  24.                mov byte[buffer+ebx],0x0
  25.                mov eax,buffer
  26.                mov ecx,-1
  27.                buclelen:
  28.                        inc ecx
  29.                        cmp byte[eax+ecx],0
  30.                            jne buclelen
  31.                xor ebx,ebx
  32.                dec ecx
  33.                reverse:
  34.                        xor edx,edx
  35.                        mov dl,byte[eax+ecx]
  36.                        mov byte[CadenaFinal+ebx],dl
  37.                        inc ebx
  38.                        sub ecx,1
  39.                        cmp ecx,-1
  40.                            jne reverse
  41.                mov eax,CadenaFinal
  42.                ret
  43.        endp  

Ejemplo de su uso:

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        buffer rb 4
  5.        CadenaFinal rb 4
  6. .code
  7. start:
  8.        stdcall NumToString,1994
  9.        invoke MessageBoxA,0,eax,0,0
  10.        ret
  11.  
  12.        proc NumToString,Numero
  13.                ;Función creada por Drinky94. Agradecimientos a Jep.
  14.                locals
  15.                        divisor dw ?
  16.                        ; buffer rb 20  Agregar esta variable en la sección data
  17.                        ; El numero 20 es la longitud que tendra la cadena
  18.                        ;si nuestro numero tiene 4 cifras tendremos que poner 4
  19.                        ; CadenaFinal rb 20  ; lo mismo que con la variable buffer.
  20.                endl
  21.  
  22.                mov [divisor],10
  23.                xor eax,eax
  24.                xor ebx,ebx
  25.                mov eax,[Numero]
  26.                bucle:
  27.                        xor edx,edx
  28.                        div [divisor]
  29.                        add dl,0x30
  30.                        mov byte[buffer+ebx],dl
  31.                        inc ebx
  32.                        cmp eax,0
  33.                            jne bucle
  34.                inc ebx
  35.                mov byte[buffer+ebx],0x0
  36.                mov eax,buffer
  37.                mov ecx,-1
  38.                buclelen:
  39.                        inc ecx
  40.                        cmp byte[eax+ecx],0
  41.                            jne buclelen
  42.                xor ebx,ebx
  43.                dec ecx
  44.                reverse:
  45.                        xor edx,edx
  46.                        mov dl,byte[eax+ecx]
  47.                        mov byte[CadenaFinal+ebx],dl
  48.                        inc ebx
  49.                        sub ecx,1
  50.                        cmp ecx,-1
  51.                            jne reverse
  52.                mov eax,CadenaFinal
  53.                ret
  54.        endp
  55. .end start      


Cuando valla haciendo mas las voi posteando :P

saludos.


« Última modificación: 10 Julio 2011, 14:45 pm por Drinky94 » En línea

Un byte a la izquierda.
hosuko

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Funciones en FASM
« Respuesta #1 en: 10 Julio 2011, 18:10 pm »

Muy buen post. Yo también tengo una función para pasar de Hex a ASCII:

Código:
proc Conversor_ASCII2 uses ebx esi edi, datos
   mov   ecx, 3                   ;Pongo el contador a 3

   mov   eax, [datos]          ;Pongo en EAX el número a convertir
   mov   ebx, 0ah               ;Se tendrá que dividir entre 10 = 0Ah
.repetir:
   div   bl                           ;AL = Resultado, AH =resto = número que importa.
   mov   [Buffer+ecx], ah   ;Guardo aquí el resultado (AH).
   add   [Buffer+ecx],30h   ;Le sumamos 30 para que quede el código en ascii
   and   eax, 0ffh               ;Hacemos un filtro para dejar sólo AL (el resto)

   dec   ecx                       ;Restamos 1 al contador
   cmp   ecx, 0                  ;Lo comparamos con 0
   jl    .fuera                     ;Si es inferior se sale

jmp .repetir                     ;Repetimos la operación, solo que ECX ahora vale menos.

.fuera:
   mov   eax, dword [Buffer]   ;Ponemos en EAX el resultado.
   ret                                    ;Devolvemos el flujo del programa donde fue llamado
endp

La variable buffer la tengo definida asi:
Buffer   db 1

y para usar la función:
stdcall Conversor_ASCII2 , eax

donde EAX es el valor Hex a pasar. La función retorna en EAX el número en ASCII.

Ya os habreis dado cuenta que esta función está pensada para números de 4 dígitos solamente, el motivo es que la uso para visualizar las coordenadas del ratón asi como otros datos que no requieren números grandes.

   Se podría modificar para usar números más grandes, solamente que el valor no se devolvería en EAX sino en [Buffer].



« Última modificación: 10 Julio 2011, 18:20 pm por hosuko » En línea

fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Funciones en FASM
« Respuesta #2 en: 28 Septiembre 2011, 21:48 pm »

Ret Exe corruption

Código
  1. ;///////////////////////////////////////////////////////////////////////////////
  2. ;////  Ret Exe Corruption: corrompe los exe poniendo un 0xC3 (ret) en el    ////
  3. ;////  entry point. Este código no funciona con algunos ejecutables para    ////
  4. ;////  ello habría que hacer algunos modificaciones.                        ////
  5. ;////  Programado por Drinky94 a 13 - Septiembre - 2011                     ////
  6. ;///////////////////////////////////////////////////////////////////////////////
  7.  
  8. include 'win32ax.inc'
  9.  
  10. .data
  11.        manija dd ?
  12.        larchivo dd ?
  13.        espacio dd ?
  14.        bleidos dd ?
  15.  
  16.        PE dd ? ; puntero a NT
  17.  
  18.        EP dd ? ; EntryPoint
  19.        wb dd ?
  20. .code
  21. start:
  22.        invoke CreateFileA,'g:\bowser.exe', GENERIC_READ, FILE_SHARE_READ, 0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
  23.        mov [manija],eax
  24.  
  25.        invoke GetFileSize,[manija],0
  26.        mov [larchivo],eax
  27.  
  28.        invoke GlobalAlloc,GPTR,[larchivo]
  29.        mov [espacio],eax
  30.  
  31.        invoke ReadFile,[manija],[espacio],[larchivo],addr bleidos,0
  32.        invoke CloseHandle,[manija]
  33.        leave
  34.  
  35.        mov eax,[espacio]
  36.  
  37.  
  38.        cmp word[eax],'MZ'
  39.        jne salir
  40.  
  41.        mov ecx,eax
  42.  
  43.        add eax,dword[eax+0x3C] ; EAX = PE
  44.        mov [PE],eax
  45.  
  46.        cmp word[eax],'PE'
  47.        jne salir
  48.  
  49.        add eax,0x28
  50.  
  51.        mov ebx,dword[eax]
  52.        mov [EP],ebx ;EP = EntryPoint
  53.  
  54.        mov ebx,ecx ; EAX = puntero inicio
  55.  
  56.        add ecx,[EP]
  57.        mov word[ecx],0xC3
  58.  
  59.        ;// Aquí tendríamos que eliminar el viejo archivo y generar nuestro Exe modificado con el mismo nombre.
  60.  
  61.        invoke CreateFile,"g:\NuevoRET.exe",GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0
  62.        push eax
  63.        invoke WriteFile,eax,ebx,[larchivo],wb,NULL
  64.        pop eax
  65.        invoke CloseHandle,eax
  66.  
  67.        invoke MessageBoxA,0,"FIN",0,0
  68.  
  69.        salir:
  70.        leave
  71.        ret
  72. .end start
En línea

Un byte a la izquierda.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda Fasm
ASM
SLUGER 7 5,700 Último mensaje 31 Mayo 2009, 07:06 am
por YST
Sintaxis FASM « 1 2 »
ASM
ferk93 16 11,376 Último mensaje 9 Julio 2009, 09:57 am
por Erik#
FASM o MASM? « 1 2 »
ASM
Riki_89D 12 11,248 Último mensaje 16 Abril 2010, 18:50 pm
por Иōҳ
[C] Problema con Struct en funciones que llaman a otras funciones
Programación C/C++
‭lipman 9 24,064 Último mensaje 19 Mayo 2011, 23:39 pm
por Littlehorse
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines