本帖最后由 kendychong 于 2009-08-18 09:53:34 编辑

解决方案 »

  1.   


    uses
      SysUtils, classes, windows, madCodeHook, winsock2;var
      oldWSARecv: function(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
        var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
        lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;  function SetHook: Boolean;implementationprocedure myRecv(buf: PChar; len: integer);
    var
      ss: string;
      //PacketDispose: TPacketDispose;
    begin
      //PacketDispose := TPacketDispose.Create(buf, len);  // 通过其它线程输出以免阻塞  ss := strPas(buf);
      Form1.Memo1.Lines.Add(IntToStr(lpNumberOfBytesRecvd) + '------------- >' + #13#10 + ss);
    end;function myWSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
      var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
      lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
    begin
      myWSARecv := oldWSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionROUTINE);
      myRecv(lpBuffers.buf, lpNumberOfBytesRecvd); 
    end;function SetHook: Boolean;
    begin  // 由于我是Hook程序本身(程序里面有TWebBrowser控件),所以没有做DLL
      HookAPI('ws2_32.dll', 'WSARecv', @myWSARecv, @oldWSARecv);
    end;