tieuma | 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 :
- JNIEXPORT void JNICALL Java_ARPTools_sendARPRequest(JNIEnv *env, jobject obj, jstring incTarget, jstring incDevice)
- {
- #ifndef ETH_ALEN
- #define ETH_ALEN 6
- #endif
-
- #ifndef IP_ALEN
- #define IP_ALEN 4
- #endif
-
-
- static u_char eth_broad[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
- static u_char eth_null[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
- static u_char eth_src[ETH_ALEN];
- static u_char eth_dst[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
- static u_char ip_src[IP_ALEN];
- static u_char ip_dst[IP_ALEN];
-
- libnet_t *libnet = NULL;
- char error[LIBNET_ERRBUF_SIZE];
-
-
- if (getuid() && geteuid()) {
- fprintf(stderr, "must be run as root\n" );
- exit(1);
- }
-
- const char *device = (*env)->GetStringUTFChars(env, incDevice, 0);
- const char *target = (*env)->GetStringUTFChars(env, incTarget, 0);
-
- // open libnet session
- libnet = libnet_init(LIBNET_LINK, (char *)device, error);
-
- // set target ip address
- u_int32_t otherip;
- otherip = libnet_name2addr4(libnet, (u_char*)target, LIBNET_RESOLVE);
- memcpy(ip_dst, (char*)&otherip, IP_ALEN);
-
- // get localhost mac address
- struct libnet_ether_addr *mymac;
- mymac = libnet_get_hwaddr(libnet);
- memcpy(eth_src, mymac, ETH_ALEN);
-
- // get localhost ip address
- u_int32_t myip;
- myip = libnet_get_ipaddr4(libnet);
- memcpy(ip_src, (char*)&myip, IP_ALEN);
-
- static libnet_ptag_t arp=0, eth=0;
-
- arp = libnet_build_arp(
- ARPHRD_ETHER,
- ETHERTYPE_IP,
- ETH_ALEN, IP_ALEN,
- ARPOP_REQUEST,
- eth_src, ip_src,
- eth_null, ip_dst,
- NULL, 0,
- libnet,
- arp);
- eth = libnet_build_ethernet(
- eth_broad, eth_src,
- ETHERTYPE_ARP,
- NULL, 0,
- libnet,
- eth);
-
- // send the request
- libnet_write(libnet);
-
- // clear the libnet session
- libnet_destroy(libnet);
- // release memory for java object
- (*env)->ReleaseStringUTFChars(env, incTarget, target);
- (*env)->ReleaseStringUTFChars(env, incDevice, device);
-
- }
|
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
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... 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
|