2015-09-11 3 views
0

Я попытался подключить метод подключения сокета iOS, чтобы получить информацию о подключенных портах между локальным хостом и удаленным сервером.Hook iOS BSD socket connect метод для получения локального и удаленного порта

Однако из гнезда struct sockaddrsa_family всегда AF_SYSTEM (сообщение о событии ядра).

код Hood:

int (*origin_connect)(int socket, const struct sockaddr *address, socklen_t address_len); 

    int replaced_connect(int socket, const struct sockaddr *address, socklen_t address_len) { 
     int r = origin_connect(socket, address, address_len); 
     sa_family_t f = address->sa_family; 
     NSLog(@"CONNECT FAMILY %d", f); 
     if (f == AF_INET) { 
      struct sockaddr_in *addr = (struct sockaddr_in *)address; 
      NSString *remote_ip = [[NSString alloc]initWithCString:inet_ntoa(addr->sin_addr) encoding:NSUTF8StringEncoding]; 
      uint16_t remote_port = ntohs(addr -> sin_port); 
      NSLog(@"The CONNECT ip = %@ port = %u", remote_ip, remote_port); 
      struct sockaddr local_address; 
      socklen_t addr_size = sizeof(local_address); 
      getsockname(socket, &local_address, &addr_size); 
      struct sockaddr_in *laddr = (struct sockaddr_in*)&local_address; 
      NSString *local_ip = [[NSString alloc]initWithCString:inet_ntoa(laddr->sin_addr) encoding:NSUTF8StringEncoding]; 
      uint16_t local_port = ntohs(laddr->sin_port); 
      NSLog(@"The CONNECT Local ip = %@ port = %u", local_ip, local_port);  
     } else if (f == AF_SYSTEM) { 
      NSLog(@"hello there :("); 
      struct sockaddr_ctl * ctl = (struct sockaddr_ctl *)address; 
     } 
     return r; 
    } 

ли я зацепить неправильный метод или есть ли другой способ, чтобы получить информацию, связанные портов?

+0

Какой процесс вы пытаетесь подключить? – creker

ответ

0

Вы получаете AF_SYSTEM, потому что, когда приложения запускаются, они также вызывают системный сокет. Если вы позволите своему крюку просто игнорировать это, следующие вызовы должны перехватывать TCP/IP-сокеты.

Есть, кстати, гораздо лучшие способы сделать это. Вы можете получить информацию о подключенных сокетах и ​​даже уведомлениях, используя com.apple.network.statistics. Полный пример того, как это сделать, находится на http://newosxbook.com/src.jl?tree=listings&file=lsock.c