本帖最后由 mr_xiaochou 于 2009-08-08 17:11:09 编辑

解决方案 »

  1.   

    你得另外钩个API,连接函数的API,那里边有IP地址和端口号
      

  2.   

    function connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcal
    上边这个API
    读第2个参数
      sockaddr_in = record
        case Integer of
          0: (sin_family: u_short;
              sin_port: u_short;
              sin_addr: TInAddr;
              sin_zero: array[0..7] of Char);
          1: (sa_family: u_short;
              sa_data: array[0..13] of Char)
      end;
      TSockAddrIn = sockaddr_in;
    上边就是你要的参数 
      

  3.   


    type
      Tconnect = function (s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;var
      OldConnet: Tconnect;function connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcal
    var
      Ip:
    begin
      IP地址 :=  name.sin_addr;
      端口号 := name.sin_port;
      OldConnet(s, name, namelen);
    end;  if @OldConnet = nil then
          @OldConnet := 保存地址函数(@connect);
       替换函数(@OldConnet, @connect);中文的地方你自己加上去吧 
      

  4.   

     不好意思 , 昨天出门了 .. 我测试下, 行的话, 马上结贴. 其他地方也是像 mysend 一样的加上去吧? .
      

  5.   

    大家帮忙看下, 我改的有哪里出问题噢 ? 不能弹出IP ,
      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.   
      

  6.   

    兄弟, 我写了的.. 在这段.. messageboxfunction 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;
      

  7.   

    uses WinSock2;2000/XP系统以上版本,程序很少用send用WSASend,WSARecv,WSASendTo,WSARecvFrom