⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packet_arp.c

📁 JAVA 抓包系统~~~提取数据包分析。分离出TCP UDP ARP 等包
💻 C
字号:
#include<jni.h>
#include<pcap.h>

#ifndef WIN32
#include<sys/param.h>
#define __FAVOR_BSD
#include<netinet/in.h>
#include<sys/socket.h>
#else
#include<winsock2.h>
#endif

#include<net/if.h>
#include<netinet/if_ether.h>

#include"Jpcap_sub.h"

/** analyze arp header **/
int analyze_arp(JNIEnv *env,jobject packet,u_char *data){
	/** XXX assume Ethernet ARP**/
  struct ether_arp *arp=(struct ether_arp *)data;
  jbyteArray sha,spa,tha,tpa;
  u_char hl,pl;

#ifdef DEBUG
  puts ("analyze arp");
#endif

  hl=arp->arp_hln;
  pl=arp->arp_pln;

  sha=(*env)->NewByteArray(env,hl);
  (*env)->SetByteArrayRegion(env,sha,0,hl,(char *)(data+sizeof(struct arphdr)));
  spa=(*env)->NewByteArray(env,pl);
  (*env)->SetByteArrayRegion(env,spa,0,pl,(char *)(data+sizeof(struct arphdr)+hl));
  tha=(*env)->NewByteArray(env,hl);
  (*env)->SetByteArrayRegion(env,tha,0,hl,(char *)(data+sizeof(struct arphdr)+hl+pl));
  tpa=(*env)->NewByteArray(env,pl);
  (*env)->SetByteArrayRegion(env,tpa,0,pl,(char *)(data+sizeof(struct arphdr)+hl+pl+hl));

  (*env)->CallVoidMethod(env,packet,setARPValueMID,
			     (jshort)ntohs(arp->arp_hrd),
			     (jshort)ntohs(arp->arp_pro),
			     (jshort)hl,(jshort)pl,
			     (jshort)ntohs(arp->arp_op),
			     sha,spa,tha,tpa);
  DeleteLocalRef(sha);
  DeleteLocalRef(spa);
  DeleteLocalRef(tha);
  DeleteLocalRef(tpa);

  return sizeof(struct arphdr)+hl*2+pl*2;
}

int set_arp(JNIEnv *env,jobject packet,u_char *pointer){
	/** XXX assume Ethernet ARP**/
  struct ether_arp *arp=(struct ether_arp *)pointer;

  arp->arp_hrd=htons(GetShortField(ARPPacket,packet,"hardtype"));
  arp->arp_pro=htons(GetShortField(ARPPacket,packet,"prototype"));
  arp->arp_op=htons(GetShortField(ARPPacket,packet,"operation"));
  arp->arp_hln=(u_char)GetShortField(ARPPacket,packet,"hlen");
  arp->arp_pln=(u_char)GetShortField(ARPPacket,packet,"plen");

  (*env)->GetByteArrayRegion(env,
	  GetObjectField(ARPPacket,packet,"[B","sender_hardaddr"),
	  0,arp->arp_hln,arp->arp_sha);
  (*env)->GetByteArrayRegion(env,
	  GetObjectField(ARPPacket,packet,"[B","sender_protoaddr"),
	  0,arp->arp_pln,arp->arp_spa);
  (*env)->GetByteArrayRegion(env,
	  GetObjectField(ARPPacket,packet,"[B","target_hardaddr"),
	  0,arp->arp_hln,arp->arp_tha);
  (*env)->GetByteArrayRegion(env,
	  GetObjectField(ARPPacket,packet,"[B","target_protoaddr"),
	  0,arp->arp_pln,arp->arp_tpa);

  return sizeof(struct ether_arp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -