[Delphi]Исходник socks server

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by xafon, 15 Jan 2010.

  1. xafon

    xafon New Member

    Joined:
    2 Dec 2009
    Messages:
    38
    Likes Received:
    4
    Reputations:
    0
    вот не плохой socks server на Delphi:
    PHP:
    unit SocksServer;

    interface

    uses Windows,Winsock;

    var
    wsaData TWSADATA;
    proxy_port:Integer;
    l_sock TSocket;
    sock4 SOCKADDR_IN;
    Client TSockAddr;
    h1 THandle;

    type TSOCKS4_REQUEST=record
    ucVersion 
    byte;
    ucCommand byte;
    wDestPort word;
    dwDestIp dword;
    end;
    type TSOCKS5_REQUEST=record
    ucVersion 
    byte;
    ucCommand byte;
    ucRzv byte;
    ucAtyp byte;
    dwDestIp dword;
    wDestPort word;
    end;

    procedure StartSocks;

    implementation

    procedure FlushRecvBufferUntil
    (s:TSOCKET;condition:Char);
    var
    iReceiveRes integer;
    cDummy char;
    begin
    repeat
    iReceiveRes 
    := recv(scDummysizeof(cDummy), 0);
    until NOT ((iReceiveRes<>SOCKET_ERROR) and (iReceiveRes<>0) and (cDummy<>condition));
    end;

    procedure SocksHandlerTreadProc(pParam:pointer); stdcall;
    var
    TSocket;
    tunnelSock TSocket;
    iConnectResult integer;
    iReceiveRes integer;
    iSocketsSet integer;
    socks4Request TSOCKS4_REQUEST;
    socks4Response TSOCKS4_REQUEST;
    socks5Request TSOCKS5_REQUEST;
    socks5Response TSOCKS5_REQUEST;
    remoteAddr SOCKADDR_IN;
    fds_read TFDset;//fd_set;
    tv TTimeval;
    cSocksVersion byte;
    nMethods byte;
    Mbuffer : array[0..255of byte;
    iSelectResult integer;
    loop integer;
    ulVal u_long;
    swapBuffer : array[0..4096*16-1of char;
    iRecvResult integer;
    begin
    := TSOCKET(pParam);
    tunnelSock := 0;
    loop := 0;
    while 
    loop=do
    begin
    inc
    (loop);
    iConnectResult := 0;
    iReceiveRes := 0;
    iSocketsSet := 0;
    FD_ZERO(fds_read);
    FD_SET(sfds_read);
    tv.tv_sec := 30;
    cSocksVersion := 0;
    iSelectResult := select(0, @fds_readnilnil, @tv);
    if (
    iSelectResult=SOCKET_ERROR) or (not iSelectResult>0then break;
    ulVal := 0;
    ioctlsocket(sFIONBIO ulVal);
    iReceiveRes := recv(scSocksVersion1MSG_PEEK);

    if (
    cSocksVersion=4then //Socks 4
    begin
    iReceiveRes 
    := recv(ssocks4Requestsizeof(socks4Request), 0);
    if 
    iReceiveRes=SOCKET_ERROR then break;
    ulVal := 1;

    ioctlsocket(sFIONBIO ulVal);
    FlushRecvBufferUntil(s#0);
    if socks4Request.ucCommand 1 then
    begin
    ulVal 
    := 0;
    ioctlsocket(sFIONBIOulVal);
    remoteAddr.sin_family := AF_INET;
    move(socks4Request.dwDestIp,remoteAddr.sin_addr,si zeof(remoteAddr.sin_addr));
    remoteAddr.sin_port := socks4Request.wDestPort;
    tunnelSock := socket(AF_INETSOCK_STREAM0);
    iConnectResult := connect(tunnelSockremoteAddrsizeof(remoteAddr));
    if (
    iConnectResult<>SOCKET_ERRORthen
    begin 
    // 1111111111
    socks4Response.ucCommand := 90;
    socks4Response.ucVersion := 0;
    send(ssocks4Responsesizeof(socks4Response), 0);
    end
    else
    break;
    end
    else
    break;
    end;

    if (
    cSocksVersion=5then //Socks 5
    begin
    iReceiveRes 
    := recv(s,nMethods,1,0);
    if 
    iReceiveRes=SOCKET_ERROR then break;

    recv(s,Mbuffer,nMethods,0);
    Mbuffer[0]:=5;
    Mbuffer[1]:=0;
    send(s,Mbuffer,2,0);

    recv(ssocks5Requestsizeof(socks5Request), 0);

    if 
    iReceiveRes=SOCKET_ERROR then break;
    ulVal := 1;
    ioctlsocket(sFIONBIO ulVal);
    FlushRecvBufferUntil(s#0);
    if socks5Request.ucCommand 1 then
    begin
    ulVal 
    := 0;
    ioctlsocket(sFIONBIOulVal);
    remoteAddr.sin_family := AF_INET;
    move(socks5Request.dwDestIp,remoteAddr.sin_addr,si zeof(remoteAddr.sin_addr));
    remoteAddr.sin_port := socks5Request.wDestPort;
    tunnelSock := socket(AF_INETSOCK_STREAM0);
    iConnectResult := connect(tunnelSockremoteAddrsizeof(remoteAddr));
    if (
    iConnectResult<>SOCKET_ERRORthen
    begin
    socks5Response
    .ucCommand := 90;
    socks5Response.ucVersion := 0;
    send(ssocks5Responsesizeof(socks5Response), 0);
    end
    else
    break;
    end
    else
    break;
    end;

    ulVal := 0;
    ioctlsocket(tunnelSockFIONBIOulVal);
    ioctlsocket(sFIONBIOulVal);
    fillchar(swapBuffer,sizeof(swapBuffer),0);
    tv.tv_sec := 2;
    while 
    true do
    begin
    sleep
    (50);
    FD_ZERO(fds_read);
    FD_SET(sfds_read);
    FD_SET(tunnelSockfds_read);
    iSocketsSet := select(0, @fds_readnilnil, @tv); //if (iSocketsSet == SOCKET_ERROR) _leave;
    if iSocketsSet 0 then
    begin
    if FD_ISSET(sfds_readthen
    begin
    iRecvResult 
    := recv(sswapBuffersizeof(swapBuffer), MSG_PEEK);
    if (
    iRecvResult=0)
    then break
    else 
    iRecvResult := recv(sswapBuffersizeof(swapBuffer), 0);
    if (
    iRecvResult <> SOCKET_ERROR) and (iRecvResult 0)
    then send(tunnelSockswapBufferiRecvResult0)
    else BREAK;
    end;

    if (
    FD_ISSET(tunnelSockfds_read)) then
    begin
    iRecvResult 
    := recv(tunnelSockswapBuffersizeof(swapBuffer), MSG_PEEK);
    if 
    iRecvResult 0
    then 
    break
    else 
    iRecvResult := recv(tunnelSockswapBuffersizeof(swapBuffer), 0);
    if (
    iRecvResult <> SOCKET_ERROR) and (iRecvResult 0)
    then send(sswapBufferiRecvResult0)
    else break;
    end;
    end;
    end;
    end;
    closesocket(s);
    closesocket(tunnelSock);
    end;

    procedure StartSocks;
    var
    size:Integer;
    begin
    proxy_port 
    := 1234;
    WSAStartup(MAKEWORD(2,0), wsaData);
    l_sock := socket(AF_INETSOCK_STREAMIPPROTO_TCP);
    sock4.sin_family := AF_INET;
    sock4.sin_port := htons(proxy_port);
    sock4.sin_addr.s_addr := INADDR_ANY;
    Size := SizeOf(Client);
    if (
    Bind(l_sock,sock4,SizeOf(sock4))=0) and (Listen(l_sock,$FF)=0then
    while true do begin
    sleep
    (50);
    CreateThread(nil,0,@SocksHandlerTreadProc,Pointeraccept(l_sock, @Client, @Size)),0,h1);
    end;

    end;
    end
     
  2. ReduKToR

    ReduKToR Active Member

    Joined:
    5 Jan 2009
    Messages:
    257
    Likes Received:
    179
    Reputations:
    4
    Разделом ошибся) Делфи рядом...Тут только Веб програмирование
     
  3. xafon

    xafon New Member

    Joined:
    2 Dec 2009
    Messages:
    38
    Likes Received:
    4
    Reputations:
    0
    Да, прошу модераторов перенести тему, не много не туда поместил, sorry.