Proxykiszolgáló a delphi és a winsock api

Proxykiszolgáló a delphi és a winsock api

Sokszor elmondtuk Önnek a proxy szervereket: mit kell, hogyan dolgoznak és mi hasznos a hacker számára. Mindazonáltal, a tudás és a használat egy dolog, de létrehozni önmagában is egy másik kérdés. Ez a kreatív munka hasznos a léleknek, a testnek és természetesen a WM-erszényének.

Egy kis elmélet

Tehát a proxy szerver elsősorban olyan program, amely közvetítő szerepet játszik az ügyfél és a kiszolgáló között. Mindenki hozzászokott ahhoz, hogy a proxy fogalmát csak a HTTP protokollal társítsa. Valójában vannak proxikumok más protokollokra, amelyekről egy kicsit később beszélni fogok. A proxy leggyakoribb típusa HTTP. Ha HTTP-proxyon dolgozik, a böngészője nem fog csatlakozni ahhoz a kiszolgálóhoz, amelyen a kért webhely található, csatlakozik a proxyhoz, és kérést küld. Miután megkapta tőled a szükséges adatokat, a proxy csatlakozik a távoli webszerverhez és elküldi a kérelmet. A feldolgozás után a webszerver visszaküldi a dokumentumot a proxyba, amely aztán elküldi Önnek. Ezek a proxyk hasznosak, ha anonimitásra van szükség (mert átláthatóak), vagy ha a szolgáltató korlátozza Önt, és nem teszi lehetővé a külföldi szervereken található webhelyeket.

Egy másik hely, ahol a proxy szervereket folyamatosan használják, vállalati (hazai) helyi hálózatok. Ahhoz, hogy az alkalmazottak hozzáférhessenek az internethez, az adminisztrátorok egy átjárót telepítenek az átjárónál, és az egész hivatal keresztülmegy a hálózaton. Módszer előnyei nyilvánvalóak: könnyen nyomon követheti a felhasználó, úgy elfogyasztott mennyiségének forgalmat, és ellenőrizze, hogy a felhasználó nem használ több mint szoftver, mert nem minden program is képes működni, a HTTP-proxy.

Proxykiszolgáló a delphi és a winsock api

Már említettem, hogy a HTTP proxy nem az egyetlen proxykiszolgáló típusa. Természetesen vannak:

  • A HTTPS proxy a proxykiszolgálók egyik legváltozatosabb típusa. Támogatja a HTTP 1.1 protokoll specifikációját. A különlegessége ennek a változata a protokoll - támogatja a CONNECT módszer, amellyel meg lehet dolgozni HTTPS (biztonságos HTTP), és arról, hogy a munka révén egy proxy szerver szoftver, mint az ICQ, amelynek működését a HTTP-proxy lehetetlen.
  • FTP proxy - elég ritka faj, a Vörös Könyvben. Amint azt a név is jelzi, ezek a proxyk úgy vannak kialakítva, hogy az FTP-protokollal működjenek. Fő jellemzője, hogy mind a passzív, mind az aktív üzemmódban dolgozhat.
  • A zokni proxy a legfejlettebb proxy típus. Az ilyen proxykiszolgálók bármilyen TCP / IP protokollt használnak (ftp, pop3, smtp, nntp stb.).

    Miért írhatja a saját proxy szervert?

    A gyakorlatban a proxy szerverek írásának alapjaival foglalkozva képes lesz újratölteni a [[-] saját termelés gyűjteményét. Például könnyedén létrehozhat egy proxy teljesen láthatatlan a rendszerben. Podsunuv ilyen dolog egy szomszéd, ha nem gondol a biztonság és ő használ tűzfalat, a hacker könnyen hajt egy internetes forgalom révén a számítógépet, élvezi a freebie.

    A remekmű másik érdekes módja a jelszavak kihasználása, amit egy szomszéd belép a böngészőjébe. Ebben az esetben a hackernek el kell küldenie a szerencsétlen szomszédnak a szerszámot, és meg kell győznie őt, hogy futtassa azt. Indítás után] [- a proxy automatikusan konfigurálja a szomszéd szomszédjának munkáját, hogy magában dolgozzon. Így az emberek csendesen kaszálják az internetet, és minden kérése (jelszó küldése stb.) Naplózásra kerül. Cool? Kétségtelen! De mi van, és tudom, hogy ezek a téveszmék büntető jellegű, így fogjuk írni a proxy szerver csak oktatási célra, és nem is gondoltam kapok előnyöket.

    Használt technológiák

    Szerveralapú hálózati alkalmazások írása során nem ajánlott a Delphi komponens modell használata. Az összetevők nem rendelkeznek az API alkalmazásával elérhető rugalmassággal. Így ma újra szembesülünk a szörnyű WinSock API-val.

    Most beszélgessünk a jövőbeli proxy szerverünk algoritmusáról. Mivel szerveralkalmazást hozunk létre, csak többfelhasználósnak kell lennie. Csak elképzelni egy vállalati proxy szervert, amelyet csak egy személy használhat, és a többit időközben idegesen dohányzik. Tehát, mivel alkalmazásunk többfelhasználós lesz, optimális a szálak használata. Amikor egy kliens csatlakozik, egy külön szál kerül létrehozásra az ügyfél számára. Így a szerverünk egyszerre több felhasználóval is dolgozhat.

    Megbeszéljük, hogy megkapja a kérést az ügyféltől. A böngésző által generált kérelem olyan információkat tartalmaz, amelyek alapján a webszerver meghatározhatja, hogy melyik internetes dokumentumot szeretnénk. Az RFC 2068-on megtanulható lekérdezések valamennyi árnyalata. Tekintsünk egy példát. Amikor beírja a www.xakep.ru böngészőt, a kérelemnek a következő formája van (különbözhet a böngészőtől függően):

    Winsock API for Proxy

    Ahogy a programozáshoz illik, az algoritmus megbeszélése után a probléma megoldásához meg kell határoznia az ehhez szükséges eszközöket. A mi esetünkben a fő kalapács a Delphi lesz, és csavaros körmök - a WinSock API és a TThread osztályok. Vegye figyelembe a szükséges WinSock API-funkciókat.

    Ez a funkció, amellyel bármely hálózati alkalmazás programozásához el kell kezdeni. Úgy tervezték, hogy inicializálja a Windows hálózati könyvtárat. Két paramétert kell elküldeni:

  • wVersionRequested az inicializált könyvtár változata. Csak kettő: 1,1 és 2,0. Például az első verzióhoz: makeword (1,1).
  • A mutató a WSAData struktúrájához. A függvény végrehajtása után a hálózati könyvtárra vonatkozó információk kerülnek a rendszerbe.

    Ha sikeres, akkor a függvény értéke 0. A WinSock API hibakódjainak eléréséhez használja a WSAGetLastError () függvényt. Nem kell átadnia semmilyen paramétert, a hívás után visszaadja az utolsó hiba kódját, amely a hálózati funkciók használata során történt.

    Mielőtt a távoli csomóponthoz csatlakozna, létre kell hoznia egy "socket" foglalatot. Csak a létrehozása és az azonos nevű socket funkciója válaszol. A bemeneti paraméterek három:

  • af egy protokollcsalád. Mindössze TCP-re van szükségünk, így megadjuk az AF_INET értéket.
  • típus - a létrehozandó aljzat típusa. Ez lehet sock_stream (TCP / IP protokollhoz) és sock_dgram (udp).
  • protokoll - protokoll. TCP esetén meg kell adnia az IPPROTO_TCP protokollt.

    Az eredmény egy új foglalat. Csatlakozást létrehozva megpróbálhat csatlakozni. Ehhez a könyvtár rendelkezik a Connect funkcióval.

    A funkció paraméterei:

    Ha sikeresen végrehajtja és így létrehoz egy kapcsolatot, a függvény 0-ot ad vissza, ellenkező esetben - a WSAGetLastError () által nyerhető hiba.

    A TSockAddr struktúra így néz ki:

    Az adatok olvasása és küldése a távoli oldalra a küldési és a visszaállítási funkciók segítségével történik. Ezek a következők:

    Mindkét funkció paraméterei megegyeznek:

  • s az az aljzat, amelyhez adatokat kíván küldeni (fogadni).
  • buf - puffer adatküldéshez (fogadás).
  • len - a továbbított (kapott) adatok mérete.
  • zászlók - a küldés (fogadás) módszeréért felelős zászlók.

    Ha elkészült, a függvény visszaküldi az elküldött / fogadott bájtok tényleges számát.

    A függvény célja, hogy a TSockAddr struktúrát a létrejött foglalathoz kösse össze. A paraméterek három: az aljzat, a szerkezet, a szerkezet mérete.

    A port tényleges hallgatása a funkció hívása után kezdődik. A funkció csak két paramétert igényel: az aljzat és a csatlakozási várakozási kérelmek maximális száma.

    Ez a funkció lezárja az aljzatot. A paraméter csak egy - a zárt csatlakozóaljzat.

    A funkció célja az aljzat készenlétének ellenőrzése (olvasás, sürgős adatok írása). A Select nagyon hasznos, ha olyan többfelhasználós hálózati alkalmazásokat kell kifejlesztenünk, mint a miénk, ahol a Windows eseménymodell használata nem igazolja magát. Paraméterként a függvény:

  • nfds - a paramétert figyelmen kívül hagyja, és csak a Berkeley socket modellel való kompatibilitás miatt jelenik meg.
  • readfds, writefds, exceptfds - meghatározzák a sürgős adatok olvasását, írását és érkezését. Ez a három paraméter az FD_SET struktúrára mutat. amely egy aljzat-készlet.
  • A TimeOut egy mutató az idős struktúra számára. A maximális várakozási időt a szerkezet határozza meg. Végtelen várakozás beállításához nullát kell adni ehhez a paraméterhez.

    Tisztítsa meg és helyezze vissza az aljzat készletet. Mielőtt a készlethez csatlakozna az aljzatok, be kell állítani ezt a funkciót.

    Az eljárás az első paraméterben átadott aljzat hozzáadására szolgál a másodikban megadott halmazhoz.

    A funkció lehetővé teszi, hogy ellenőrizze a készletben lévő aljzatbevitelt (első paramétert) (a második paraméter).

    Ez az a pillanat, amikor befejeztük az elmélet megértését és folytatjuk az igazi kódolást. Futtassa a Delphi-t, hozzon létre egy új projektet, és adja meg a formanyomtatványt, amely úgy néz ki, mint az űrlapom. Nem fogunk elrejteni semmit a felhasználótól, mert ha emlékszel, a programot oktatási célokra írjuk. Kitalálod magad. Az űrlapon három gomb van:

  • "Futtatás" - proxy indít a 8080-as porton.
  • IE konfigurálása - az IE böngésző automatikus beállítása.
  • Konfigurálja az Opera - ugyanazt a konfigurációt, csak az Opera esetében.

    Proxykiszolgáló a delphi és a winsock api

    Ezzel a kóddal egyetlen TListenThread típusú szálat hozunk létre. Létrehozhat egy felfüggesztett adatfolyamot. Ezért adom át a hamis értéket a Create method paraméterhez, amely azonnali indítást igényel.

    Proxykiszolgáló a delphi és a winsock api

    A TListenThread adatfolyam előkészíti az aljzatot a hallgatáshoz, és várja a 8080-as porthoz való kapcsolódást. A létrehozási kód a "TListenThread szál" oldallapban látható.

    Nézzük meg közelebbről a fenti mező tartalmát. Az Execute () eljárás. amelyet a TlistenThread objektum határoz meg. a legfontosabb a szálak számára. Miután a téma elindult, először végrehajtódik, és ha igen, akkor be kell helyezni a kódot, ami felelős egy adott port hallgatásához.

    A port meghallgatásához létre kell hoznia egy aljzatot az azonos nevű socket () függvény használatával. A funkcióhoz szükséges paraméterek meghatározása alapján melyik protokollt fogjuk használni. A HTTP-proxynek TCP / IP protokollt kell használnia, amely megbízható adatátvitelt biztosít. Ezért a második paraméterben a SOCK_STREAM-ot adtam meg.

    Proxykiszolgáló a delphi és a winsock api

    Ha aljzatot hoz létre, győződjön meg róla, hogy a socket funkció végrehajtása után nem történt hiba. Ellenőrzéshez elegendő az aljzatváltozó összehasonlítása az állandó INVALID_SOCKET értékével. Ha egyenlőek, akkor hiba történt, és a program további végrehajtása értelmetlen. Tegyük fel, hogy az aljzat sikeresen létrejött, ami azt jelenti, hogy a következő lépés a sockaddr_in struktúra feltöltése, amely tartalmazza a szükséges adatokat a meghallgatáshoz.

    A struktúra összes tulajdonságának részletes leírása, amit már adtam, szóval most nem foglalkozom ezzel. Miután a struktúra összes tulajdonságát kitöltötte, a BIND funkcióval társítani kell az aljzatunkhoz. Ha a BIND funkció hiba nélkül végrehajtásra került, akkor a funkciót el kell indítania a hallgatás hallgatásához. Végrehajtása után egy végtelen hurok indul, amelyben az accept () függvény nevezik. A sikeres végrehajtás azt jelenti, hogy egy ügyfél kapcsolódott hozzánk, és együtt kell dolgozni, új szálat kell létrehoznunk. A TClientThread adatfolyamban az adatok kerülnek az ügyfél és a proxy között, és ennek megfelelően a proxy és a távoli kiszolgáló között. A TClientThread fő stream kódja megjelenik az oldalsávon, és mindig láthatja a teljes verziót a lemezünkön.

    TClientThread stream kód

    A kapcsolat létrejötte után az aljzatot aszinkron üzemmódba kell helyezni. Az üzemmód megváltozik a setsockopt () függvény használatával. Fordítás aszinkron üzemmódra van szükség, mert ebben az esetben alkalmazásunk teljesítménye robusztus. Ez a késések minimalizálása miatt lehetséges, mielőtt átadjuk az adatokat köztünk, a webszerver és az ügyfél között. Miután megkaptuk az adatok egy részét a szerverről, nem várjuk meg a többiet, de azonnal elküldjük az ügyfélnek.

    A dormer ablakot átvágták

    Remélem, hogy a mai példa nagyon hasznosnak bizonyult mind a programozó, mind a hacker számára. Ismét meg volt győződve arról, hogy a Delphi nem csak adatbázisok és jelentések, hanem egy olyan nyelv is, amellyel mind az alkalmazott, mind a hacker feladatokat megoldhatja. Csak a jövőbeni projektekben szerzett tudás sikeres alkalmazását kívánom.