PDA

View Full Version : [C] Shell Remota con Password senza terminare il Processo


LupettoOne
28-07-2009, 18:09
Salve ragazzi ho bisogno del vostro aiuto! Cercavo un software per la gestione del terminale windows da remoto e specialmente che fosse molto leggero a differenza del Desktop Remoto... dopo giorni e giorni di ricerca finalmente l'ho trovato ed č pure OpenSource! L'ho scaricato dal sito Unsecure! L'unico problema qual'č... che l'idea di associare la shell ad una porta va benissimo solamente che vorrei impostargli una password di accesso in modo che sul mio server devo accedere solo io! Quando mi connetto alla porta mi deve chiedere, non dico Login e Password, ma pure solo l'inserimento della password basterebbe e poi farmi apparire il Terminale! E un'altra pecca di questo programma e che quando ti connetti la prima volta dopo che esci dal terminale muore il processo mentre io lo vorrei sempre attivo dopo il lancio! Spero che qualcuno mi aiuti perchč del C non sō nulla! Lo riesco solo a compilare dal Dev-C++ Il codice č questo:

#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#define MAXBUFFER 1024
#define SHELL_NAME "cmd\0"

HANDLE InputRead, InputWrite, OutputRead, OutputWrite; // handle del canale di comunicazione (pipe)
SOCKET sock,sendrecv; // variabili della socket
BOOL uscita;

DWORD WINAPI Output(LPVOID data); // Funzione (Thread) di output della shell
DWORD WINAPI Input(LPVOID data); // Funzione (Thread) di input della shell

int main(int argc, char **argv){


struct sockaddr_in sock_addr,sendrecv_addr;
WSADATA data;
WORD p;
int len(char *);
p=MAKEWORD(2,0);
WSAStartup(p,&data);

if (argc!=2){
printf("\nRemote Shell\n\nUso: %s <porta ascolto>\n",argv[0]);
exit(0);
}

sock=socket(PF_INET,SOCK_STREAM,0);
sock_addr.sin_family=PF_INET;
sock_addr.sin_port=htons(atoi(argv[1]));
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);


SECURITY_ATTRIBUTES sa; // struct contenente gli attributi di sicurezza della pipe
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD threadIdOut, threadIdIn; //identificatori dei threads

sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE; // permette l'ereditarietā degli handle attraverso la pipe
sa.lpSecurityDescriptor = NULL;

if(!CreatePipe(&OutputRead, &OutputWrite, &sa, 0)) // funzione di creazione di una pipe
printf("CreatePipe %d", GetLastError());

if(!CreatePipe(&InputRead, &InputWrite, &sa, 0)) // funzione di creazione di una pipe
printf("CreatePipe %d", GetLastError());

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; // la finestra di console viene nascosta
si.hStdInput = InputRead; // definizione dello standard input della shell
si.hStdOutput = OutputWrite; // definizione dello standard output della shell
si.hStdError = OutputWrite; // definizione dello standard error della shell

if (!CreateProcess(NULL, SHELL_NAME, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
printf("CreateProcess %d", GetLastError());

CloseHandle(OutputWrite); //chiusura degli handles utilizzati dal processo figlio
CloseHandle(InputRead); // per permetterne l'utilizzo esclusivo

if (!CreateThread(NULL, 0, Output, NULL, 0, &threadIdOut)) // funzione di creazione di un thread
printf("CreateThread %d", GetLastError());
if (!CreateThread(NULL, 0, Input, NULL, 0, &threadIdIn)) // funzione di creazione di un thread
printf("CreateThread %d", GetLastError());

uscita=FALSE;

while(uscita!=TRUE)
Sleep(100); // limitazione dell' utilizzo della CPU

closesocket (sock);
closesocket(sendrecv);
WSACleanup();
CloseHandle(OutputRead);
CloseHandle(InputWrite);
return 0;
}


DWORD WINAPI Output(LPVOID data){
char buffer[MAXBUFFER];
DWORD bytes;

do{
ReadFile(OutputRead, &buffer, MAXBUFFER, &bytes, NULL); // lettura da un handle del pipe
buffer[bytes]=0;
if (bytes>0) // condizione verificata solo quando la shell termina (dopo aver fornito il comando "exit" alla shell)
send(sendrecv, buffer, bytes, 0);
else
uscita=TRUE;
Sleep(100); // limitazione dell' utilizzo della CPU
}
while(TRUE);

return 0;
}

DWORD WINAPI Input(LPVOID data){
char buffer[MAXBUFFER];
DWORD bytes;

do{
bytes=recv(sendrecv, buffer, MAXBUFFER, 0);
buffer[bytes]=0;
WriteFile(InputWrite, &buffer, strlen(buffer), &bytes, NULL); // scrittura su un handle della pipe
Sleep(100); // limitazione dell' utilizzo della CPU
}
while(TRUE);

return 0;
}

Ragazzi vi ringrazio in anticipo! Ci tengo davvero a questo progetto!

LupettoOne
30-07-2009, 09:56
Pure qui nulla da fare mi sā l'unica soluzione č pagare un programmatore che non ha limiti! Grazie lo stesso a chi ha almeno letto il post!