elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++] Downloader
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [C++] Downloader  (Leído 8,468 veces)
kiriost

Desconectado Desconectado

Mensajes: 58


www.godsys.com.ar Hacking y Programación


Ver Perfil WWW
[C++] Downloader
« en: 7 Agosto 2011, 15:58 pm »

Hace unos días terminé un downloader que hice para un troyano que estabamos armando con un colega que quedó en la nada.

Rattack iba a contener un sistema de ocultación mediante hooks a las APIs de Windows, pero al final no quedó implementado porque esa parte d código lo hizo mi colega, yo me encargué de la parte del servidor y del cliente y de las funciones del downloader. La página del proyecto Rattack es http://godsys.com.ar/rattack/

Estaba programado usando el API WinSock, pero le cambié algunas cosas para poder compilarlo en Linux, ya que el sistema de sockets no es muy diferente entre ambos sistemas.

Al troyano le implementé 2 clases de downloader: uno que descarga archivos desde un servidor web (mediante HTTP) y otro que envía archivos desde un cliente a un servidor programados por mí.

Aquí les traigo el código del Downloader HTTP:

Código
  1. /*
  2. Autor: Kiriost
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <sys/socket.h>
  8. #include <sys/types.h>
  9. #include <netinet/in.h>
  10. #include <netdb.h>
  11.  
  12. int main(int argc, char *argv[]) {
  13. if(argc != 4) {
  14. printf("TO USE: ./downloader www.host.com /file.exe saveas.exen");
  15. return 0;
  16. }
  17.  
  18. char *shost;
  19. char *sfile;
  20. char *ssave;
  21.  
  22. shost = argv[1];
  23. sfile = argv[2];
  24. ssave = argv[3];
  25.  
  26. int sock;
  27. struct sockaddr_in conn;
  28. struct hostent *host;
  29. char data[512];
  30. sprintf(data, "GET %s HTTP/1.1\nHost: %s\nUser-Agent: Mozilla/4.0\n\n", sfile, shost);
  31.  
  32. char buffer[1024];
  33. memset(buffer, 0, 1024);
  34. int numbytes;
  35. int bytes = 0;
  36. int i = 0;
  37.  
  38. sock = socket(AF_INET, SOCK_STREAM, 0);
  39. host = gethostbyname(shost);
  40.  
  41. conn.sin_family = AF_INET;
  42. conn.sin_port = htons(80);
  43. conn.sin_addr = *((struct in_addr *)host->h_addr);
  44. memset(&conn.sin_zero, 0, 8);
  45.  
  46. connect(sock, (struct sockaddr *)&conn, sizeof(struct sockaddr));
  47.  
  48. FILE *fp = fopen(ssave, "wb");
  49.  
  50. send(sock, data, strlen(data), 0);
  51.  
  52. for(;;) {
  53. recv(sock, buffer + i, 1, 0);
  54. i++;
  55. if(strncmp(buffer+i-4, "\r\n\r\n", 4) == 0) {
  56. break;
  57. }
  58. }
  59.  
  60. for(;;) {
  61. memset(buffer, 0, 1024);
  62. numbytes = recv(sock, buffer, 1024, 0);
  63. bytes += numbytes;
  64. printf("%d KB\n", bytes/1024);
  65. fwrite(buffer, sizeof(char), numbytes, fp);
  66. if(numbytes <= 0) {
  67. break;
  68. }
  69. }
  70.  
  71. printf("Bytes: %d\n", bytes);
  72. fclose(fp);
  73. close(sock);
  74. }

Lo que hace especificamente es conectarse al servidor web, enviarle una serie de comandos HTTP (GET) para pedirle un archivo, el servidor recibe los comandos, los procesa y comienza a enviarle el contenido del archivo. La aplicación, entonces, comienza a recibir el contenido, entonces crea un archivo nuevo donde guarda el contenido que le va llegando.

Compilación

Código
  1. gcc -o downloader_http downloader_http.c

Ejemplo de uso

Código
  1. ./downloader_http godsys.comxa.com /SDL.dll SDLdown.dll


« Última modificación: 8 Agosto 2011, 19:10 pm por kiriost » En línea

http://www.godsys.com.ar > Programación. Hacking y Cracking. Sistemas. Desarrollo Web.
Java, C/C++, PHP, Python, Perl, HTML, Game-Hacking, Defacing, Desarrollo Web, GNU/Linux, y más
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: [C++] Downloader
« Respuesta #1 en: 7 Agosto 2011, 21:28 pm »

Ese código contiene algunos errores tipográficos, corrígelos.  :D

Saludos.


En línea

kiriost

Desconectado Desconectado

Mensajes: 58


www.godsys.com.ar Hacking y Programación


Ver Perfil WWW
Re: [C++] Downloader
« Respuesta #2 en: 8 Agosto 2011, 19:07 pm »

Tienes razon. Es que lo saque de mi blog y wordpress me convierte algunos carácteres como > < " :)
En línea

http://www.godsys.com.ar > Programación. Hacking y Cracking. Sistemas. Desarrollo Web.
Java, C/C++, PHP, Python, Perl, HTML, Game-Hacking, Defacing, Desarrollo Web, GNU/Linux, y más
oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
Re: [C++] Downloader
« Respuesta #3 en: 9 Agosto 2011, 01:31 am »

=D ... Interesante.. Pero.. Porque currar directamente con los headers HTTP.? Digo si piensas ampliar tu troyano con el pasar el tiempo va hacer mas tedioso a la hora de incluir funciones que tengan que ver con el HTTP

Se me ocurre que podrías implementar curl en tu prj... Es portable y de fácil manejo..
En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
El_Java

Desconectado Desconectado

Mensajes: 144



Ver Perfil WWW
Re: [C++] Downloader
« Respuesta #4 en: 9 Agosto 2011, 10:59 am »

A mi personalmente me parece mas interesante la otra parte del downloader, la de pasar archivos de un ordenador a otro, pero bueno...

Por cierto, dime que se te ha olvidado poner el return 0; en el main porque has hecho un copy-paste, porque como tampoco lo tengas en el original mereces que te hundamos el pecho xD
En línea

kiriost

Desconectado Desconectado

Mensajes: 58


www.godsys.com.ar Hacking y Programación


Ver Perfil WWW
Re: [C++] Downloader
« Respuesta #5 en: 9 Agosto 2011, 18:57 pm »

Húndeme lo que quieras jejeje...
Primero el código del downloader HTTP y el código para pasar de un ordenador a otro está en mi blog, en la sección proyectos Rattack.. Ahí puedes descargar al código fuente del "troyano" o downloader y puedes ver en command.c que se encuentran las funciones DownloaderHTTP y Download y Upload

Upload crea el servidor para enviar el archivo y lo deja a la escucha.
Downloader se conecta al servidor y espera que le envíe el archivo.

Segundo, el return lo he olvidado porque como dije antes DownloadHTTP es una función, y lo que hice aquí fue pasarla directamente al main agregándole algunas cosas, entre las que el return 0 no se encuentra :].

oPen syLar
: la idea era no recurrir directamente a ninguna librerías que me facilitara el trabajo como curl o la de wget, sino utilizar la librería de sockets nativa del sistema.
« Última modificación: 9 Agosto 2011, 18:59 pm por kiriost » En línea

http://www.godsys.com.ar > Programación. Hacking y Cracking. Sistemas. Desarrollo Web.
Java, C/C++, PHP, Python, Perl, HTML, Game-Hacking, Defacing, Desarrollo Web, GNU/Linux, y más
Synth3tik0

Desconectado Desconectado

Mensajes: 126


Ver Perfil
Re: [C++] Downloader
« Respuesta #6 en: 12 Agosto 2011, 04:08 am »

y el troyano tambien esta en c++?
En línea

..........
kiriost

Desconectado Desconectado

Mensajes: 58


www.godsys.com.ar Hacking y Programación


Ver Perfil WWW
Re: [C++] Downloader
« Respuesta #7 en: 12 Agosto 2011, 22:11 pm »

Todo está en C. C++ no porque no utilizamos clases ni las librerías de C++.

Además en C el ejecutable queda más liviano.

El servidor y el cliente están en C. Había pensado hacer el cliente en Java, pero al final quedo abandonado el proyecto  :rolleyes:
En línea

http://www.godsys.com.ar > Programación. Hacking y Cracking. Sistemas. Desarrollo Web.
Java, C/C++, PHP, Python, Perl, HTML, Game-Hacking, Defacing, Desarrollo Web, GNU/Linux, y más
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: [C++] Downloader
« Respuesta #8 en: 2 Noviembre 2011, 08:23 am »

hola

Muy buen codigo para hacer descargas sencillas, pero hay algo que no entendi, espero me puedan ayudar con una explicacion porfavor

esta parte no la entiendo, se que recv, sus parametros son socket, *buffer, size, flags, pero porque en buffer le ponen + i? y porque en la longitud le ponen 1?

Código
  1. recv(sock, buffer + i, 1, 0);
  2. i++;

Acaso es para iniciar varios punteros a buffer?, y en longitud porque 1? que no deberia ser un tamaño mas grande?

y se que strncmp hace una comparativa, y usando "n", es una comparativa mas exacta, pero porque asi?

Código
  1. if(strncmp(buffer+i-4, "\r\n\r\n", 4) == 0)

como lo mencione al principio porque buffer le ponen +i y porque restarle 4, lo demas si entiendo que hace una comparativa y si es "\r\n\r\n", termina el loop, pero lo demas?

espero me puedan ayudar con una explicacion de eso porfavor

salu2
En línea

.                                 
El_Java

Desconectado Desconectado

Mensajes: 144



Ver Perfil WWW
Re: [C++] Downloader
« Respuesta #9 en: 2 Noviembre 2011, 16:05 pm »

Lo de recv es porque recibe los datos de 1 en 1, de ahi que el tamaño sea 1, y no le pasa el buffer, le pasa un puntero a la posicion del buffer (buffer[0+i]).
Y strncmp, es así porque lo que el hace es comparar el buffer con "\r\n\r\n" recorriendo el buffer uno a uno, y le quita 4 para no producir un overflow al pasarse del tamaño del buffer, entiendes?

Un saludo! :D
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Downloader!!!!
Programación Visual Basic
digitalice 3 2,018 Último mensaje 14 Marzo 2006, 15:25 pm
por Kizar
[SRC] Nod 32 Downloader 1.6.1
Programación Visual Basic
Elemental Code 1 1,975 Último mensaje 12 Julio 2010, 08:08 am
por BlackZeroX
PDF exe downloader
Hacking
rusianhack 2 3,756 Último mensaje 19 Noviembre 2010, 04:39 am
por D_pit_88
[C#] DH Downloader 1.0
.NET (C#, VB.NET, ASP)
BigBear 2 2,476 Último mensaje 20 Septiembre 2014, 21:31 pm
por XresH
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines