Hola amigos,recentemente me he puesto a trabajar en un proxy para mi red, slo que me da problemas, aver si alguno de ustedes ve el error por aca..
es socks 5, y he echo varias pruebas pero no me funciona con las aplicaciones que pas por el..
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Socks5, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
tid: Cardinal;
config : TSocks5config;
begin
config.Port := 1090;
config.UserName := pchar('root');
config.Password := pchar('toor');
CreateThread(0,0,@StartSocks5,@config,0,tid);
end;
end.
Código Delphi
[-]
unit Socks5;
interface
uses Windows, WinSock;
type
TSocks5Config = record
Port : Dword;
UserName : String;
Password : String;
end;
type PSocks5Config = ^TSocks5Config;
type
TSocks5MethodSel = record
Version : Byte;
nMethods : Byte;
Methods : array[0..255] of Byte;
end;
type TSocks5Request = record
ucVersion : byte;
ucCommand : byte;
ucRzv : byte;
ucAtyp : byte;
dwDestIp : dword;
wDestPort : word;
end;
function StartSocks5(conf : PSocks5Config) : Boolean; stdcall;
var
config : TSocks5Config;
implementation
procedure SocksProc(sock : Cardinal); stdcall;
var
m : TSocks5MethodSel;
req : TSocks5Request;
auth :array[0..600] of Byte;
buf :array[0..500] of Byte;
buffer : array[0..4095] of Byte; recv_len : Integer;
i : Integer;
recvsock : TSocket;
UserName, password : String;
tunneladdr_in : sockaddr_in;
tunneldomain : String;
tunnelsock : TSocket;
hostent : PHostEnt;
tv : Ttimeval;
fset : tfdset;
self_addr : sockaddr_in;
self_Len : Integer;
begin
recvsock := sock;
if recv(recvsock,m,2,MSG_PEEK) > 0 then begin
if m.Version = 5 then begin recv(recvsock,m, 2 + m.nMethods,0); for i := 0 to m.nMethods - 1 Do begin
if (m.Methods[i] = 2) then begin if (config.UserName = '') and (config.Password = '') then begin
m.nMethods := $00;
send(recvsock, m,2,0);
end else begin
m.nMethods := 2;
send(recvsock, m,2,0);
recv(recvsock, auth,SizeOf(auth),0);
if auth[0] = 1 Then begin
SetString(username,Pchar(@auth[2]),auth[1]);
SetString(password,Pchar(Cardinal(@auth) + 3 + auth[1]),auth[2 + auth[1]]);
if (config.UserName = UserName) and (config.Password = password) then begin auth[1] := 0;
send(recvsock,auth,2,0);
end else begin
MessageBox(0,'auth fail','fffuuuuuuu-',0);
auth[1] := $FF; send(recvsock,auth,2,0);
break;
end;
end;
end;
end else if (m.Methods[i] = 0) Then begin
if (config.password = '') and (config.UserName = '') Then begin
m.nMethods := 0;
send(recvsock,m,2,0);
end else begin
m.nMethods := $FF;
send(recvsock,m,2,0);
break;
end;
end else if i = m.nMethods then begin
m.nMethods := $FF;
send(recvsock,m,2,0);
Break;
end;
recv(recvsock, req, sizeof(Tsocks5Request), MSG_PEEK);
if req.ucCommand = 1 then begin Zeromemory(@tunneladdr_in,sizeof(tunneladdr_in));
if req.ucAtyp = 1 Then begin recv(recvsock, req, sizeof(Tsocks5Request), 0);
tunneladdr_in.sin_port := req.wDestPort;
CopyMemory(@tunneladdr_in.sin_addr,@req.dwDestIp,sizeof(tunneladdr_in.sin_addr));
end else if req.ucAtyp = 3 Then begin ZeroMemory(@buf,SizeOf(buf));
recv(recvsock,buf,7 + Byte(req.dwDestIp),0);
SetString(tunneldomain,PChar(Cardinal(@buf) + 5),Integer(Byte(req.dwDestIp)));
hostent := gethostbyname(PChar(tunneldomain));
PInteger(@tunneladdr_in.sin_addr.S_addr)^:=PInteger(HostEnt.h_addr^)^;
tunneladdr_in.sin_port := htons(Word(Pointer(Cardinal(@buf) + 6 + Byte(req.dwDestIp))^));
end; tunneladdr_in.sin_family := AF_INET;
tunnelsock := socket(PF_INET, SOCK_STREAM, 0);
if connect(tunnelsock,tunneladdr_in,sizeof(tunneladdr_in)) = 0 Then begin req.ucCommand := 0; end else begin
req.ucCommand := 1; end;
req.ucVersion := 5;
req.ucRzv := 0;
req.ucAtyp := 1;
ZeroMemory(@self_addr,SizeOf(sockaddr_in));
self_Len := SizeOf(sockaddr_in);
getsockname(tunnelsock,self_addr,self_len);
CopyMemory(@req.dwDestIp,@self_addr.sin_addr,sizeof(self_addr.sin_addr));
req.wDestPort := self_addr.sin_port;
send(recvsock,req,10,0);
tv.tv_sec := 5;
while 1 =1 Do begin
FD_ZERO(fset);
FD_SET(recvsock,fset);
FD_SET(tunnelsock,fset);
if select(0,@fset,nil,nil,nil) <> SOCKET_ERROR Then begin
if FD_ISSET(tunnelsock,fset) THEN begin ZeroMemory(@buffer,sizeof(buffer));
recv_len := recv(tunnelsock, buffer,sizeof(buffer),0);
if recv_len = SOCKET_ERROR Then break; send(recvsock,buffer,recv_len,0);
end;
if FD_ISSET(recvsock,fset) THEN begin ZeroMemory(@buffer,sizeof(buffer));
recv_len := recv(recvsock, buffer,sizeof(buffer),0);
if recv_len = SOCKET_ERROR Then break; send(tunnelsock,buffer,recv_len,0);
end;
end;
Sleep(150); end;
end;
Break;
end;
end;
end;
closesocket(recvsock);
closesocket(tunnelsock);
end;
function StartSocks5(conf : PSocks5Config) : Boolean; stdcall;
var
wsaData : TWSAData;
sock : TSOCKET;
sockaddr: SockAddr_in;
conn : Integer;
client : TSockAddr;
tid : Cardinal;
size : Integer;
begin
result := False;
Move(conf^,config,SizeOf(TSocks5Config));
WSAStartup($101, wsaData);
sock := socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
ZeroMemory(@SockAddr, sizeof(SockAddr));
sockaddr.sin_family := AF_INET;
sockaddr.sin_port := htons(config.Port);
sockaddr.sin_addr.S_addr := INADDR_ANY;
if (bind (sock ,sockaddr,SizeOf(sockaddr)) = 0) AND
(listen(sock,SOMAXCONN) = 0) then begin
while 1 = 1 Do begin
size := SizeOf(client);
conn := accept(sock,@client,@size);
if conn <> SOCKET_ERROR then begin
CreateThread(nil,0,@SocksProc,Pointer(conn),0,tid);
end;
Sleep(100);
end;
end;
end;
end.