|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2006
Messaggi: 35
|
[C] Shell Remota con Password senza terminare il Processo
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:
Codice:
#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; } |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Oct 2006
Messaggi: 35
|
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!
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:12.