Server proxy pe delphi și winsock api

Server proxy pe delphi și winsock api

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.

Server proxy pe delphi și winsock api

Am spus deja că proxy-ul HTTP nu este singurul tip de server proxy. În natură există și:

  • Proxy-ul HTTPS este unul dintre cele mai versatile tipuri de servere proxy. Acesta acceptă specificațiile protocolului HTTP 1.1. Particularitatea acestei versiuni a protocolului - suport pentru metoda CONNECT, prin care este posibil să se lucreze cu HTTPS (Secure HTTP), și a făcut să lucreze printr-un software de server proxy ca ICQ, a cărui funcționare este prin HTTP-proxy este imposibilă.
  • Proxy FTP - o specie destul de rară, enumerată în Cartea Roșie. După cum sugerează și numele, aceste proxy-uri sunt proiectate să funcționeze cu protocolul FTP. Caracteristica principală a acestora este posibilitatea de a lucra atât în ​​moduri pasive, cât și în mod activ.
  • Șoseaua proxy este cel mai avansat tip de proxy. Astfel de servere proxy funcționează cu orice protocol TCP / IP (ftp, pop3, smtp, nntp, etc.).

    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:

  • wVersionRequested este versiunea bibliotecii inițializate. Există doar două dintre acestea: 1.1 și 2.0. De exemplu, pentru prima versiune vom scrie: makeword (1,1).
  • Un indicator pentru structura WSAData. După ce funcția este executată, informațiile despre biblioteca de rețea vor fi scrise în această structură.

    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:

  • af este o familie de protocoale. Avem nevoie doar de TCP, așa că vom specifica AF_INET.
  • tip - tipul soclului creat. Poate fi sock_stream (pentru protocolul TCP / IP) și sock_dgram (udp).
  • protocolul - protocol. Pentru TCP, trebuie să specificați IPPROTO_TCP.

    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:

  • s este soclul la care doriți să trimiteți (primiți) date.
  • buf - tampon cu date pentru a trimite (primi).
  • len - dimensiunea datelor transmise (primite).
  • steaguri - steaguri responsabile pentru metoda de trimitere (primire).

    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:

  • nfds - parametrul este ignorat și este prezent numai pentru compatibilitatea cu modelul de prize Berkeley.
  • readfds, writefds, exceptfds - determină abilitatea de a citi, scrie și sosesc date urgente. Acești trei parametri sunt indicatori ai structurii FD_SET. care este un set de prize.
  • TimeOut este un indicator al structurii timeval. Timpul maxim de așteptare este definit în structură. Pentru a seta o așteptare infinită, trebuie să treceți la acest parametru.

    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:

  • "Run" - rulează un proxy pe portul 8080.
  • Configurați IE - pentru a configura automat browserul IE.
  • Configurează Opera - aceeași configurație, numai pentru Opera.

    Server proxy pe delphi și winsock api

    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ă.

    Server proxy pe delphi și winsock api

    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.

    Server proxy pe delphi și winsock api

    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.







    Trimiteți-le prietenilor: