Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2746 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [RESOLU] JNI et libnet

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] JNI et libnet

n°1174987
tieuma
Posté le 12-08-2005 à 01:13:42  profilanswer
 

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
mood
Publicité
Posté le 12-08-2005 à 01:13:42  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [RESOLU] JNI et libnet

 

Sujets relatifs
afficher son statut MSN [résolu][Résolu] [PHP] Fonction récursive listage de répertoire
[VBA Excel - resolu] ajout d'une feuille[RESOLU] Display: block pour le lien sous IE
[RESOLU] -> [FMX/MySQL] GET ou POST??[Résolu] récupérer un objet au format "time"
[SVG] comment mettre à jour Mysql avec un fichier SVG ? [RESOLU]Cloner un objet Document [résolu : pas possible]
[Résolu] Pb avec les égalités de chaines[résolu]fenetre dos
Plus de sujets relatifs à : [RESOLU] JNI et libnet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR