[RESOLU] JNI et libnet

JNI et libnet [RESOLU] - Java - Programmation

Marsh Posté le 12-08-2005 à 01:13:42    

Bonjour à tous,
 
Je réalise une appli de surveillance réseau en java avec jpcap. Ayant besoin également d'envoyer des paquets/trames sur le réseau je me suis lancé dans la création d'un petit wrapper pour libnet en utilisant JNI.
 
J'ai donc commencé par tenter l'envoi de requetes arp sur le réseau. Cela fonctionne, enfin presque  ;)  
 
Voila le code de la méthode native en c (largement dérive d'un bout de code trouvé sur le net ;)):
 

Code :
  1. JNIEXPORT void JNICALL Java_ARPTools_sendARPRequest(JNIEnv *env, jobject obj, jstring incTarget, jstring incDevice)
  2. {
  3. #ifndef ETH_ALEN
  4. #define ETH_ALEN 6
  5. #endif
  6.  
  7. #ifndef IP_ALEN
  8. #define IP_ALEN 4
  9. #endif
  10.  
  11.  
  12.   static u_char eth_broad[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  13.   static u_char eth_null[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  14.  
  15.   static u_char eth_src[ETH_ALEN];
  16.   static u_char eth_dst[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  17.  
  18.   static u_char ip_src[IP_ALEN];
  19.   static u_char ip_dst[IP_ALEN];
  20.  
  21.   libnet_t *libnet = NULL;
  22.   char error[LIBNET_ERRBUF_SIZE];
  23.  
  24.  
  25.   if (getuid() && geteuid()) {
  26.       fprintf(stderr, "must be run as root\n" );
  27.       exit(1);
  28.   }
  29.  
  30.   const char *device = (*env)->GetStringUTFChars(env, incDevice, 0);
  31.   const char *target = (*env)->GetStringUTFChars(env, incTarget, 0);
  32.  
  33.   // open libnet session
  34.   libnet = libnet_init(LIBNET_LINK, (char *)device, error);
  35.      
  36.   // set target ip address
  37.   u_int32_t otherip;
  38.   otherip = libnet_name2addr4(libnet, (u_char*)target, LIBNET_RESOLVE);
  39.   memcpy(ip_dst, (char*)&otherip, IP_ALEN);
  40.  
  41.   // get localhost mac address
  42.   struct libnet_ether_addr *mymac;
  43.   mymac = libnet_get_hwaddr(libnet);
  44.   memcpy(eth_src, mymac, ETH_ALEN);
  45.  
  46.   // get localhost ip address
  47.   u_int32_t myip;
  48.   myip = libnet_get_ipaddr4(libnet);
  49.   memcpy(ip_src, (char*)&myip, IP_ALEN);
  50.    
  51.   static libnet_ptag_t arp=0, eth=0;
  52.        
  53.   arp = libnet_build_arp(
  54.    ARPHRD_ETHER,
  55.    ETHERTYPE_IP,
  56.    ETH_ALEN, IP_ALEN,
  57.    ARPOP_REQUEST,
  58.    eth_src, ip_src,
  59.    eth_null, ip_dst,
  60.    NULL, 0,
  61.    libnet,
  62.    arp);
  63.   eth = libnet_build_ethernet(
  64.         eth_broad, eth_src,
  65.         ETHERTYPE_ARP,
  66.         NULL, 0,
  67.         libnet,
  68.         eth);
  69.    
  70.   // send the request
  71.   libnet_write(libnet); 
  72.  
  73.   // clear the libnet session
  74.   libnet_destroy(libnet);
  75.   // release memory for java object
  76.   (*env)->ReleaseStringUTFChars(env, incTarget, target);
  77.   (*env)->ReleaseStringUTFChars(env, incDevice, device);
  78.  
  79. }


 
 
Voila le problème :
 
Lorsque j'appelle une première fois cette méthode depuis mon code java tout se passe bien, je vois le paquet partir ainsi que la réponse du pc visé.
 
Lorsque j'appelle une deuxième fois cette méthode j'ai ce joli message :
 
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  SIGSEGV (0xb) at pc=0x45f7bc7a, pid=17405, tid=1173732272
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode, sharing)
# Problematic frame:
# C  [libjnet.so+0x3c7a]  libnet_pblock_coalesce+0x26a
#
# An error report file with more information is saved as hs_err_pid17405.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#
Aborted
 :fou:  
 
Voila donc mon problème, je suis dans l'incapacité d'envoyer 2 requetes arp en appelant 2 fois la même méthode (par contre en appelant libnet_write() 2 fois de suite dans le code c, 2 paquets partent...)
 
Bref c'est la me...  :D  
 
J'ai vu que certains ici connaissent bien JNI et d'autres le c (que je connais relativement peu) donc je m'adresse à vous en ultime recours ;)
 
Merci d'avance
 
ps : je peux mettre en ligne le rapport d'erreurs si ca peut vous aider.
 
[EDIT] Bon bah voila ce qui arrive qd on copie/colle du code depuis le net sans relire attentivement ;)
Suffisait de virer le static (ligne 52) sur les ptag arp et eth. Voila j'edit au cas ou ;)


Message édité par tieuma le 12-08-2005 à 19:27:50
Reply

Marsh Posté le 12-08-2005 à 01:13:42   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed