Socks5 saját kezűleg

Az anonimitás a neten - nem egy új témát. És akkor biztosan állítani, hogy a számítógép prog típusú A4Proxy, SocksChain
és hasonlók. Személy szerint én nem szeretem, ha dolgozni proxy kell semmilyen külön prog. először
csúnya, ha sok ablak a tálcán vagy az ikonra a tálcán, és a második kanyarban a repedések igényel, és ezek
lusta keresni 🙂 miért írtam osztályok támogatására SOCKS5-szerverek, hogy tudok most zayuzat
annak bármely prog. És most szeretnék mondani mindenkinek, hogyan kell csinálni.

Skonnektivshis a szerver, a kliens elküld egy csomagot, amely tartalmazza a változat a protokoll és a támogatott
hitelesítési módszerek. Ez a csomag a következő formában:

BYTE verzió;
BYTE nMethods;
BYTE módszerek [nMethods]

A verzió legyen 5. Minden bejegyzés módszerek nem csak meghatározza a hitelesítési módszer, hanem egy módja annak, hogy titkosítja az adatokat,
ha azt használják. szerver kiválaszt egyet ezekkel a módszerekkel. Megadhat számos eljárás, de ha a szerver nem igényel hitelesítést, nincs módszer
kivéve 0x00 (ne használjon semmilyen titkosítás és hitelesítés) nem lesz szükség. Válaszul a kiszolgáló elküldi a csomagot az alábbiak szerint:

BYTE verzió
BYTE módszer,

amely eljárás - kiválasztott eljárással szerver vagy 0xFF (sem a javasolt módszerek nem támogatott). Ha az eljárás 0x00, akkor azonnal elküldi a parancsot.

Csomag parancs formátuma a következő:

BYTE verzió; // 5
BYTE Cmd; // 1 - CONNECT
BYTE fenntartva; // 0
BYTE AType; // 1 - IPv4; 3 - domain név; 4 - IPv6
BYTE addr [];
Port szó; // bájtok hálózatban kell lennie, vagyis htons (Port) ..;

Ha egy domain nevet, akkor először be kell menni a hossza bájt, akkor a string nélkül lezáró nulla.

A kiszolgáló elküldi ezt a választ:

BYTE verzió; // 5
BYTE Rep; // 0 - Ok
BYTE fenntartva; // 0
BYTE AType; // 1 - IPv4; 3 - domain név; 4 - IPv6
BYTE addr [];
Port szó;

Mivel zokni magában TCP, ajánlatos, hogy a zokni-osztályba tartozó vegyületek származnak
Socket osztály, de MFCshny CSocket nem alkalmas, mert ő minden módszer
nem virtuális. Írjon foglalattípusának, és hívja meg, mondjuk, CTSocket

private:
SOCKET zokni;
>;

osztály CSocksSocket. nyilvános CTSocket
nyilvános:
virtuális BOOL CreateSocket ();
virtuális BOOL Connect (unsigned long ip, unsigned short port);
virtuális BOOL Connect (LPCSTR nevét, unsigned short port);
virtuális int Send (const char * str, int len);
virtuális int Recv (char * buf, int max);
virtuális BOOL Bezárás ();
virtuális előjel nélküli hosszú hiba GetHost ();

CTSocket * pSocket;
előjel nélküli hosszú socks_ip;
unsigned short socks_port;

// végrehajtása
BOOL CSocksSocket :: CreateSocket ()
if (! pSocket-> CreateSocket ()) return false;
if (pSocket-> Connect (socks_ip, socks_port)!) return false;
puffert [0] = 5; // Ver
puffert [1] = 1; // eljárás 1
puffert [2] = 0; // nincs auth
pSocket-> küldése (puffer, 3);
int n = pSocket-> Recv (puffer, 2);
if (! n = 2) FALSE értékkel tér vissza;
ha a (puffer [1] = 0!) FALSE értékkel tér vissza; 0 // módszer nem támogatott
return true;
>

BOOL CSocksSocket :: Connect (unsigned long ip, unsigned short port)
puffert [0] = 5; // Ver
puffert [1] = 1; // CONNECT
puffert [2] = 0; // fenntartva
puffert [3] = 1; // IPv4
* ((Előjel nélküli hosszú hiba *) (puffer + 4)) = ip;
* ((Unsigned short *) (puffer + 8)) = port;
pSocket-> küldése (puffer, 10);
int n = pSocket-> Recv (puffer, 10);
if (! n = 10) FALSE értékkel tér vissza;
ha a (puffer [1] = 0!) FALSE értékkel tér vissza; // Nem lehet csatlakozni
ha a (A-puffer [3] = 1!) FALSE értékkel tér vissza; // fogjuk követelni, hogy azt mondjuk, IP, és nem valami mást.
l_ip = * ((előjel nélküli hosszú hiba *) (puffer + 4));
return true;
>

BOOL CSocksSocket :: Connect (LPCSTR nevét, unsigned short port)
puffert [0] = 5;
puffert [1] = 1;
puffert [2] = 0;
puffert [3] = 3; // Domain név
int m = strlen (név);
puffert [4] = m; // hossza byte
memcpy (puffer + 5, neve, m); // másolása a húr nélkül megszüntető nulla
* ((Unsigned short *) (puffer + 5 + m)) = port;
pSocket-> küldése (puffer, m + 7);
int n = pSocket-> Recv (puffer, 10);
if (! n = 10) FALSE értékkel tér vissza;
ha a (puffer [1] = 0!) FALSE értékkel tér vissza;
ha a (A-puffer [3] = 1!) FALSE értékkel tér vissza; // fogjuk követelni, hogy azt mondjuk, IP, és nem valami mást.
l_ip = * ((előjel nélküli hosszú hiba *) (puffer + 4));
return true;
>

int CSocksSocket :: Send (const char * str, int len)
visszaút pSocket-> Send (str, len);
>

int CSocksSocket :: Recv (char * buf, int max)
vissza pScoket-> Recv (buf, max);
>

void CSocksSocket :: Bezárás ()
pSocket-> Bezárás ();
>

előjel nélküli hosszú CSocksSocket :: GetHost ()
visszatérés l_ip;
>

// Nos, most teszteljük a programot
void main ()
WSADATA wsadata;
CTSocket tsock;
CSocksSocket ssock (tsock);

if (ssock.CreateSocket (!)) return; // Nem lehet csatlakozni a zokni
// vagy auth required
ha return (ssock.Connect ( «www.mail.ru», htons (80!))); // www.mail.ru
// megközelíthetetlen
LPSTR q = «HEAD / HTTP / 1.1 \ xD \ xAHost: www.mail.ru:80\xD\xAUser-Agent: xakep \ xD \ xA \ xD \ xA»;
ssock.Send (q, strlen (q));

char buf [1000];
int n = ssock.Recv (buf, 1000);
buf [n] = 0;
printf ( "% s", buf);

Itt található az ezt a cikket egy ismerősének:

Kapcsolódó cikkek