jeudi 31 mai 2012

Un peu de code networking pour l'iPod jailbreaké

Je me suis un peu planché sur la programmation en C sur iPod jailbreaké. En faite, je me retrouve avec l'environnement de travail typique Mac OS X  (Darwin) avec a peu près les mêmes headers et fonctions.

Première info, le firmware 3.1.3 de l'iPod ne supporte pas l'IPv6. C'est un peu dommage pour l'instant surtout que je doute qu'il existe un autre firmware pour cet iPod qui le supporte.

Pour célébrer ça, je poste donc 2 codes sources qui permettent très simplement de passer l'iPod en mode routeur (le procfs n'existe pas sous Darwin donc il faut passer par Sysctl) et de récupérer des infos utiles sur les interfaces réseau. Ok, il est moins complet qu'ifconfig mais utile pour récupérer des bouts de code pour des programmes plus évolué.


Donc le premier pour passer l'iPod en mode routeur :

 #include <stdio.h>  
 #include <errno.h>  
 #include <sys/types.h>  
 #include <sys/sysctl.h>  
 int main(int argc, char* argv[])  
 {  
      int mib[4], value, newvalue;  
      size_t len, vlen;  
      len=sizeof(mib);  
      sysctlnametomib("net.inet.ip.forwarding",mib,&len);  
      vlen=sizeof(value);  
      if(sysctl(mib,len,&value,&vlen,NULL,0)==-1) {  
        perror("sysctl read failed");  
      }  
      printf("net.inet.ip.forwarding=%d\n",value);  
      if(value==1) newvalue=0; else newvalue=1;  
      if(sysctl(mib,len,NULL,NULL,&newvalue,len)==-1) {  
        perror("sysctl write failed");  
      } else printf("net.inet.ip.forwarding=%d\n",newvalue);  
      return 0;  
 }  


Résultat :


Le second pour récupérer des infos sur les interfaces réseau (avec la méthode pour récupérer l'adresse MAC) :

 #include <stdio.h>  
 #include <stdlib.h>  
 #include <unistd.h>  
 #include <sys/types.h>  
 #include <sys/socket.h>  
 #include <errno.h>  
 #include <string.h>  
 #include <net/if.h>  
 #include <arpa/inet.h>  
 #include <sys/ioctl.h>  
 #include <netdb.h>  
 #include <net/if_dl.h>  
 #include <net/ethernet.h>  
 #include <ifaddrs.h>  
 int main(int argc, char* argv[])  
 {  
      struct ifaddrs* ifa=NULL;  
      struct ifaddrs* ifEntry=NULL;  
      struct ifaddrs* ifLink=NULL;;  
      struct sockaddr_in6* sin6;  
      struct sockaddr_in* sin4;  
      char ipv6addr[INET6_ADDRSTRLEN];  
      char ipv4addr[INET_ADDRSTRLEN];  
      struct sockaddr_dl* sdl;  
      struct ether_addr mac[ETHER_ADDR_LEN];  
      short flags=0;  
      unsigned int index;  
      if(getifaddrs(&ifa)<0) {  
     printf("No interfaces.\n");  
     return EXIT_FAILURE;  
      }  
      for(ifEntry=ifa; ifEntry!=NULL; ifEntry=ifEntry->ifa_next) {  
     if(ifEntry->ifa_addr->sa_family==PF_INET6 || ifEntry->ifa_addr->sa_family==AF_INET) {  
       index=if_nametoindex(ifEntry->ifa_name);  
       printf("Interface name: %s (%d)\n",ifEntry->ifa_name,index);  
       flags=ifEntry->ifa_flags;  
       if((flags & IFF_UP))  
         printf("Status: UP; ");  
       else printf("Status: DOWN; ");  
       if((flags & IFF_LOOPBACK))  
         printf("is loopback; ");  
       if((flags & IFF_MULTICAST))  
         printf("Supports multicast; ");  
       if((flags & IFF_RUNNING))  
         printf("Running\n");  
       else printf("Not running\n");  
       for(ifLink=ifa; ifLink!=NULL; ifLink=ifLink->ifa_next) {  
         if(ifLink->ifa_addr->sa_family==AF_LINK && strncmp(ifEntry->ifa_name,ifLink->ifa_name,IFNAMSIZ)==0) {  
           sdl=(struct sockaddr_dl*)ifLink->ifa_addr;  
           if(sdl->sdl_alen==ETHER_ADDR_LEN) { // sdl_alen = address length; sdl_nlen=name length  
             bzero(mac,ETHER_ADDR_LEN);  
             memcpy(mac,(sdl->sdl_data+sdl->sdl_nlen),ETHER_ADDR_LEN); // sdl_data includes interface name and hardware address  
             printf("Hardware address: %02x:%02x:%02x:%02x:%02x:%02x\n",mac->octet[0],mac->octet[1],mac->octet[2],mac->octet[3],mac->octet[4],mac->octet[5]);  
           }  
         }  
       }  
       if(ifEntry->ifa_addr->sa_family==PF_INET6) {  
         sin6=(struct sockaddr_in6*)ifEntry->ifa_addr;  
         inet_ntop(PF_INET6,&sin6->sin6_addr,ipv6addr,INET6_ADDRSTRLEN);  
         printf("IPv6 address: %s\n",ipv6addr);  
         bzero(ipv6addr,INET6_ADDRSTRLEN);  
       }  
       else {  
         sin4=(struct sockaddr_in*)ifEntry->ifa_addr;  
         inet_ntop(AF_INET,&sin4->sin_addr,ipv4addr,INET_ADDRSTRLEN);  
         printf("IPv4 address: %s\n",ipv4addr);  
         bzero(ipv4addr,INET_ADDRSTRLEN);  
       }  
     }  
   }  
   free(ifa);  
   return EXIT_SUCCESS;  
 }  


Résultat :


Aucun commentaire:

Enregistrer un commentaire