El post que buscas se encuentra eliminado, pero este también te puede interesar

[C/C++] Downloader en C/C++

Anuncios

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.

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:
/*
Autor: Kiriost
*/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc, char *argv[]) {
if(argc != 4) {
printf("TO USE: ./downloader www.host.com /file.exe saveas.exen";
return 0;
}

char *shost;
char *sfile;
char *ssave;

shost = argv[1];
sfile = argv[2];
ssave = argv[3];

int sock;
struct sockaddr_in conn;
struct hostent *host;
char data[512];
sprintf(data, "GET %s HTTP/1.1nHost: %snUser-Agent: Mozilla/4.0nn", sfile, shost);

char buffer[1024];
memset(buffer, 0, 1024);
int numbytes;
int bytes = 0;
int i = 0;

sock = socket(AF_INET, SOCK_STREAM, 0);
host = gethostbyname(shost);

conn.sin_family = AF_INET;
conn.sin_port = htons(80);
conn.sin_addr = *((struct in_addr *)host-&gt;h_addr);
memset(&amp;conn.sin_zero, 0, 8);

connect(sock, (struct sockaddr *)&amp;conn, sizeof(struct sockaddr));

FILE *fp = fopen(ssave, &quot;wb&quot;

send(sock, data, strlen(data), 0);

for( ; ; ) {
recv(sock, buffer + i, 1, 0);
i++;
if(strncmp(buffer+i-4, &quot;rnrn&quot;, 4) == 0) {
break;
}
}

for( ; ; ) {
memset(buffer, 0, 1024);
numbytes = recv(sock, buffer, 1024, 0);
bytes += numbytes;
printf("%d KBn", bytes/1024);
fwrite(buffer, sizeof(char), numbytes, fp);
if(numbytes <= 0) {
break;
}
}

printf("Bytes: %dn", bytes);
fclose(fp);
close(sock);
}


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

gcc -o downloader_http downloader_http.c


Ejemplo de uso

./downloader_http godsys.comxa.com /SDL.dll SDLdown.dll


O sea, el primer argumento es la dirección del host desde donde va a descargar el archivo, el segundo parámetro es el archivo en sí con la ruta entera (si estuviera en una carpeta sería: /carpeta/SDL.dll), y el tercer y último argumento indica con qué nombre se va a guardar el archivo.

Básicamente, es cuestión de conocer el protocolo HTTP mediante el cual un navegador se comunica con un servidor web. Ya he escrito un artículo sobre este tema, así que no pienso volver a explicarlo.

Anuncios

0 comentarios - [C/C++] Downloader en C/C++