高分求Socks5代理源代码! 我给2000分!!!

gj333 2002-12-29 01:35:14
高分求Socks5代理源代码! 我给2000分!!!

如果有者请给我发邮件!

03251982@163.com

...全文
333 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
david_chen 2003-01-08
function TFormSocks.socksconnect(skt: TSocket; target: TSockAddr): boolean;
var
buf:array[0..1023]of byte;
re:integer;
begin
//preapre
buf[0] := SOCKS_VER5;
buf[1] := CMD_CONNECT;
buf[2] := RSV_DEFAULT;
buf[3] := ATYP_IPV4;
//copy data
copymemory(@buf[4],@target.sin_addr,4);
copymemory(@buf[8],@target.sin_port,2);
//communicate
re:=send(skt,buf,10,0);
if re=-1 then
begin
result:= false;
exit;
end;
re :=recv(skt,buf,1024,0);
if re=-1 then
begin
result:=false;
exit;
end;
if buf[1]<>REP_SUCCESS then
begin
result:=false;
exit;
end;
result:=true;
end;

function TFormSocks.Auth(skt: tsocket; bauth: byte): boolean;
var
buf:array[0..256]of byte;
re:integer;
i:integer;
usr:pchar;
pwd:pchar;
begin
getmem(usr, length(edit5.text)+1);
zeromemory(usr, length(edit5.text)+1);
strpcopy(usr,edit5.text);

getmem(pwd, length(edit6.text)+1);
zeromemory(pwd, length(edit6.text)+1);
strpcopy(pwd,edit6.text);
case bauth of
AUTH_NO:
begin
buf[0] := SOCKS_VER5;
buf[1] := $01;
buf[2] := $00;
re := send(skt, buf, 3, 0);
if re=-1 then
begin
result:=false;
exit;
end;
re:=recv(skt,buf,257,0);
if re<2 then
begin
result:=false;
exit;
end;
if buf[1]<>AUTH_NO then
begin
result:=false;
exit;
end;
result:=true;
end;
AUTH_REQU:
begin
buf[0] := SOCKS_VER5;
buf[1] := $02;
buf[2] := $00;
buf[3] := $02;
re := send(skt, buf, 4, 0);
if (re=-1)then
begin
result:=false;
exit;
end;
ZeroMemory(@buf,257);
re := recv(skt, buf, 257, 0);
if (re < 2) then
begin
result:=false;
exit;
end;
if (buf[1] <> AUTH_REQU) then
begin
result:=false;
exit;
end;
zeromemory(@buf,257);

buf[0] := $01; //current version of subnegotiation
buf[1] := length(edit5.text); //length of username
for i:=0 to buf[1]-1 do
buf[2+i]:=ord(usr[i]);
buf[2+length(edit5.text)]:=length(edit6.text);
for i:=0 to buf[2+length(edit5.text)]-1 do
buf[3+length(edit5.text)+i]:=ord(pwd[i]);
re := send(skt, buf,length(edit5.text)+length(edit6.text)+3,0);
if (re=-1) then
begin
result:=false;
exit;
end;
re := recv(skt, buf, 257, 0);
if (buf[1] <> $00) then
begin
result:=FALSE;
exit;
end;
result:= TRUE;
end;

else
result:=false;
end;



freemem(usr);
freemem(pwd);
end;

end.
回复
david_chen 2003-01-08
eg:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,winsock;
const
SOCKS_VER5=$04;

AUTH_NO=$00 ;//no authentication required
AUTH_REQU=$02 ;//method=0x02: username/password

CMD_CONNECT=$01 ;
RSV_DEFAULT=$00 ;
ATYP_DN=$03 ;
REP_SUCCESS=$00;
ATYP_IPV4=$01;

type
TFormSocks = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
CheckBox1: TCheckBox;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Edit4: TEdit;
btnConnect: TButton;
Memo1: TMemo;
Label5: TLabel;
Label6: TLabel;
Edit5: TEdit;
Label7: TLabel;
Edit6: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnConnectClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function socksconnect(skt:TSocket;target:TSockAddr):boolean;
function Auth(skt:tsocket;bauth:byte):boolean;
end;

var
FormSocks: TFormSocks;

implementation

{$R *.DFM}

procedure TFormSocks.FormCreate(Sender: TObject);
begin
//update view
Memo1.Lines.Clear;
Edit1.Text:='192.168.3.254';
Edit2.Text:='1080';
Edit3.Text:='211.159.67.28';
Edit4.Text:='32320';
// Edit5.Text:='';
// Edit6.Text:='';
Edit6.PasswordChar:='*';
end;

procedure TFormSocks.FormShow(Sender: TObject);
var
WSAData:TWSAData;
begin
//init Socket
if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then
begin
//初始化失败
Memo1.lines.add('Init Failed');
exit;
end
else
Memo1.lines.add('Init Success');
end;

procedure TFormSocks.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//release winsock
WSACleanUP();
end;

procedure TFormSocks.btnConnectClick(Sender: TObject);
var
clisock:TSocket;
tarsocksrv:TSockAddr;
saproxy:TSockAddr;
pSocksAddr:PChar;
Re:integer;
ErrCode:Integer;
AuthSucc:boolean;
ConSucc:boolean;
begin
//1.create a client socket
Memo1.Lines.Add('Creating a socket');
clisock:=socket(AF_INET,SOCK_STREAM,0);
//valid check
if(clisock=INVALID_SOCKET) then
begin
Memo1.lines.Add('Error on create socket');
Exit;
end;
Memo1.Lines.add('Success on create socket');
//2.connect to socks5 server
Memo1.lines.Add('Connecting to socks server');
ZeroMemory(@saproxy,sizeof(saproxy));
saproxy.sin_family := AF_INET;
//set proxy infomation
GetMem(pSocksAddr,Length(Edit1.Text)+1);
ZeroMemory(pSocksAddr,Length(Edit1.Text)+1);
StrPCopy(pSocksAddr,Edit1.Text);
saproxy.sin_addr.S_addr :=inet_addr(pSocksAddr);
FreeMem(pSocksAddr);
saproxy.sin_port := htons(strtoint(Edit2.Text));
Re:=connect(clisock,saproxy,sizeof(saproxy));
if Re = SOCKET_ERROR then
begin
ErrCode:=WSAGetLastError();
Memo1.Lines.Add('Err on Connect to socks5 Errcode:'
+IntToStr(ErrCode));
Exit;
end;
Memo1.Lines.Add('Connect to socks5 server success');
//3.prepare Auth
Memo1.Lines.Add('Enter Auth');
/////////////////////////////

if CheckBox1.Checked then
AuthSucc:=Auth(clisock,AUTH_REQU)
else
AuthSucc:=Auth(clisock,AUTH_NO);
if not AuthSucc then
begin
Memo1.Lines.Add('Auth Failed');
Memo1.Lines.Add('Close socket');
CloseSocket(clisock);
Exit;
end;
Memo1.Lines.Add('Auth finish');

/////////////////////
//4. link to target
Memo1.Lines.Add('Link to target ip');
ZeroMemory(@tarsocksrv,Sizeof(tarsocksrv));
//prepare
Getmem(psocksaddr,length(edit3.text)+1);
zeromemory(psocksaddr,length(edit3.text)+1);
strpcopy(psocksaddr,edit3.text);
tarsocksrv.sin_addr.s_addr := inet_addr(pSocksAddr);
tarsocksrv.sin_port := htons(strtoint(edit4.text));
tarsocksrv.sin_family := AF_INET;
//connect
consucc:=socksconnect(clisock,tarsocksrv);
if consucc then
memo1.Lines.Add('conncct succ')
else
memo1.Lines.add('failed');
//5 use this socket pipe to communicat
//recv(clisock,buf,127,0);


//close socket
Memo1.lines.Add('Closing socket');
Re:= closesocket(clisock);

//shutdown(clisock,SD_BOTH);
end;
回复
lovejingtao 2003-01-07
http://tty-1.51.net/cjt/Socket5ProxyDemo.htm
回复
qly_1314 2003-01-07
我也想知道~~~~
回复
Jiasong 2003-01-07
delphi 的demo程序有Socks5代理源代码
回复
lovejingtao 2003-01-07
服务器正在搬迁,最近几天可能无法访问.
包括SOCKET5代理服务器教程,如何编写代理程序等等内容.
回复
lovejingtao 2003-01-06
http://tty.yyun.net/lovejingtao/htm/olddefault.htm
回复
zhxk32899559 2003-01-02
http://tty.yyun.net/lovejingtao/htm/olddefault.htm
回复
gxh973121 2003-01-01
我有源码
回复
gj333 2002-12-30
ffff
回复
warton 2002-12-29
有很我代理是开源的!!不过是e文
回复
gj333 2002-12-29
找到这些工作原理,但是想要完整源代码

sock5代理的工作程序是:

1。需要代理方向服务器发出请求信息。

2。代理方应答

3。需要代理方接到应答后发送向代理方发送目的ip和端口

4。代理方与目的连接

5。代理方将需要代理方发出的信息传到目的方,将目的方发出的信息传到需要代理方。代理完成

由于网上的信息传输都是运用tcp或udp进行的,所以使用socks5代理可以办到网上所能办到的一切,而且不舆目的方会查到你的ip,既安全又方便

sock5支持UDP和TCP,但两种代理是有区别的,以下分类说明

如何用代理TCP协议

1。向服务器的1080端口建立tcp连接。

2。向服务器发送 05 01 00 (此为16进制码,以下同)

3。如果接到 05 00 则是可以代理

4。发送 05 01 00 01 + 目的地址(4字节) + 目的端口(2字节),目的地址和端口都是16进制码(不是字符串)。
例202.103.190.27 - 7201
则发送的信息为:05 01 00 01 CA 67 BE 1B 1C 21
(CA=202 67=103 BE=190 1B=27 1C21=7201)

5。接受服务器返回的自身地址和端口,连接完成

6。以后操作和直接与目的方进行TCP连接相同。

如何用代理UDP连接

1。向服务器的1080端口建立tcp连接

2。向服务器发送 05 01 00

3。如果接到 05 00 则是可以代理

4。发送 05 03 00 01 00 00 00 00 + 本地UDP端口(2字节)

5。服务器返回 05 00 00 01 +服务器地址+端口

7.需要申请方发送
00 00 00 01 +目的地址IP(4字节)+目的端口 +所要发送的信息

8。当有数据报返回时
向需要代理方发出00 00 00 01 +来源地址IP(4字节)+来源端口 +接受的信息



注:此为不需要密码的代理协议,只是socks5的一部分,完整协议请看RFC1928
回复
warton 2002-12-29
网上搜索一下吧!!
回复
发动态
发帖子
网络通信/分布式开发
创建于2007-08-02

1565

社区成员

Delphi 网络通信/分布式开发
申请成为版主
社区公告
暂无公告