⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxy2.pas

📁 httpanalyzer, source code for delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  else result:=p;
end;

function TProxyClient.On_P2_DataAvailable(p : pointer; VAR s : longint) : pointer;
begin;
  if Assigned(Proc_P2_DataReceived) then begin
      LockEvents.Acquire;
      try
       result:=Proc_P2_DataReceived(self,run_nr,p,s);
      finally
       LockEvents.Release;
      end;
  end
  else result:=p;
end;

procedure TProxyClient.On_P1_dbgout(p: pchar);
begin;
  if Assigned(Proc_P1_DbgOut) then begin;
      LockEvents.Acquire;
      try Proc_P1_DbgOut(self,p);
      finally LockEvents.Release; end;
  end;
end;

procedure TProxyClient.On_P2_dbgout(p: pchar);
begin;
    if Assigned(Proc_P2_DbgOut) then begin;
        LockEvents.Acquire;
        try Proc_P2_DbgOut(self,p);
        finally LockEvents.Release; end;
    end;
end;

procedure TProxyClient.On_VIP_dbgout(p: pchar);
begin;
    if Assigned(Proc_VIP_DbgOut) then begin;
        LockEvents.Acquire;
        try Proc_VIP_DbgOut(self,p);
        finally LockEvents.Release; end;
    end;
end;

procedure TProxyClient.before_work;
begin;
  //  if connectiontype=connect2sameproxy then begin;
      On_p2_dbgout(Pchar('Tries to connect to : '+dest_addr+' at Port:'+dest_port));
      got_addr:=true;
      FP2Socket.addr:=dest_addr;
      FP2Socket.Port:=dest_port;
      Do_Connect2;
  //  end;
end;

procedure TProxyClient.after_work;
begin;

end;


constructor TProxyClient.Create;
begin
    running_nr:=running_nr+1;
    run_nr:=running_nr;
    
close_p1_after_send:=false;
   del1:=true; del2:=true; del3:=true; del4:=true;
    LastTransmission:=-1;
    anyrec:=false;
    buf_p :=nil;
    buf_s :=0;
    buf_init := false;

    dest_addr := '0.0.0.0';
    dest_port := '80';
    dest_proto:= DC_TCP;
    
    already:=false;
    connected:=false;
    got_addr:=false;

    connectiontype := connect2net;
    proc_vip_dbgout:=nil;

    socksAuthentication := SocksNoAuthentication;
    socksLevel:='5';
    socksPassword:='';
    socksPort:='1080';
    socksServer:='';
    socksUserCode:='';

    (*
    ftp_ready:=false;

    tunnel_type:=255;


    proxy2_addr:='0.0.0.0';
    proxy2_port:='1';

    FP1HSocket  := P1HSocket; *)
    FreeOnTerminate := TRUE;
    inherited Create(TRUE);
end;


procedure TProxyClient.Release;
begin
   on_vip_dbgout('Release-> send WM_Quit');
   if Assigned(FP1Socket) then
    PostMessage(FP1Socket.Handle, WM_QUIT, 0, 0);
end;

procedure TProxyClient.P1_SessionClosed(
    Sender: TObject; Error: Word);
begin
LastTransmission:=-1;
On_p1_dbgout(Pchar('P1 Closed : '+WSocketErrorDesc(error)));
(*if error<>0 then begin;
  Do_Send1str('P1 Closed : '+WSocketErrorDesc(error));
end; *)
if already=false then begin;
 already:=true;
 On_p1_dbgout(Pchar('Schlie遝 nun P2 : '));
 if Assigned(FP2Socket) then begin
 // Do_p1_dbgout(Pchar('da sam ma '+state2text(FP2Socket.state)));

  if FP2Socket.state=wsconnected then Fp2Socket.close
  else begin
    On_p1_dbgout(Pchar('P2 gar nicht connected => Send WM_Quit now '));
    PostMessage(FP1Socket.Handle, WM_QUIT, 0, 0);
  end;

 end
 else begin
  On_p1_dbgout(Pchar('P2 gar nicht zugewiesen => Send WM_Quit now '));
  PostMessage(FP1Socket.Handle, WM_QUIT, 0, 0);
 end;

end
else begin
 On_p1_dbgout(Pchar('Send WM_Quit'));
 PostMessage(FP1Socket.Handle, WM_QUIT, 0, 0); // Der letze Socket der geschlossen
 // wird beendet erst den Thread
end;

end;


procedure TProxyClient.P1_Error(Sender: TObject);
var i : integer;
begin;
 i:= WSAGetLasterror;
 connected:=false;
 On_p1_dbgout(Pchar('P1 Error : '+WSocketErrorDesc(i)));
  if FP2Socket.state=wsconnected then begin
    On_p2_dbgout(Pchar('wg P1 Error  => P2 wird closed'));
    already:=true;
    FP2Socket.close;
   end else begin
     On_p1_dbgout(Pchar('wg P1 Error  => Send WM_Quit'));
     PostMessage(FP1Socket.Handle, WM_QUIT, 0, 0);
   end;


end;

procedure TProxyClient.P1_BgException(Sender: TObject; E: Exception; var CanClose: Boolean);
begin;
 connected:=false;
 On_p1_dbgout(Pchar('P1 BgException : '+E.message));
 Canclose:=true;
end;



destructor TProxyClient.Destroy;
begin
    On_vip_dbgout('Destroy Client Thread');
    if Assigned(FP1Socket) then begin
         FP1Socket.Destroy;
         FP1Socket := nil;
    end;
    if Assigned(FP2Socket) then begin
         FP2Socket.Destroy;
         FP2Socket := nil;
    end;
    inherited Destroy;
end;


procedure TProxyClient.close;
begin;
end;

procedure TProxyClient.pause;
begin;
end;

procedure TProxyClient.resume;
begin;
 inherited resume;
end;



procedure TProxyClient.execute;
(*var
    Peer       : String; *)
begin


    FP1Socket                 := TWSocket.Create(nil);
    FP1Socket.proto:=DC_TCP;
    FP1Socket.HSocket         := FP1HSocket;
    FP1Socket.OnDataAvailable := P1_DataAvailable;
    FP1Socket.OnDataSent      := p1_Datasent;
    FP1Socket.OnSessionClosed := P1_SessionClosed;
    FP1Socket.OnError := P1_Error;
    Fp1Socket.OnBgException:= P1_BgException;

    { Wants to know who is connected to display on screen }
    FP1Socket.GetPeerName(client_ip, Sizeof(client_ip));

    { User likes to see internet address in dot notation }
    Peer := IntToStr(ord(client_ip.sin_addr.S_un_b.s_b1)) + '.' +
            IntToStr(ord(client_ip.sin_addr.S_un_b.s_b2)) + '.' +
            IntToStr(ord(client_ip.sin_addr.S_un_b.s_b3)) + '.' +
            IntToStr(ord(client_ip.sin_addr.S_un_b.s_b4));
    On_P1_dbgout(PCHAR('Remote ' + Peer + ' connected'));

    FP2Socket := TWSocket.Create(nil);
    FP2Socket.proto:=DC_TCP;
    FP2Socket.OnSessionConnected := P2_SessionConnected;
    FP2Socket.OnDataAvailable := P2_DataAvailable;
    FP2Socket.OnSessionClosed := P2_SessionClosed;
    FP2Socket.OnDataSent := P2_DataSent;
    Fp2Socket.OnError := P2_Error;
    Fp2Socket.OnBgException:= P2_BgException;
    //NEW: 25.6.200
    fp2Socket.SocksAuthentication:=socksAuthentication;
    fp2socket.sockslevel:=socksLevel;
    fp2socket.sockspassword:=sockspassword;
    fp2socket.socksport:=socksport;
    fp2socket.socksserver:=socksserver;
    fp2socket.socksusercode:=socksusercode;


    before_work;

    FP1Socket.MessageLoop;

    after_work;

    if buf_init=true then begin;
      if (buf_p<>nil) and (buf_s>0) then freemem(buf_p,buf_s);
    end;
    ReturnValue := 0;
    On_vip_dbgout('returning from Clientthread.execute=> Onterminate now');
end;

procedure TProxyClient.P2_SessionConnected(Sender: TObject; Error: Word);
begin;
On_p2_dbgout(Pchar('P2 Connected : '+WSocketErrorDesc(error)));

if error<>0 then begin;
  Do_Send1str('P2 Connected : '+WSocketErrorDesc(error));
  exit;
end;

connected:=true;
if buf_init=true then begin;
 //if tunnel_type<>typ_ftp_proxy then begin;   //BEI FTP DEN BUFFER NOCH NICHT GLEICH SENDEN!!

  On_p2_dbgout(Pchar('P2 Buffer ('+inttostr(buf_s)+' sent (frm SessionConnected): '));
  Do_Send2(buf_p,buf_s);
  freemem(buf_p,buf_s);
  buf_p:=nil;
  buf_s:=0;
  buf_init:=false;
// end;

end;
end;


// in die Routinen p2_error, p2_bgexception, p2_datasent, p2_sessionclosed
// noch f黵 Http Mode ein entsprechende Fehlerr點kmeldungsseite einbauen!

procedure TProxyClient.P2_Error(Sender: TObject);
var i : integer;
begin;
 i:= WSAGetLasterror;
 connected:=false;
 On_p2_dbgout(Pchar('P2 Error : '+WSocketErrorDesc(i)));
// Do_Send1str('P2 Error : '+WSocketErrorDesc(i));
 if i=WSAHOST_NOT_FOUND  then begin;
   //Do_p2_dbgout('gaga');
   if FP1Socket.state=wsconnected then begin
    On_p2_dbgout(Pchar('wg P2 Error  => P1 wird closed'));
    already:=true;
    FP1Socket.close;
   end else begin
     On_p2_dbgout(Pchar('wg P2 Error  => Send WM_Quit'));
     PostMessage(FP1Socket.Handle, WM_QUIT, 0, 0);
   end;
 //  FP2Socket.abort;
 //  FP2Socket.close;


 end;
end;

procedure TProxyClient.P2_BgException(Sender: TObject; E: Exception; var CanClose: Boolean);
begin;
 connected:=false;
 On_p2_dbgout(Pchar('P2 BgException : '+E.message));
 Canclose:=true;
 Do_Send1str('P2 BgException : '+E.message);
 FP2Socket.close;
end;


procedure TProxyClient.P2_DataSent(Sender: TObject; Error: Word);
begin;
On_p2_dbgout(Pchar('P2 Data Sent : '+WSocketErrorDesc(error)));
if error<>0 then begin;
  Do_Send1str('P2 Data Sent : '+WSocketErrorDesc(error));
  exit;
end;
lasttransmission:=gettickcount;
end;

procedure TProxyClient.P2_SessionClosed(Sender: TObject; Error: Word);
begin;
On_p2_dbgout(Pchar('P2 Closed : '+WSocketErrorDesc(error)));
if error<>0 then begin;
  Do_Send1str('P2 Closed : '+WSocketErrorDesc(error));
end;
if already=false then begin;
 if fp1socket.allsent=true then begin

 already:=true;
 On_p2_dbgout(Pchar('Schlie遝 nun P1..'));
 if Fp1Socket.state=wsconnected then Fp1Socket.closedelayed
 else begin
  On_p2_dbgout(Pchar('P1 gar nicht connected => Send WM_Quit now '));
  sleep(10); // hoffe des f鋖lt nicht ins Gewicht!! bzgl. DDE
  PostMessage(FP2Socket.Handle, WM_QUIT, 0, 0);
  //FP2Socket.Closedelayed;
 end;

 end
 else close_p1_after_send:=true;

end
else begin;
  On_p2_dbgout(Pchar('Send WM_Quit'));
  PostMessage(FP2Socket.Handle, WM_QUIT, 0, 0); // Der letze Socket der geschlossen
 // wird beendet erst den Thread
  //FP2Socket.Closedelayed;
 end;
end;





procedure TProxyClient.look4addr;
begin;

end;

procedure TProxyClient.P1_DataAvailable(
    Sender: TObject;
    Error: Word);
var
    Buffer : array [0..4095] of char;
    Count  : Integer;

    new_bufp : pointer;
    new_bufs : longint;

    new_data : pointer; //Daten nach dem sie ueber die Handlerfunktion ver鋘dert werden kann
    new_size : longint;
begin
    { Receive as much data as possible                                      }
    Count := FP1Socket.Receive(@Buffer, SizeOf(Buffer)-1);

    //NEU04
    //copy buffer to new memory space
    new_size:=count;
    getmem(new_data,count);
    mem_copy(new_data,@buffer, count);

    new_data:=On_P1_DataAvailable(new_data,new_size);
    (*wird ein Handler von User implementiert muss dieser den alten Speicher manuell
     freigeben; modifizieren und neuen belegen *)


    { If data received, then process it                                     }
    if new_size > 0 then begin
        On_P1_dbgout(Pchar('P1 Data received ('+inttostr(new_size)+' Bytes'));
       // buffer[count]:=#0;
      //  Do_P1_dbgout(buffer);

        if (connected=false)  then begin;
          On_P1_dbgout('P1 not yet connected => write in Sendbuf');
          if buf_init=false then begin
            On_P1_dbgout('P1 INIT SENDBUF');
            getmem(buf_p,new_size);
            mem_copy(buf_p,new_data, new_size);
            buf_init:=true;
            buf_s:=new_size;
          end
          else begin
            On_P1_dbgout('P1 ADD TO SENDBUF');
            new_bufp:=mem_cat(buf_p,buf_s,new_data,new_size,  new_bufs);
            freemem(buf_p,buf_s);

            getmem(buf_p,new_bufs);

            buf_s:=new_bufs;
            mem_copy(buf_p,new_bufp,buf_s);

            freemem(new_bufp, new_bufs);
          end;

        end;
        if got_addr=false then begin;

           look4addr;

           // wenn gefunden dann Do_Connect2; exit;
        end;

        if connected=true then begin;

           Do_Send2(new_data,new_size);

        end;
    end;
    if ((new_data<>nil) and (new_size>0)) then freemem(new_data,new_size);
end;


procedure TProxyClient.P2_DataAvailable(Sender: TObject; Error: Word);

var
    Buffer : array [0..4095] of char;
    Count  : Integer;

    new_data : pointer; //Daten nach dem sie ueber die Handlerfunktion ver鋘dert werden kann
    new_size : longint;
begin
    lasttransmission:=gettickcount;
    anyrec:=true;
    { Receive as much data as possible                                      }
    Count := FP2Socket.Receive(@Buffer, SizeOf(Buffer)-1);

    //NEU04
    //copy buffer to new memory space
    new_size:=count;
    getmem(new_data,count);
    mem_copy(new_data,@buffer, count);

    new_data:=On_P2_DataAvailable(new_data,new_size);
    (*wird ein Handler von User implementiert muss dieser den alten Speicher manuell
     freigeben; modifizieren und neuen belegen *)

    { If data received, then process it                                     }
    if new_size > 0 then begin;


      On_P2_dbgout(Pchar('P2 Data received ('+inttostr(new_size)+' Bytes)'));
     // buffer[count]:=#0;
     // Do_P2_dbgout(buffer);

      if Fp1Socket.State=wsconnected then begin;
         Do_Send1(new_data,new_size);
      end;

    end;
    if ((new_data<>nil) and (new_size>0)) then freemem(new_data,new_size);
end;



procedure TProxyClient.P1_DataSent(Sender: TObject; Error: Word);
begin;
On_p1_dbgout(Pchar('P1 Data Sent : '+WSocketErrorDesc(error)));
if close_p1_after_send= true then begin;
 On_p2_dbgout(Pchar('DataSent.Schlie遝 nun P1..'));
 if Fp1Socket.state=wsconnected then Fp1Socket.closedelayed
 else begin
  On_p2_dbgout(Pchar('DataSent.P1 gar nicht connected => Send WM_Quit now '));
  PostMessage(FP2Socket.Handle, WM_QUIT, 0, 0);
 end;
end;

end;

initialization
  LockEvents:=TCriticalSection.Create

finalization
  LockEvents.Destroy;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -