send
Grupo de Telegram
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Funciones En Asm

  • 4 Respuestas
  • 4867 Vistas

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

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« en: Marzo 01, 2011, 12:18:06 pm »
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
  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 uso:

Código: ASM
  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



Funcion que mide la longitud de una cadena:

Código: ASM
  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: ASM
  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
   
« Última modificación: Junio 01, 2013, 12:00:27 pm por Expermicid »

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #1 en: Julio 03, 2011, 05:39:52 pm »
DGlobalAlloc: funcion equivalente a GlobalAlloc

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

Ejemplo de su uso:

Código: ASM
  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
« Última modificación: Julio 08, 2011, 06:14:29 am por Drinky94 »

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #2 en: Julio 08, 2011, 06:27:16 am »
Saber si nos están debuggeando:

Código: ASM
  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            


Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #3 en: Julio 08, 2011, 07:13:53 am »
Una simple funcion de encriptación Xor:

Código: ASM
  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: ASM
  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    

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #4 en: Julio 09, 2011, 08:32:52 am »
Función que pasa un número entero a cadena:

Código: ASM
  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: ASM
  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      

« Última modificación: Julio 10, 2011, 11:15:06 am por Drinky94 »

 

¿Te gustó el post? COMPARTILO!



[ASM] Funciones para manipular cadenas - by regx

Iniciado por ProcessKill

Respuestas: 0
Vistas: 2291
Último mensaje Febrero 24, 2010, 04:00:18 pm
por ProcessKill