Cum lucram cu socket-tii? , by Sacx Cum lucram cu socket-tii ? Cred ca de multe ori va-ti intrebat cum lucreaza BO2K sau exploiturile ! (Sper sa nu va dau ideii :) Pai chiar asa de complicat asa nu poate fi ! hai sa vedem cum naiba se lucreaza cu socket-tii ! 1. Ce este un socket ? Pai mai "babeste" spus este un canal de comunicatie ! Unu la mana exista mai multe tipuri de socketuri : 1. SOCK_STREAM : bidirectional , sigur 2. SOCK_DGRAM : bidirectional , nesigur (pachetele sar putea sa nu se mai intoarca 3. SOCK_RAW : folosit pentru "dedesupturi" :) 4. SOCK_PCK : cred ca este cel mai vechi (recomandabil a nu se folosi :) Doi la mana exista mai multe tipuri de domeni (ce fac domenile astea ? impun niste reguli de comunicatie socketurilor 1. AF_UNIX - domeniu de tip UNIX; 2. AF_INET - domeniu de tip Internet; 3. AF_RAW - domeniu de tip RAW 2. Cum creeam un socket ? connect = socket(domeniu,tip,protocol); Ex. Vrem sa cream un socket prin care sa ne putem lega la un port ! connect = socket(AF_INET,SOCK_STREAM,0); Easy Apropo connect este un integer care semnifica descriptorul . (da, da , exact ca la fisiere); 3. Cum asociem un nume socketului ? Pentru identificare
socketului de
catre procese acesta are nevoie
de un nume. Cand folosim domeniul internet (AF_INET) acest nume este compus din adresa masini server cat si cea a masini client cat si a porturilor lor . Ex. bind(connect,nume,lungime nume) 4. Cum ne conectam ? Depinde ce vrem sa facem .
Daca vrem client vom folosi
functia connect :
connect(descriptor, nume_socket, lungime_nume_socket); unde descripor este descriptorul socket-ului , nume_socket este socketul si lungime nume socket este sizeof(lungime_socket); :))))) Daca vrem server folosim
listen(
decriptor,numar_conexiuni) unde
descripor este descriptorul socket-ului iar numar connexiuni este numarul de conexiuni admise de server Ex. listen(connect,5); Dupa care folosim functia accept ca sa "acceptam" cererile catre server Ex. accept(connect,nume_socket, lungime_nume_socket); 5. Cum transmitem si receptionam date ? Sub
unix (mai precis sub
linux) avem
fucntile read si
write ! sunt
exact aceleasi functii pe care le folosim si la citirea si scrierea in fisiere! Sub windoze lucrurile se complica cam un pic dar nu mult ! Adica se folosesc alte 2 functii : send(connect,buffer,sizeof(buffer),flaguri); recv(connect,buffer,sizeof(buffer),flaguri); unde flaguri reprezinta : MSG_PEEK - la un nou apel al functiei read() sau recv(), va fi citit din nou acelasi mesaj; MSG_OOB - este folosit pentru transmisia mesajelor cu prioritate maximă; MSG_DONTROUTE - trimite datele fără pachetele de rutare; (celelalte optiuni ale functilor send si recv sunt mura'n gura , nu ?:) 6. Cum inchidem un socket ? O data cu
close(
connect); (exact ca la
fisiere) sau cu
shutdown(
connect,tip de
inchidere);
unde tip de inchidere poate fi 0: nu se main pot citi date prin socket 1: nu se mai pot trimite date 2: nu se mai pot receptiona date 7. Practica : 1. Vom pune in practica un client care drept sa spun l-am
facut pt.
linux dar cred ca nu veti avea probleme sa il compilati si in Visual C++ (special am folosit functile send si recv) 2.
Vedeti ca programul de fata nu a fost compilat
niciodata :)
Am facut si eu ceva reciclare de cod :), am scris ceva de mana si uite ce o iesit 1. Exemplu de client: #include :))))))))) #define PORT 23 #define MAXLINE 4096 client(int socket) if (
strncmp(recvline,"HALLO",5)==0)
}
int main(int argc, char **argv) Ok ! acuma sa dam drumu si la un server : (asta o fost compilat si o functionat perfect (sub linux :)) (Visual c++ cred eu ca nu stie de fork ! cred ca asta ar fi singurul inconvenient sub windows) 2. Exemplu de server : #include #include #include #include #include #include #include #include #ifdef LINUX #include #endif #define SERV_PORT 115 //#define DEBUG void sig_chld(int signo) int main(void) if ( (
childpid =
fork()) == 0)
close(
listenfd); /*
inchide socketul care asculta */
exit(0);
}
close(
connfd); /*
inchidem socketul parinte */
}
8. Ma puteti contacta pe [email protected]
Citeste cele mai noi eseuri in limba romana pe tema hacking/cracking/phreaking la:
https://hacking.art.md/
Gaseste mii de surse in orice limbaj de programare la:
https://sfynx.go.ro/
Adera la lista de dicutii MoldHack
([email protected]) trimitand un email gol la:
[email protected]