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

📄 packet_tcp.c

📁 Java抓包必备
💻 C
字号:
#include<jni.h>

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

#include<netinet/in_systm.h>
#include<netinet/ip.h>
#include<netinet/tcp.h>

#include"Jpcap_sub.h"

/** analyze tcp header **/
u_short analyze_tcp(jobject packet,u_char *data){
  struct tcphdr *tcp_pkt=(struct tcphdr *)data;
  u_short hdrlen;
  
#ifdef DEBUG
  puts("analze tcp");
#endif

  (*jni_env)->CallVoidMethod(jni_env,packet,setTCPValueMID,
			     (jint)ntohs(tcp_pkt->th_sport),
			     (jint)ntohs(tcp_pkt->th_dport),
			     (jlong)ntohl(tcp_pkt->th_seq),
			     (jlong)ntohl(tcp_pkt->th_ack),
			     (jboolean)(tcp_pkt->th_flags&TH_URG),
			     (jboolean)(tcp_pkt->th_flags&TH_ACK),
			     (jboolean)(tcp_pkt->th_flags&TH_PUSH),
			     (jboolean)(tcp_pkt->th_flags&TH_RST),
			     (jboolean)(tcp_pkt->th_flags&TH_SYN),
			     (jboolean)(tcp_pkt->th_flags&TH_FIN),
			     (jint)ntohs(tcp_pkt->th_win),
			     (jshort)ntohs(tcp_pkt->th_urp));

  hdrlen=tcp_pkt->th_off*4;

  /**
  Handle options
  **/
  if(hdrlen>TCPHDRLEN){
    jbyteArray dataArray=(*jni_env)->NewByteArray(jni_env,hdrlen-TCPHDRLEN);
    (*jni_env)->SetByteArrayRegion(jni_env,dataArray,0,hdrlen-TCPHDRLEN,data+TCPHDRLEN);
    (*jni_env)->CallVoidMethod(jni_env,packet,setTCPOptionMID,dataArray);
    DeleteLocalRef(dataArray);
  }

  /*if(caplen>hdrlen){
    jbyteArray dataArray=(*jni_env)->NewByteArray(jni_env,caplen-hdrlen);
    (*jni_env)->SetByteArrayRegion(jni_env,dataArray,0,
				   caplen-hdrlen,data+hdrlen);
    (*jni_env)->CallVoidMethod(jni_env,packet,setPacketDataMID,dataArray);
    DeleteLocalRef(dataArray);
  }else{
    (*jni_env)->CallVoidMethod(jni_env,packet,setPacketDataMID,
      (*jni_env)->NewByteArray(jni_env,0));
  }*/
  return hdrlen;
}

void set_tcp(JNIEnv *env,jobject packet,char *pointer,jbyteArray data)
{
  struct tcphdr *tcp=(struct tcphdr *)(pointer);
  int length=(*env)->GetArrayLength(env,data);

  tcp->th_sport=htons((jshort)GetIntField(TCPPacket,packet,"src_port"));
  tcp->th_dport=htons((jshort)GetIntField(TCPPacket,packet,"dst_port"));
  tcp->th_seq=htonl((unsigned long)GetLongField(TCPPacket,packet,"sequence"));
  tcp->th_ack=htonl((unsigned long)GetLongField(TCPPacket,packet,"ack_num"));
  tcp->th_off=5;
  tcp->th_flags=(GetBooleanField(TCPPacket,packet,"urg")<<5)+
    (GetBooleanField(TCPPacket,packet,"ack")<<4)+
    (GetBooleanField(TCPPacket,packet,"psh")<<3)+
    (GetBooleanField(TCPPacket,packet,"rst")<<2)+
    (GetBooleanField(TCPPacket,packet,"syn")<<1)+
    (GetBooleanField(TCPPacket,packet,"fin"));
  tcp->th_win=htons((jshort)GetIntField(TCPPacket,packet,"window"));
  tcp->th_urp=htons(GetShortField(TCPPacket,packet,"urgent_pointer"));
  if(length+IPv4HDRLEN+TCPHDRLEN>MAX_PACKET_SIZE)
    length=MAX_PACKET_SIZE-IPv4HDRLEN-TCPHDRLEN;
  (*env)->SetByteArrayRegion(env,data,0,
			     length,
			     (u_char *)(pointer+TCPHDRLEN));
}

⌨️ 快捷键说明

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