V-am spus de mai multe ori despre serverele proxy: ce au nevoie, cum funcționează și ce sunt utile pentru hackeri. Cu toate acestea, cunoașterea și utilizarea este un lucru, dar să-l creați singur este o altă chestiune. Această lucrare creativă este utilă pentru suflet, corp și, bineînțeles, punga WM.
Un pic de teorie
Deci, un server proxy este în primul rând un program care acționează ca un intermediar între client și server. Toți sunt obișnuiți să asocieze conceptul de proxy numai cu protocolul HTTP. De fapt, există proxy-uri pentru alte protocoale, despre care voi vorbi mai târziu. Cel mai obișnuit tip de proxy este HTTP. Când lucrați printr-un proxy HTTP, browserul dvs. nu se va conecta la serverul pe care este localizat site-ul solicitat, se va conecta la proxy și îi va da o solicitare. După ce ați primit de la dvs. toate datele necesare, proxy-ul se va conecta la serverul web de la distanță și vă va trimite solicitarea. După procesarea acestuia, serverul web va returna documentul la proxy, care îl trimite apoi. Aceste proxy-uri sunt utile atunci când aveți nevoie de anonimat (pentru că sunt transparente) sau dacă furnizorul dvs. vă restricționează și nu vă permite să vizitați site-uri situate pe servere străine.
Un alt loc în care serverele proxy sunt utilizate în mod constant sunt rețelele locale (locale). Pentru a le oferi angajaților acces la Internet, administratorii instalează un proxy la poarta de acces, iar întregul birou trece prin el către rețea. Avantajele acestei metode sunt evidente: vă puteți urmări cu ușurință de utilizatori, ia în considerare cantitatea de trafic consumate, și asigurați-vă că utilizatorul nu va folosi mai mult software-ul, deoarece nu orice programm este capabil să lucreze prin HTTP-proxy.
Am spus deja că proxy-ul HTTP nu este singurul tip de server proxy. În natură există și:
De ce scrie propriul server proxy?
După ce ați lucrat în practică cu principiile de bază pentru scrierea de servere proxy, veți putea să recuperați colecția de [[-] producție proprie. De exemplu, puteți face cu ușurință un proxy complet invizibil în sistem. După ce a alunecat o astfel de piesă unui vecin, în cazul în care nu se gândește la securitate și nu folosește un firewall, hackerul poate conduce cu ușurință traficul prin calculatorul său fără probleme, bucurându-se de freebies.
Un alt mod interesant de a vă folosi capodopera poate fi parolele de hacking pe care un vecin le introduce în browserul său. În acest caz, hackerul va trebui, de asemenea, să trimită vecinului tău nefericit instrumentul tău și să-l convingă să o conducă. După pornire] [- proxy-ul configurează automat munca vecinului vecinului înainte prin el însuși. Astfel, poporul va arăta în mod liniștit Internetul și toate solicitările sale (trimiterea parolelor etc.) vor fi înregistrate. Se răcește? Fără îndoială! Dar știm ceva cu dvs. că toate aceste idei nebunești sunt ilegale, de aceea vom scrie un server proxy numai în scopuri educaționale, chiar fără să ne gândim la obținerea unui beneficiu.
Tehnologii utilizate
La scrierea aplicațiilor de rețea bazate pe server, nu se recomandă utilizarea modelului de componente Delphi. Componentele nu au flexibilitatea care poate fi obținută prin aplicarea API-ului. Așa că astăzi trebuie să ne confruntăm din nou cu teribilul API WinSock.
Acum, să discutăm algoritmul viitorului server proxy. Deoarece vom crea o aplicație de server, trebuie doar să fie multi-utilizator. Vă imaginați doar un server de proxy corporativ pe care o singură persoană îl poate folosi și restul între timp va fuma nervos. Deci, deoarece aplicația noastră va fi multi-utilizator, este optimă utilizarea firelor. Când un client este conectat, va fi creat un thread separat pentru client. Astfel, serverul nostru poate lucra simultan cu mai mulți utilizatori.
Vom discuta primirea cererii de la client. Cererea generată de browser conține informații pe baza cărora serverul web poate determina ce document web dorim de la acesta. Toate nuanțele interogărilor pe care le puteți învăța de la RFC 2068. Să luăm în considerare un exemplu. Când introduceți în browser-ul www.xakep.ru, cererea are următoarea formă (poate diferi, depinde de browser):
Winsock API pentru proxy
După cum se cuvine, după discutarea algoritmului de rezolvare a problemei, trebuie să determinați instrumentele care vor fi necesare pentru aceasta. În cazul nostru, ciocanul principal va fi Delphi, și unghiile cu șuruburi - WinSock API și clasele TThread. Luați în considerare funcțiile WinSock API necesare.
Această funcție, de la apelul de care aveți nevoie pentru a începe programarea oricărei aplicații de rețea. Acesta este conceput pentru a inițializa biblioteca de rețea Windows. Este necesar să trimiteți doi parametri:
Dacă reușiți, funcția returnează 0. Pentru a obține codurile de eroare în WinSock API, utilizați funcția WSAGetLastError (). Nu este nevoie să transmiteți parametri, după apelare returnează codul ultimei erori care apare atunci când lucrați cu funcțiile rețelei.
Înainte de a vă conecta la un nod de la distanță, trebuie să creați o priză "socket". Numai pentru crearea sa și funcția socket a aceluiași nume răspunde. Parametrii de intrare sunt trei:
Rezultatul este o nouă priză. După crearea unui soclu, puteți încerca să vă conectați. Pentru a face acest lucru, biblioteca are funcția Connect.
Parametrii funcției sunt:
Executarea cu succes și, prin urmare, stabilirea unei conexiuni, funcția returnează 0, altfel - o eroare care poate fi obținută cu WSAGetLastError ().
Structura TSockAddr arată astfel:
Citirea și trimiterea datelor către partea de la distanță se face folosind funcțiile de trimitere și recv. Acestea sunt descrise după cum urmează:
Parametrii pentru ambele funcții sunt aceiași:
Odată terminat, funcția va returna numărul efectiv de octeți trimis / primit.
Scopul funcției este de a lega structura TSockAddr la soclul creat. Parametrii sunt trei: soclul, structura, dimensiunea structurii.
Ascultarea reală a portului începe după apelarea acestei funcții. Funcția necesită numai doi parametri: soclul și numărul maxim de solicitări de așteptare a conexiunii.
Această funcție închide soclul. Parametrul este unul singur - soclul trebuie închis.
Scopul funcției este de a verifica disponibilitatea soclului (citirea, scrierea datelor urgente). Selectarea este foarte utilă atunci când trebuie să dezvoltați aplicații de rețea multi-utilizator ca ale noastre, unde utilizarea modelului eveniment Windows nu se justifică. Ca parametri, funcția ia:
Curățați și inițializați setul de prize. Înainte de a adăuga socket-uri unui set, trebuie să îl inițializați utilizând această funcție.
Procedura vizează adăugarea unui soclu trecut în primul parametru setului specificat în al doilea.
Funcția permite verificarea intrării socket (primul parametru) din set (al doilea parametru).
Acesta este momentul când terminăm înțelegerea teoriei și procedăm la codarea reală. Rulați Delphi, creați un nou proiect și dați formei o formă care seamănă cu forma mea. Nu vom ascunde nimic de la utilizator, pentru că, dacă vă aduceți aminte, scriem programul în scopuri educaționale. O să-ți dai seama. Pe formular am trei butoane:
Cu această singură linie de cod, creăm un fir nou de tip TListenThread. Puteți crea un flux suspendat. De aceea trec valoarea false la parametrul Create method, care necesită o pornire imediată.
Fluxul TListenThread pregătește soclul pentru a asculta și așteaptă conexiunile la portul 8080. Codul de creare este afișat în bara laterală "TListenThread thread".
Să aruncăm o privire mai atentă la conținutul casetei de mai sus. Procedura Execute (). definită de obiectul TlistenThread. este cea principală pentru fire. După ce firul este pornit, este executat mai întâi, și dacă este așa, atunci este necesar să plasați codul în el, care este responsabil pentru începerea ascultării unui anumit port.
Pentru a începe să ascultați portul, trebuie să creați un soclu utilizând funcția socket () cu același nume. Parametrii necesari funcției se determină pe baza protocolului pe care îl vom folosi. Proxy-ul HTTP trebuie să utilizeze un protocol TCP / IP care să asigure transferul de date fiabil. Prin urmare, în al doilea parametru, specificăm SOCK_STREAM.
Când creați un soclu, trebuie să vă asigurați că nu a existat nicio eroare după executarea funcției socket. Pentru verificare, este suficient să comparăm variabila socket cu valoarea constantă INVALID_SOCKET. Dacă acestea sunt egale, atunci a apărut o eroare și executarea ulterioară a programului nu are sens. Să presupunem că soclul a fost creat cu succes, ceea ce înseamnă că următorul pas este umplerea structurii sockaddr_in care conține datele necesare pentru a începe să ascultați.
O descriere detaliată a tuturor proprietăților structurii pe care am dat-o deja, așa că acum nu mă voi concentra asupra acestui lucru. După ce ați completat toate proprietățile structurii, trebuie să o asociați cu soclul nostru folosind funcția BIND. Dacă funcția BIND a fost executată fără erori, atunci trebuie să apelați funcția pentru a începe să ascultați ascultarea. După executarea acesteia, se pornește o buclă infinită, în care se numește funcția accept (). Execuția cu succes va însemna că un client sa conectat la noi și pentru a lucra cu acesta, trebuie să creați un fir nou. În fluxul TClientThread, datele vor fi schimbate între client și proxy-ul nostru și, în consecință, între serverul proxy și serverul de la distanță. Codul principal de flux pentru TClientThread este afișat în bara laterală și puteți vedea întotdeauna versiunea completă pe discul nostru.
Codul fluxului TClientThread
Odată ce conexiunea este stabilită, trebuie să puneți soclul în modul asincron. Modul se modifică utilizând funcția setockopt (). Traducerea în modul asincron este necesară deoarece, în acest caz, performanța aplicației noastre va fi robustă. Acest lucru va fi posibil din cauza minimizării întârzierilor înaintea transferului de date între noi, serverul web și clientul. După ce am primit o parte din datele de pe server, nu vom aștepta restul, dar îl vom trimite imediat clientului.
Fereastra dormitorului a fost tăiată
Sper că exemplul de astăzi sa dovedit a fi foarte util atât pentru programator, cât și pentru hacker. Încă o dată ați fost convins că Delphi nu este doar baze de date și rapoarte, ci și o limbă cu care puteți rezolva atât sarcini aplicate, cât și hacking. Vă pot dori doar aplicarea cu succes a cunoștințelor acumulate în proiectele viitoare.