PDA

View Full Version : [C] Shell Associata ad una Porta con Integrazione Filtro IP


LupettoOne
19-09-2009, 01:48
Salve raga! Vi spiego il mio problema... dovrei portare a termine un progetto che non è altro che una Shell associata ad una porta scaricabile gratuitamente in rete. L'unica pecca che chiunque sapendo la porta può connettersi senza autentificarsi e la cosa non mi piace tanto anche perchè sarà il terminale del server del mio negozio un vecchio P4 1500 mhz che avevo deciso di accantonarlo mentre mi è venuta l'idea di fruttarlo come server e monta un windows xp. La cosa che ho bisogno è la gestione da remoto del terminale (il prompt). All'inizio avevo pensato di integrare l'inserimento della password nel codice ma la cosa la vedevo dura poi avevo pensato ad un'altra cosa di più semplice cioè quello di inserire un Filtro IP! Per rendervi meglio l'idea la stessa cosa di quando settiamo i router il Filtro IP MAC che solo quei determinati IP possono accedere alla rete. Ho fatto delle ricerche per capire il concetto dei Socket e Interazione UDP e ho capito che questa parte del codice è quella da modificare:
sock_addr.sin_addr.s_addr=INADDR_ANY;
Magari mi posso anche sbagliare perchè vi ripeto... di C ne capisco davvero poco la studiai anni fa ma poi l'abbandonai perchè nella vita oggi faccio tutt'altro ecco perchè ho bisogno del vostro aiuto!
Siccome io e i miei altri 2 soci abbiamo gli IP Dinamici avevo pensato anche di crearci un'account su DynDNS e farci un vhost in modo che la shell riconosce (con l'intervento del DNS magari anche da inserire nel codice) le nostre connessioni. Ovviamente bisogna settare nel codice 3 vhost che solo quei 3 possono accedere al sistema del prompt! Dite che la cosa si può fare o è complicata?
Ragazzi ho bisogno assolutamente del vostro aiuto!
Grazie in anticipo!

Vi posto il codice sorgente della Shell:

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <windows.h>
#include <winsock2.h> //includo la libreria per le funzioni della versione 2 del winsock

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

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