Перехват http заголовков

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kak, 1 Dec 2010.

  1. kak

    kak New Member

    Joined:
    30 Nov 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Всем доброго времени суток.

    Как лучше перехватывать хтпп заголовки если мой модуль уже загружен в браузер?

    Вот немного когда из библиотеки:
    Code:
    library whost;
    
    
    uses
      SysUtils,
      Classes,Winsock2,Windows,AdvAPIHOOK;
    
      var
      _zBuffer:String;
            LST:TStringList;
      //------------------------------------------------------------------------------//
      OldWsaSend: function ( s : TSocket;
       lpBuffers : LPWSABUF;
       dwBufferCount : DWORD;
       var lpNumberOfBytesSent : DWORD;
       dwFlags : DWORD;
       lpOverlapped : LPWSAOVERLAPPED;
       lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
      //------------------------------------------------------------------------------//
      OldWsaRecv: function ( s : TSocket;
       lpBuffers : LPWSABUF;
       dwBufferCount : DWORD;
       var lpNumberOfBytesRecvd : DWORD;
       var lpFlags : DWORD;
       lpOverlapped : LPWSAOVERLAPPED;
       lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
      //------------------------------------------------------------------------------//
    
      Function NewWsaSend( s : TSocket;lpBuffers : LPWSABUF;dwBufferCount : DWORD;var lpNumberOfBytesSent : DWORD;dwFlags : DWORD;lpOverlapped : LPWSAOVERLAPPED;lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
            begin
                asm
                pushad
                end;
              _zBuffer:=_zBuffer+copy(lpbuffers.buf,0,length(lpBuffers.buf));
                LST:=TStringList.Create;
               LST.Add(_zBuffer);
                 LST.SaveToFile('Send.txt');
              LST.Free;
              if _zBuffer <> ''  then
               Result:=1 else Result:=-1;
               asm
                popad
                end;
            end;
       //------------------------------------------------------------------------------//
         Function NewWsaRecv( s : TSocket;lpBuffers : LPWSABUF;dwBufferCount : DWORD;var lpNumberOfBytesSent : DWORD;dwFlags : DWORD;lpOverlapped : LPWSAOVERLAPPED;lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
            begin
              asm
                pushad
                end;
              _zBuffer:=_zBuffer+copy(lpbuffers.buf,0,length(lpBuffers.buf));
                LST:=TStringList.Create;
               LST.Add(_zBuffer);
                 LST.SaveToFile('Recv.txt');
              LST.Free;
             if _zBuffer <> ''  then
               Result:=1 else Result:=-1;
               asm
               popad
               end;
            end;
          //------------------------------------------------------------------------------//
       Procedure DllEntrPoint(Bxod:Integer);
         begin
             case Bxod of
               DLL_PROCESS_ATTACH: begin
                HookProc('ws2_32.dll','WSASend',@NewWSASend,@OLDWSASend);
                HookProc('ws2_32.dll','WSARecv',@NewWSARecv,@OLDWSARecv);
               end;
    
         end;
         end;
    
    begin
    DllProc:=@DllEntrPoint;
    DllEntrPoint(DLL_PROCESS_ATTACH);
    end.
    
    
    Когда Recv перехватывается браузер начинает грузить на жётский диск индексную страницу размером в 100 mb, функция WSAsend() вообще ничего не сохраняет.

    P.S WSARecv срабатывает но пишет всю страницу, а мне нужен только хеадер.
    Заранее спасибо за помощь :)
     
    #1 kak, 1 Dec 2010
    Last edited: 1 Dec 2010
  2. crypt0n

    crypt0n Member

    Joined:
    20 Feb 2010
    Messages:
    40
    Likes Received:
    5
    Reputations:
    0
  3. kak

    kak New Member

    Joined:
    30 Nov 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    А можно услышать камент по поводу кривости, что не так?
    Вроде просто копирую из буфера, а потом передаю управление оригинальной функции.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) код мего ужасный.
    2) юзать VCL внутри перватываемых функций это просто ппц. считай ты изобрел метод который не ускоряет интеренет а замедляет
    3) чтото я не вижу чтобы ты вызывал оригинальную функцию в обработчике перехвата.
    4)pushad это одно, а лучше еще и pushf делать чтобы небыло проблем. чисто на всяк случай
    5) length на буфере. нафига? Если у тебя уже есть размер данных
    в LPWSABUF параметр len
     
  5. kak

    kak New Member

    Joined:
    30 Nov 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Ушёл править руки и код. Спасибо за хорошую критику и наставления.