dll工程文件中
HookAPI('ws2_32.dll','WSASend',@WSASendHook,@WSASendOrigin);hook文件中
function WSASendHook(s:TSocket;lpBuffers:LPWSABUF;
          dwBufferCount:dword;lpNumberOfBytesSent:LPDWORD;
          dwFlags:DWORD;lpOverlapped:LPWSAOVERLAPPED;
          lpCompletionROUTINE:LPWSAOVERLAPPED_COMPLETION_ROUTINE):integer;stdcall;
var
 myBuf:PChar;
 myLen:Integer;
begin
 PopUnit.FrmPop.ListBox1.Items.Add('拦截到发送的封包');
 strcopy(myBuf,lpBuffers.buf);
 PopUnit.FrmPop.ListBox1.Items.Add(myBuf);
 WSASendHook:=WSASendOrigin(s,lpBuffers,dwBufferCount,
          lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionROUTINE);
end;
这样为什么不行,出错在哪里了?

解决方案 »

  1.   

    改成这样:
    const
      MAX_BUFFER_SIZE=2048;function WSASendHook(s:TSocket;lpBuffers:LPWSABUF;
              dwBufferCount:dword;lpNumberOfBytesSent:LPDWORD;
              dwFlags:DWORD;lpOverlapped:LPWSAOVERLAPPED;
              lpCompletionROUTINE:LPWSAOVERLAPPED_COMPLETION_ROUTINE):integer;stdcall;
    var
     myBuf:array[0..MAX_BUFFER_SIZE-1];
     myLen:Integer;
    begin
     PopUnit.FrmPop.ListBox1.Items.Add('拦截到发送的封包');
     if lpNumberOfBytesSent>MAX_BUFFER_SIZE then
        myLen:=MAX_BUFFER_SIZE
     else
        myLen:=lpNumberOfBytesSent;
     copymemory(@myBuf[0], lpBuffers.buf, myLen);
     PopUnit.FrmPop.ListBox1.Items.Add(myBuf);
     WSASendHook:=WSASendOrigin(s,lpBuffers,dwBufferCount,
              lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionROUTINE);
    end;ps: delphi程序员应该重点看看指针的本质和应用