如何用DELPHI程序实现WINGATE的功能(难)(200分)

  • 主题发起人 主题发起人 SOFTWARE
  • 开始时间 开始时间
S

SOFTWARE

Unregistered / Unconfirmed
GUEST, unregistred user!
因项目需要,现需用DELPHI实现WINGATE的功能(HTTP,FTP,TELNET,SMTP,POP3,SOCK4、5 等等)。
请各位提供原理或思路,最好有例程。
如果哪位曾经做过,可考虑合作(分数,人民币都好商量)。
 
其实不算难,就是麻烦!!!!
几乎就是照着rfc做,目前我只实现了socks5的无密码代理就用了3天,现在我就用这种方法防oicq炸弹的,呵呵
对于http等的代理还没时间看!!要全部实现的话恐怕要几个月吧!
不过对于任何连接都可以用socks5代理,所以其它的也就可以不做了吧!

实现起来不算很难,定兼听端口,判断连接数据,再新增一个对外的client,使其和server上的thread关联,然后依据协议包装信息,然后发送就行了,接收同理

代理都是这种方法实现,关键在于依据协议包装信息,太麻烦了!!!
 
不用给钱,分就行.
你可以查看前三期的<<电脑报>>,上面连载三期的用DELPHI编代理服务器的文章.
希望有用.顺便提一下,那种方式只能做到WINGATE的代理方式,而象SYGATE那种网关型就不行,
你要是找到了不妨转告一声.
 
这样的东西,光要做出来不难,估计最多一个月了.
但是要完善,比较困难,就是通常说的健壮性,特别是用delphi做的话.
 
对呀《电脑报》上有这样的文章。
 
感谢各位的帮助,但问题依然存在,请继续发言。
timerri :你发能一个例程给我吗?让我看一下是怎么个麻烦,然后我们再探论。
hog: 为什么说完善比较困难?用DELPHI又有什么特别的问题吗?
Skyman ,fsm:是《电脑报》的第几期呀?
希望各位继续踊跃发言,谢谢。
 
电脑报29,30,31期,你想要的话去download电子版
 
急,急,急,
电脑报电子版的29和31期都有误(标题正确,内容不对)我该怎么办呀!
 
你等一下,我发给你!
 
开放源码啰,将究着看,别管这程序规不规范,反正实现了。我可没有做模块的好习惯呀!
用了winshoe的一套东西,本来准备是自己用,没考虑过要给大家看的~~~~~~
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Winshoes, serverwinshoe, StdCtrls, ServerWinshoeIRC, NMUDP,
ipwatchwinshoe, ComCtrls, Menus, ScktComp;

type
TForm1 = class(TForm)
Memo1: TMemo;
WinshoeListener1: TWinshowIRCListener;
NMUDP1: TNMUDP;
WinshoeIPWatch1: TWinshoeIPWatch;
ListView1: TListView;
PopupMenu1: TPopupMenu;
show1: TMenuItem;
ClientSocket1: TClientSocket;
Button1: TButton;
procedure WinshoeListener1Execute(Thread: TWinshoeServerThread);
procedure WinshoeListener1Disconnect(Thread: TWinshoeServerThread);
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure show1Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);

private
rr,s:integer;
thr:TWinshoeServerThread;
qqq:string; { Private declarations }
public
{ Public declarations }
end;
function iptoword(address:string):string;
var
Form1: TForm1;
procedure clopen;
implementation

{$R *.DFM}

procedure TForm1.WinshoeListener1Execute(Thread: TWinshoeServerThread);
var
ttt,qq:string; i:integer;
begin
//if thread.Connection.PeerAddress<>WinshoeIPWatch1.CurrentIP then thread.Terminate ;

ttt:=thread.Connection.ReadBuffer ;

if ttt=#5#1#0 then
begin
thread.Connection.Write(#5#0);
s:=2;
exit;
end;

if (s=3) and (thr=thread) then
begin

clientsocket1.Socket.SendText(ttt);
//ttt:=copy(ttt,11,length(ttt)-10);
for i:=1 to length(ttt) do
begin
qq:=qq+inttohex(ord(ttt),2)+' ';
end;
memo1.Lines.Add('sending: '+qq);
exit;
end;

if s<2 then exit;
thread.Connection.Write(#5#0#0#1#192#168#0#1#4#0);
s:=1 ;
if ttt[2]=#1 then
begin
clientsocket1.host:=inttostr(ord(ttt[5]))+'.'+inttostr(ord(ttt[6]))+'.'+inttostr(ord(ttt[7]))+'.'+inttostr(ord(ttt[8]));
clientsocket1.Port:= ord(ttt[9])*256+ord(ttt[10]);
ClientSocket1.Active := False;
clopen;
memo1.Lines.add( clientsocket1.host+':'+inttostr(clientsocket1.Port));
thr:=thread;
s:=3
end;
end;

procedure TForm1.WinshoeListener1Disconnect(Thread: TWinshoeServerThread);
begin
thread.Terminate;
end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream,mmm,www: TMemoryStream;
TmpStr,qq: String;i:integer;
begin
MyStream := TMemoryStream.Create;
try
NMUDP1.ReadStream(MyStream);
SetLength(TmpStr,NumberBytes);
MyStream.Read(TmpStr[1],NumberBytes);

if fromip='192.168.0.1' then
begin
rr:=port;
if tmpstr[4]=#3 then
begin

nmudp1.RemoteHost :=copy(tmpstr,6,ord(tmpstr[5]));
qqq:=copy(tmpstr,1,7+ord(tmpstr[5]));
qq:=copy(tmpstr,8+ord(tmpstr[5]),NumberBytes-8-ord(tmpstr[5])+1);
mmm:=Tmemorystream.Create;
mmm.Write(tmpstr[8+ord(tmpstr[5])],NumberBytes-8-ord(tmpstr[5])+1);
nmudp1.RemotePort :=ord(tmpstr[6+ord(tmpstr[5])])*256+ord(tmpstr[7+ord(tmpstr[5])]);
nmudp1.SendStream (mmm);
tmpstr:=qq;
qq:='';
for i:=1 to NumberBytes do
begin
qq:=qq+inttohex(ord(tmpstr),2)+' ';
end;
listview1.Items.insert(0);
listview1.TopItem.Caption:=fromip;
listview1.TopItem.SubItems.add(inttostr(port));
listview1.TopItem.SubItems.add(nmudp1.RemoteHost);
listview1.TopItem.SubItems.add(inttostr(nmudp1.RemotePort));
listview1.TopItem.SubItems.add (qq);
listview1.TopItem.SubItems.add(tmpstr);
end
else
begin
nmudp1.RemoteHost :=inttostr(ord(tmpstr[5]))+'.'+inttostr(ord(tmpstr[6]))+'.'+inttostr(ord(tmpstr[7]))+'.'+inttostr(ord(tmpstr[8]));
qqq:=copy(tmpstr,1,10);

mmm:=Tmemorystream.Create;
mmm.Write(tmpstr[11],NumberBytes-10);
nmudp1.RemotePort :=ord(tmpstr[9])*256+ord(tmpstr[10]);
tmpstr:=copy(tmpstr,11,NumberBytes-10);
nmudp1.SendStream (mmm);
qq:='';
for i:=1 to length(tmpstr) do
begin
qq:=qq+inttohex(ord(tmpstr),2)+' ';
end;
listview1.Items.insert(0);
listview1.TopItem.Caption:=fromip;
listview1.TopItem.SubItems.add(inttostr(port));
listview1.TopItem.SubItems.add(nmudp1.RemoteHost);
listview1.TopItem.SubItems.add(inttostr(nmudp1.RemotePort));
listview1.TopItem.SubItems.add (qq);
listview1.TopItem.SubItems.add(tmpstr);

end;

end
else
begin
nmudp1.RemoteHost :='127.0.0.1';
nmudp1.RemotePort :=rr;
for i:=1 to NumberBytes do
begin
qq:=qq+inttohex(ord(tmpstr),2)+' ';
end;
listview1.Items.insert(0);
listview1.TopItem.Caption:=fromip;
listview1.TopItem.SubItems.add(inttostr(port));
listview1.TopItem.SubItems.add(nmudp1.RemoteHost);
listview1.TopItem.SubItems.add(inttostr(nmudp1.RemotePort));
listview1.TopItem.SubItems.add (qq);
listview1.TopItem.SubItems.add(tmpstr);
www:=Tmemorystream.Create;
tmpstr:=#0#0#0#1+iptoword(fromip)+chr(port div 256)+chr(port mod 256)+tmpstr;
www.Write(tmpstr[1],length(tmpstr));
nmudp1.SendStream (www);
qq:='';

end;

finally
MyStream.Free;mmm.free;
end;
end;

function iptoword(address:string):string;
var s1:array [0..3] of word;
s2,s3:string;i,j:integer; s4:longword;
begin
s2:=address;
j:=0;
s3:='';
for i:=1 to length(s2) do
begin
if s2<>'.' then
begin
s3:=s3+s2;
end
else
begin
s1[j]:=strtoint(s3);
s3:='';
j:=j+1;
end;
end;
s1[j]:=strtoint(s3);
s4:=((s1[0]*256+s1[1])*256+s1[2])*256+s1[3];
iptoword:=chr(s1[0])+chr(s1[1])+chr(s1[2])+chr(s1[3]);
end;


procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
var tmpstr,qq:string;i:integer;
begin
tmpstr:=item.SubItems.Strings[4];
qq:='';
for i:=1 to length(tmpstr) do
begin
qq:=qq+inttohex(ord(tmpstr),2)+' ';
end;
//memo1.Lines.Add(qq+'333333333');
end;

procedure TForm1.show1Click(Sender: TObject);
var tmpstr,qq:string;i:integer;
begin
tmpstr:= listview1.Selected.SubItems.Strings[4];
qq:='';
for i:=1 to length(tmpstr) do
begin
qq:=qq+inttohex(ord(tmpstr),2)+' ';
end;
memo1.Lines.Add(qq);


end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
thr.Connection.Write (socket.ReceiveText);
memo1.Lines.Add('accept');
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add('connect');
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add('send');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Active :=true;
end;
procedure clopen;
begin
form1.ClientSocket1.Open;
end;
end.
 
timerri :
winshoe是什么东东,哪儿可下载?
如果方便可否Mail to me.
 
哇,这么久了还没搞定?
要不要电子版的3期chm文件?

就这话谈远一点:哪位能做到sygate那样做网关的代理软件,我也要求帮助!!!
 
winshoe在chinaasp的delphi栏目里有,不过他可不实现socks server的功能哟!

我这个东西看懂就行了
反正就那么一点

网关级代理用delphi恐怕是不成了
学汇编呀!
 
呵呵,网关一级的代理阿?不是你们想的那么难,不过是有一点技巧而已。
呵呵,简单,简单。呵呵
 
weck:
别光说“简单,简单”呀,给一些建议可以吗?技巧?什么技巧呀?
各位:
HTTP 照电脑报可以,可POP3邮件、OICQ等怎么搞?
 
电脑报29期的内容好像不是代理服务器的
是串口通讯的!
 
呵呵,如果你要做一个http,ftp一类的代理,好说。大概的思路就是象上面
电脑报里面说的一样。
如果是要做winsock的代理,通行的办法(包括ms proxy server,wingate)都是
在客户端用自己的win sock替代系统原来的winsock.dll,把原来的改名,相当于
封装了系统的winsock.并且用一个udp包向服务器端发消息,请求一个连接端口
这样,client的sock连接,就通过一个channel,连接到服务器的一个制定的端口
上了。ok.:)思路是这样的,我没有写代码。
 
多人接受答案了。
 
后退
顶部