Дайте исходники простейшего прокси (Delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sharky, 20 Apr 2007.

  1. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    Дайте исходники простейшего прокси который при запуске был незаметным для пользователя а так же прописывался в авторан
     
  2. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    пример каскадирующего проски, он же port mapper

    как ты представляешь себе незаметность? порт всё равно открывается в любом случае..
    Code:
    #include <windows.h>
    
    
    // НАСТРОЙКА  ПАРАМЕТРОВ
    #define IN_PORT     1111
    #define OUT_IP      "192.168.0.89"
    #define OUT_PORT    80
    #define MAX_DATA    100
    #define MAXCONN 1000
    #define IDE_MSG 110
    #define WM_ASYNC_CLIENTEVENT  WM_USER+1
    #define WM_ASYNC_PROXYEVENT WM_USER+10
    
    LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
    void ConnectToProxy(SOCKET);
    
    
    SOCKET hListenSockTCP   = INVALID_SOCKET;
    SOCKADDR_IN     myaddrTCP,proxyaddrTCP;
    char buf[MAX_DATA];
    SOCKET sockets[MAXCONN];
    HWND hwndMain;
    
    int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szCmdLine,int nCmdShow)
    {
      WSADATA stWSADataTCPIP;
      if(WSAStartup(0x0101, &stWSADataTCPIP)) MessageBox(0,"WSAStartup error !","NET ERROR!!!",0); 
    
      ZeroMemory(sockets,sizeof(sockets));
    
      WNDCLASS wc;
      memset(&wc,0,sizeof(WNDCLASS));
      wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ;
      wc.lpfnWndProc = (WNDPROC)MainWndProc;
      wc.hInstance = hInst;
      wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
      wc.lpszClassName = "CProxy";
      wc.lpszMenuName = NULL;
      wc.hCursor = LoadCursor(NULL,IDC_ARROW);
      wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
      if (!RegisterClass(&wc)) return 0;
    
      hwndMain=CreateWindow("CProxy","ProxyExample", WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME, CW_USEDEFAULT,0,CW_USEDEFAULT,0, NULL, NULL, hInst, NULL);
      ShowWindow(hwndMain,SW_SHOW);
      
    
      hListenSockTCP = socket (AF_INET,SOCK_STREAM,0);
      myaddrTCP.sin_family = AF_INET;
      myaddrTCP.sin_addr.s_addr = htonl (INADDR_ANY);
      myaddrTCP.sin_port = htons (IN_PORT);
      if(bind(hListenSockTCP,(LPSOCKADDR)&myaddrTCP, sizeof(struct sockaddr))) { MessageBox(hwndMain,"This port in use!","BIND TCP ERROR!!!",0);} 
      if (listen (hListenSockTCP, 5)) MessageBox(hwndMain,"listen error!","ERROR!!!",0);
      WSAAsyncSelect (hListenSockTCP,hwndMain,WM_ASYNC_CLIENTEVENT,FD_ACCEPT|FD_READ|FD_CLOSE);
      
      
      MSG  msg;
      while(GetMessage(&msg,NULL,0,0))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      return msg.wParam;
    
      return 0;
    }
    
    
    
    LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
       WORD WSAEvent;
       int i;
       DWORD currentsock;
    
      switch (msg)
      {
    
      case WM_COMMAND:
        break;
    
      case WM_DESTROY:
        PostQuitMessage(0);  // 10xu4yourtime
        break;
    
    
      case WM_ASYNC_CLIENTEVENT: // Сообщения про события сокетов, подключенных к клиенту...
        currentsock = wParam;
        WSAEvent = WSAGETSELECTEVENT (lParam);
        switch (WSAEvent)
        {
          case FD_CLOSE :
               shutdown(sockets[currentsock],1);
               closesocket(currentsock);
               return 0;
    
          case FD_READ:
               // ПЕРЕНАПРАВЛЕНИЕ ДАННЫХ (redirect). Берем от клиента, посылаем на сервер.
               i=recv(currentsock, buf, MAX_DATA, 0);
                     send(sockets[currentsock],  buf, i, 0); // и отправляем...
               return 0;
    
          case FD_ACCEPT:
               ConnectToProxy(accept(hListenSockTCP,NULL,NULL));
               return 0;
          }
          break;
    
      case WM_ASYNC_PROXYEVENT:
           // Найдем соответствующий дескриптор.
           for (i=0;i<MAXCONN;i++)
           if (sockets[i] == wParam) { currentsock=i; break; }
           WSAEvent = WSAGETSELECTEVENT (lParam);
           switch (WSAEvent)
               {
             // Произошло подключение к удаленному хосту
             case FD_CONNECT :
               i=WSAGETSELECTERROR(lParam);
               if (i!=0)
               {
                 shutdown(currentsock,1);
                 closesocket(sockets[currentsock]);
                 sockets[currentsock]=INVALID_SOCKET;
               }
            return 0;
                       
                       
                    // Сервер нас отрубает ...
                    case FD_CLOSE :
                               shutdown(currentsock,1);
                               closesocket(sockets[currentsock]);    sockets[currentsock]=INVALID_SOCKET;
                               return 0;
    
                            // Перенаправление данных клиенту
              case FD_READ:
             i=recv(sockets[currentsock], buf, MAX_DATA, 0);
                         send(currentsock,buf, i, 0);
                         return 0;
                }
                    break;
      }
      return DefWindowProc(hwnd,msg,wParam,lParam);
    }
    
    
    
    
    
    
    
    // Connect to PROXY Connect to PROXY Connect to PROXY Connect to PROXY Connect to PROXY Connect to PROXY
    
    void ConnectToProxy(SOCKET nofsock)
    {
      SOCKADDR_IN rmaddr;
      rmaddr.sin_family = AF_INET;
      rmaddr.sin_addr.s_addr = inet_addr(OUT_IP);
      rmaddr.sin_port = htons (OUT_PORT);
    
      sockets[nofsock] = socket (AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET == sockets[nofsock]) MessageBox(0,"INVALID_SOCKET","ERROR!!!",0);
    
      WSAAsyncSelect (sockets[nofsock],hwndMain,WM_ASYNC_PROXYEVENT, FD_CONNECT|FD_READ|FD_CLOSE);
      
      connect (sockets[nofsock], (struct sockaddr *)&rmaddr,sizeof(rmaddr));
      
      return;  // Connect OK
    }
    (с)http://www.sources.ru/cpp/cpp_simple_proxy.shtml
     
    2 people like this.
  3. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    в том смысле что внешне пользователь не увидел никаких окон
     
  4. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    А есть что нить на дельфи или вб?
     
  5. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    в этом примере их и нет.
    не поленись поискать сам =\
    в общем-то принцип один и тот же во всех языках.
     
  6. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    я в кодинге неособо силён..могу тока малость покрректировать код и всё...так что можете выложить готовый вариант?
    И ещё я заметил параметр #define OUT_IP "192.168.0.89" ...мне он вобще не нужен поскольку прокси нужно чтоб засунуть его в код трояна
     
  7. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    я выложил не готовый?
    а ты вообще в курсе зачем используется эта директива? =) ну, убери её, добавь переменную..
    если "в кодинге не особо силен" писать трояна смысла нет.
     
  8. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    а помоему смысл есть...я так учусь
     
  9. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    если писать трояна путем копипаста кода, то ты ничему не научишься.
     
  10. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    я пытаюсь разобраться в коде по ходу дела...
    ну так как насчёт исходника на вб или дельфи?
     
  11. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    так код прокси самого я нашёл...но там сам лог отображается как бы в cmd...дайте кусок кода чтоб сделать приложение невидиимым в дельфи
     
  12. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    тут скорее нужно удалить из твоего кода что-то, а не добавлять
     
  13. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    Code:
    program dproxy;
    
    {$APPTYPE CONSOLE}
    
    uses
      windows,
      WinSock,
      StrUtils,
      SysUtils,
      uutil in 'uutil.pas';
    
    const
      pcount = 32;
    
    var
      wsaData  : TWSADATA;
      mainsock : TSocket;
      client   : TSOCKADDR;
      csock    : TSocket;
      addr     : SOCKADDR_IN;
      Size     : integer;
      bol      : boolean;
      i        : integer;
    
      a_exit : array of boolean;
      a_sock : array of TClientEx;
      a_hndl : array of THandle;
    
    function SocksHandlerTreadProc(pParam:pointer):DWORD; stdcall;
    var
      s1   : TSocket;
      j    : integer;
      i    : integer;
      loop : integer;
      bol  : boolean;
      buf_1: AnsiString;
      buf  : AnsiString;
      buf_len : integer;
      p  : integer;
      p2 : integer;
      p3 : integer;
      z_s : string;
      recv_result : integer;
      DataType : TDataType;
      Host_str : string;
      Host_host : string;
      Host_port : string;
      zapros_str : string;
      url : string;
      remHost : u_long;
      RemPort : u_short;
      sa  : TSockaddrin;
      lpMsgBuf : array[0..255] of Char;
    
      name : TSockaddr;
    begin
      j := integer(pParam);
      WHILE TRUE DO
      BEGIN
        while a_sock[j].Socket=0 do sleep(40);
        i := sizeof(name);
        getpeername(a_sock[j].Socket, name, i);
        a_sock[j].client := LongToIp(name.sin_addr.S_addr);
        z_s   := #13#10;
        loop  := 0;
        bol   := True;
        buf_1 := '';
        buf   := '';
        buf_len := 1024;
        DataType := dtGET;
        while loop=0 do
        begin
          inc(loop);
          while bol do
          begin
            setlength(buf_1,buf_len);
            recv_result := recv(a_sock[j].Socket,buf_1[1],buf_len,0);
            if recv_result>0 then setlength(buf_1,recv_result)
                             else break;
            buf := buf + buf_1;
            p := pos(z_s+z_s,buf);
            if p<>0 then
            begin
              bol := False;
              break;
            end;
          end;
          if bol then break;
          buf_1 := lowercase(copy(buf,1,4));
          if buf_1<>'get ' then
            if buf_1='post' then DataType := dtPOST
                            else if buf_1='head' then DataType := dtHEAD
                                                 else break;
      
          p := pos(z_s,buf);
          zapros_str := copy(buf,1,p-1);
          delete(buf,1,p+1);
      
          p   := posex(#32,zapros_str);
          p3  := p;
          p2  := posex(#32,zapros_str,p+1);
          url := copy(zapros_str,p+1,p2-p-1);
          delete(zapros_str,p,p2-p+1);
          delete(url,1,7);
          p         := pos('/',url);
          host_str  := copy(url,1,p-1);
          delete(url,1,p-1);
          p         := pos(':',host_str);
          if p=0 then
          begin
            host_port := '80';
            host_host := host_str;
          end
                 else
          begin
            host_host := copy(host_str,1,p-1);
            host_port := copy(host_str,p+1,length(host_str));
          end;
          insert(#32+url+#32,zapros_str,p3);
          buf := zapros_str + z_s + buf;
          remHost := HostToLong(host_host);
          RemPort := strtoint(host_port);
          writeln(a_sock[j].client + ' ' + zapros_str);
          s1  := socket(AF_INET, SOCK_STREAM,0);
          FillChar(sa,sizeof(sa),0);
          sa.sin_addr.S_addr := remHost;
          sa.sin_family := af_inet;
          sa.sin_port   := htons(80);
          if connect(s1,sa,sizeof(sa))<>SOCKET_ERROR then
          begin
            send(s1,buf[1],length(buf),0);
            bol := True;
            while bol do
            begin
              setlength(buf_1,buf_len);
              recv_result := recv(s1,buf_1[1],buf_len,0);
              if recv_result>0 then
              begin
                setlength(buf_1,recv_result);
                send(a_sock[j].Socket,buf_1[1],length(buf_1),0);
              end
                               else break;
            end;
          end;
          shutdown(s1, SD_BOTH);
          closesocket(s1);
        end;
    
        shutdown(a_sock[j].Socket, SD_BOTH);
        closesocket(a_sock[j].Socket);
        a_sock[j].Socket := 0;
      END;
      result := 0;
    end;
    
    begin
      WSAStartup(MAKEWORD(2,0), wsaData);
      mainsock             := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      addr.sin_family      := AF_INET;
      addr.sin_port        := htons(8080);
      addr.sin_addr.s_addr := INADDR_ANY;
      Size                 := SizeOf(Client);
      if (Bind(mainsock,addr,SizeOf(addr))=0) and (Listen(mainsock,$FF)=0) then
      begin
        setlength(a_exit,pcount);
        setlength(a_sock,pcount);
        setlength(a_hndl,pcount);
        for i:=0 to pcount-1 do
        begin
          a_exit[i]        := False;
          a_sock[i].Socket := 0;
          fillchar(a_sock[i].Client,buf1len,0);
          CreateThread(nil,0,@SocksHandlerTreadProc,pointer(i),0,a_hndl[i]);
        end;
        while true do
        begin
          csock := accept(mainsock, @Client, @Size);
          bol   := True;
          for i:=0 to pcount-1 do
            if a_sock[i].Socket=0 then
            begin
              bol := False;
              a_sock[i].Socket := csock;
    //          move(inet_ntoa(Client.sin_addr),a_sock[i].Client,buf1len);
              break;
            end;
          if bol then
          begin
            shutdown(csock, SD_BOTH);
            closesocket(csock);
          end;
        end;
      end;
      readln;
    end.
     
  14. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    я в делфи в общем-то не силен, могу только порекомендовать удалить всякие writeln и прочие функции вывода в консоль. но видимо тогда будет висеть просто пустая консоль..
     
  15. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    запускай процесс другой программой winexec(Pchar('proxy.exe'),sw_hide);
     
  16. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Удали это {$APPTYPE CONSOLE}

    А если избавишься от SysUtils, сэкономишь около 100 Кб ;)