我使用了DELPHI的APIHOOK拦截WSARecv的数据,发现有3个问题:
1、拦截的数据后面经常有很多‘瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?’,求教下这个是怎么回事。
2、实际的拦截的缓冲区的数据都是偏大,最后都是瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?瓠?这类的代码,怎么得到实际的数据而不要多余的乱码。
3、另外捕捉一会就会告出错。
小弟是新学DELPHI,希望知道答案的高手指点一下。function MyWSARecv( s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
    lpNumberOfBytesRecvd: PDWORD; lpFlags: PDWORD;lpOverlapped: LPWSAOVERLAPPED;
    lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
    var
    TmpChr: array[0..8192] of Char;
begin
CopyMemory(@TmpChr, lpBuffers.buf,lpNumberOfBytesRecvd^);
memo1.lines.appendTmpChr);
result := oldWSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd,lpFlags,lpOverlapped,lpCompletionRoutine);
end;

解决方案 »

  1.   

    在执行了recv后再copy 才正确的。
    begin
    result := oldWSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd,lpFlags,lpOverlapped,lpCompletionRoutine);
    //这样试试看
    CopyMemory(@TmpChr, lpBuffers.buf,lpNumberOfBytesRecvd^);
    memo1.lines.appendTmpChr);
    end;
      

  2.   

    还有你这样搞是个死循环 在调用原始recv前 应该把hook代码还原 否则死循环了 容易出堆栈溢出的 飞了
      

  3.   

    本来想用钩子检查游戏分析游戏的代码,后来发现问题太多了,而且很不稳定。最后使用网上别人写的winPacp的DLL库,直接调用,自己对字符过滤了一下,好多了!不过还是谢谢大家了!