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.

Már említettem, hogy a HTTP proxy nem az egyetlen proxykiszolgáló típusa. Természetesen vannak:
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:
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:
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:
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:
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:

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.

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.

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.