这个是我根据网上的拦截封包源码修改的.. 但是无法弹出连接状态(Connect) 时的IP? . 帮忙看下.. ( 前贴 : http://topic.csdn.net/u/20090808/17/10d90eff-b51e-4aa6-a55b-9b665c84c721.html?17240 )   
  unit   APIHook;   
    
  interface   
    
  uses   
  SysUtils,   
  Windows,  dialogs, WinSock;
    
  type   
  //要HOOK的API函数定义   
  TSockProc   =   function   (s:   TSocket;   var   Buf;   len,   flags:   Integer):   Integer;   stdcall;   
  Tconnect = function (s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
  PJmpCode   =   ^TJmpCode;   
  TJmpCode   =   packed   record   
  JmpCode:   BYTE;   
  Address:   TSockProc;
  MovEAX:   Array   [0..2]   of   BYTE;   
  end;    
  //--------------------函数声明---------------------------   
  procedure   HookAPI;   
  procedure   UnHookAPI;   
    
  var   
  OldSend,   OldRecv:   TSockProc;   //原来的API地址
  OldConnect: Tconnect;
  JmpCode:   TJmpCode;   
  OldProc:   array   [0..2]   of   TJmpCode;
  AddSend,   AddRecv , AddConnect:   pointer;   //API地址
  TmpJmp:   TJmpCode;   
  ProcessHandle:   THandle;   
  implementation
    
  {---------------------------------------}   
  {函数功能:Send函数的HOOK   
  {函数参数:同Send   
  {函数返回值:integer   
  {---------------------------------------}   
  function   MySend(s:   TSocket;   var   Buf;   len,   flags:   Integer):   Integer;   stdcall;   
  var   
  dwSize:   cardinal;   
  begin   
  //这儿进行发送的数据处理  //调用直正的Send函数   
  WriteProcessMemory(ProcessHandle,   AddSend,   @OldProc[0],   8,   dwSize);   
  Result   :=   OldSend(S,   Buf,   len,   flags);   
  JmpCode.Address   :=   @MySend;   
  WriteProcessMemory(ProcessHandle,   AddSend,   @JmpCode,   8,   dwSize);   
  end;   
    
  {---------------------------------------}
  {函数功能:Recv函数的HOOK
  {函数参数:同Recv
  {函数返回值:integer
  {---------------------------------------}
  function   MyRecv(s:   TSocket;   var   Buf;   len,   flags:   Integer):   Integer;   stdcall;   
  var   
  dwSize:   cardinal;   
  begin   
  //这儿进行接收的数据处理  //调用直正的Recv函数   
  WriteProcessMemory(ProcessHandle,   AddRecv,   @OldProc[1],   8,   dwSize);   
  Result   :=   OldRecv(S,   Buf,   len,   flags);   
  JmpCode.Address   :=   @MyRecv;   
  WriteProcessMemory(ProcessHandle,   AddRecv,   @JmpCode,   8,   dwSize);   
  end;
function connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
var
  Ip:string;
  port:integer;
begin
  ip :=  inet_ntoa(name.sin_addr);
  port := ntohs(name.sin_port);
  messagebox(0,pchar(ip),'',64);
  OldConnect(s, name, namelen);
end;    
  {------------------------------------}   
  {过程功能:HookAPI   
  {过程参数:无   
  {------------------------------------}   
  procedure   HookAPI;   
  var   
  DLLModule:   THandle;   
  dwSize:   cardinal;   
  begin   
  ProcessHandle   :=   GetCurrentProcess;   
  DLLModule   :=   LoadLibrary('ws2_32.dll');     
  AddSend   :=   GetProcAddress(DLLModule,   'send');   //取得API地址
  AddRecv   :=   GetProcAddress(DLLModule,   'recv');
  AddConnect   :=   GetProcAddress(DLLModule,   'Connect');
  JmpCode.JmpCode   :=   $B8;   
  JmpCode.MovEAX[0]   :=   $FF;   
  JmpCode.MovEAX[1]   :=   $E0;   
  JmpCode.MovEAX[2]   :=   0;   
  ReadProcessMemory(ProcessHandle,   AddSend,   @OldProc[0],   8,   dwSize);   
  JmpCode.Address   :=   @MySend;   
  WriteProcessMemory(ProcessHandle,   AddSend,   @JmpCode,   8,   dwSize);   //修改Send入口
     
  ReadProcessMemory(ProcessHandle,   AddRecv,   @OldProc[1],   8,   dwSize);   
  JmpCode.Address   :=   @MyRecv;   
  WriteProcessMemory(ProcessHandle,   AddRecv,   @JmpCode,   8,   dwSize);   //修改Recv入口  ReadProcessMemory(ProcessHandle,   addConnect,   @OldProc[2],   8,   dwSize);
  JmpCode.Address   :=   @connect;
  WriteProcessMemory(ProcessHandle,   addConnect,   @JmpCode,   8,   dwSize);   //修改Send入口
  OldSend   :=   AddSend;
  OldRecv   :=   AddRecv;
  OldConnect   := AddConnect;
  end;   
    
  {------------------------------------}   
  {过程功能:取消HOOKAPI   
  {过程参数:无   
  {------------------------------------}   
  procedure   UnHookAPI;   
  var   
  dwSize:   Cardinal;   
  begin   
  WriteProcessMemory(ProcessHandle,   AddSend,   @OldProc[0],   8,   dwSize);   
  WriteProcessMemory(ProcessHandle,   AddRecv,   @OldProc[1],   8,   dwSize);   
  end;   
    
  end.    

解决方案 »

  1.   

    一个都钩不到?
    你另外钩 sendto 这个API试下
    应该可以读到的
      

  2.   

    send 和 recy 都可以啊.就是 connect 没用 , 肯定是哪写错了.
      

  3.   

    你设断点能进去吗?
    sendto  这个API钩住先 
      

  4.   

        兄弟, 设断点不太会..    sendto 应该是发送?. 我要得到的是 连接 那个 ( connect ) 这个函数.
      

  5.   

    UDP 是无连接的,现在大部分软件用UDP,你在SENDTO那API去截他的,可以获取到端口和地址
    TCP才是有连接的
      

  6.   

    兄弟, 我晚上测试下. 明天给你答复, 希望兄弟能贴份完整代码.. 挂钩也是像上面的send recy 一样吧?我还是新新手, 请见晾.