Funciones En Asm

Iniciado por Juan, Marzo 01, 2011, 12:18:06 PM

Tema anterior - Siguiente tema

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

Marzo 01, 2011, 12:18:06 PM Ultima modificación: Junio 01, 2013, 12:00:27 PM por Expermicid
En este post pondré las funciones que valla creando en FAsm, poco iré rellenando el post :P




La funcion a continuación escrita compara dos cadenas.

Código: asm
proc Comparar,cadena1,cadena2
        ;Si son iguales  EAX = 1
        ;Si son diferentes EAX = 0
        mov esi,[cadena1]
        mov ecx,[cadena2]
        dec ecx
        bucle:
            inc ecx
            lodsb
            cmp byte[ecx],al
            jne diferentes
            cmp al,0
            je comprovar
            jmp bucle
        comprovar:
            cmp byte[ecx],0
            je iguales
            jne diferentes
        diferentes:
            mov eax,0
            ret
        iguales:
            mov eax,1
            ret
     endp


Ejemplo de uso:

Código: asm
include 'win32ax.inc'

.data
    palabra db 'Drinky94',0
    palabra2 db 'Drinky94',0

.code
start:
    stdcall Comparar,palabra,palabra2
    .if eax = 0
        invoke MessageBoxA,0,'Son Diferentes',0,0
    .else
        invoke MessageBoxA,0,'Son Iguales',0,0
    .endif
    ret

    proc Comparar,cadena1,cadena2
        ;Si son iguales  EAX = 1
        ;Si son diferentes EAX = 0
        mov esi,[cadena1]
        mov ecx,[cadena2]
        dec ecx
        bucle:
            inc ecx
            lodsb
            cmp byte[ecx],al
            jne diferentes
            cmp al,0
            je comprovar
            jmp bucle
        comprovar:
            cmp byte[ecx],0
            je iguales
            jne diferentes
        diferentes:
            mov eax,0
            ret
        iguales:
            mov eax,1
            ret
     endp
.end start





Funcion que mide la longitud de una cadena:

Código: asm
proc Len,Cadena
        ;ECX = Longitud de la cadena.
        mov eax,[Cadena]
        mov ecx,-1
        bucle:
            inc ecx
            cmp byte[eax+ecx],0
            jne bucle
        ret
endp


Ejemplo de su uso:

Código: asm
include 'win32ax.inc'

.data
    palabra db 'Drinky94',0
    longitud dd ?
.code
start:
    stdcall Len,palabra
    mov [longitud],ecx
    invoke GlobalAlloc,GPTR,1024
    push eax
    invoke wsprintfA,eax,"%d",[longitud]
    pop eax
    invoke MessageBox,0,eax,0,MB_OK
    leave
    ret

    proc Len,Cadena
        ;ECX = Longitud de la cadena
        mov eax,[Cadena]
        mov ecx,-1
        bucle:
            inc ecx
            cmp byte[eax+ecx],0
            jne bucle
        ret
    endp
.end start
   

Julio 03, 2011, 05:39:52 PM #1 Ultima modificación: Julio 08, 2011, 06:14:29 AM por Drinky94
DGlobalAlloc: funcion equivalente a GlobalAlloc

Código: asm
proc DGlobalAlloc,cantidad
        sub esp,[cantidad]
        mov eax,esp
        ret
endp


Ejemplo de su uso:

Código: asm
include 'win32ax.inc'

.data
    palabra db 'Drinky94',0
    longitud dd ?
.code
start:

    stdcall Len,palabra
    mov [longitud],ecx
    stdcall DGlobalAlloc,1024
    push eax
    invoke wsprintfA,eax,"%d",[longitud]
    pop eax
    invoke MessageBox,0,eax,0,MB_OK
    leave
    ret

    proc Len,Cadena
        mov eax,[Cadena]
        mov ecx,-1
        bucle:
            inc ecx
            cmp byte[eax+ecx],0
            jne bucle
        ret
    endp

    proc DGlobalAlloc,cantidad
        sub esp,[cantidad]
        mov eax,esp
        ret
    endp
.end start

Saber si nos están debuggeando:

Código: asm
format PE GUI 4.0
entry start

include 'win32ax.inc'

    SiDbg db 'Hay Debugger',0
    NoDbg db 'No hay Debugger',0

start:
        mov eax,dword[fs:18h]
        mov eax,dword[eax+30h]
        mov bl,byte[eax+2]  ; si bl = 1 Nos estan debujeando.

        .if bl = 1
            invoke MessageBoxA,0,SiDbg,0,0
        .else
            invoke MessageBoxA,0,NoDbg,0,0
        .endif
        ret

data import
        library user32,'user32.dll'

        import user32,MessageBoxA,'MessageBoxA'

end data           



Una simple funcion de encriptación Xor:

Código: asm
proc Cifrar,Cadena
            xor ecx,ecx
            mov eax,[Cadena]
            .bucle:
                .if byte[eax+ecx] = 0
                    jmp .salir
                .endif
                xor byte[eax+ecx],7
                inc ecx
                jmp .bucle
            .salir:
            ret
         endp


Ejemplo de su uso:

Código: asm
include 'win32ax.inc'

.data
        hola db 'hola',0

.code
start:
         stdcall Cifrar,hola
         invoke MessageBoxA,0,eax,0,0
         ret

         proc Cifrar,Cadena
            xor ecx,ecx
            mov eax,[Cadena]
            .bucle:
                .if byte[eax+ecx] = 0
                    jmp .salir
                .endif
                xor byte[eax+ecx],7
                inc ecx
                jmp .bucle
            .salir:
            ret
         endp
.end start   

Julio 09, 2011, 08:32:52 AM #4 Ultima modificación: Julio 10, 2011, 11:15:06 AM por Drinky94
Función que pasa un número entero a cadena:

Código: asm
 proc NumToString,Numero
                ;Función creada por Drinky94. Agradecimientos a Jep.
                locals
                        divisor dw ?
                        ; buffer rb 20  Agregar esta variable en la sección data
                        ; El numero 20 es la longitud que tendra la cadena
                        ;si nuestro numero tiene 4 cifras tendremos que poner 4
                        ; CadenaFinal rb 20  ; lo mismo que con la variable buffer.
                endl

                mov [divisor],10
                xor eax,eax
                xor ebx,ebx
                mov eax,[Numero]
                bucle:
                        xor edx,edx
                        div [divisor]
                        add dl,0x30
                        mov byte[buffer+ebx],dl
                        inc ebx
                        cmp eax,0
                            jne bucle
                inc ebx
                mov byte[buffer+ebx],0x0
                mov eax,buffer
                mov ecx,-1
                buclelen:
                        inc ecx
                        cmp byte[eax+ecx],0
                            jne buclelen
                xor ebx,ebx
                dec ecx
                reverse:
                        xor edx,edx
                        mov dl,byte[eax+ecx]
                        mov byte[CadenaFinal+ebx],dl
                        inc ebx
                        sub ecx,1
                        cmp ecx,-1
                            jne reverse
                mov eax,CadenaFinal
                ret
        endp 


Ejemplo de su uso:

Código: asm
include 'win32ax.inc'

.data
        buffer rb 4
        CadenaFinal rb 4
.code
start:
        stdcall NumToString,1994
        invoke MessageBoxA,0,eax,0,0
        ret

        proc NumToString,Numero
                ;Función creada por Drinky94. Agradecimientos a Jep.
                locals
                        divisor dw ?
                        ; buffer rb 20  Agregar esta variable en la sección data
                        ; El numero 20 es la longitud que tendra la cadena
                        ;si nuestro numero tiene 4 cifras tendremos que poner 4
                        ; CadenaFinal rb 20  ; lo mismo que con la variable buffer.
                endl

                mov [divisor],10
                xor eax,eax
                xor ebx,ebx
                mov eax,[Numero]
                bucle:
                        xor edx,edx
                        div [divisor]
                        add dl,0x30
                        mov byte[buffer+ebx],dl
                        inc ebx
                        cmp eax,0
                            jne bucle
                inc ebx
                mov byte[buffer+ebx],0x0
                mov eax,buffer
                mov ecx,-1
                buclelen:
                        inc ecx
                        cmp byte[eax+ecx],0
                            jne buclelen
                xor ebx,ebx
                dec ecx
                reverse:
                        xor edx,edx
                        mov dl,byte[eax+ecx]
                        mov byte[CadenaFinal+ebx],dl
                        inc ebx
                        sub ecx,1
                        cmp ecx,-1
                            jne reverse
                mov eax,CadenaFinal
                ret
        endp
.end start