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.
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:
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:
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:
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
DGlobalAlloc: funcion equivalente a GlobalAlloc
proc DGlobalAlloc,cantidad
sub esp,[cantidad]
mov eax,esp
ret
endp
Ejemplo de su uso:
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:
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:
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:
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
Función que pasa un número entero a cadena:
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:
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