Esempio n. 1
0
/*
 * Class:     org_jnetpcap_PcapUtils
 * Method:    injectLoop
 * Signature: (IILorg/jnetpcap/packet/PcapPacketHandler;Ljava/lang/Object;Lorg/jnetpcap/packet/PcapPacket;Lorg/jnetpcap/packet/JPacket$State;Lorg/jnetpcap/PcapHeader;Lorg/jnetpcap/packet/JScanner;)I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_PcapUtils_injectLoop
(JNIEnv *env, jclass zz,
		jint jcnt,
		jint id,
		jobject jhandler,
		jobject juser,
		jobject jpacket,
		jobject jstate,
		jobject jheader,
		jobject jscanner) {

//	printf("LOOP-JPacketHandler\n"); fflush(stdout);
	if (jhandler == NULL) {
		throwException(env, NULL_PTR_EXCEPTION, NULL);
		return -1;
	}

	/*
	 * Structure to encapsulate user data object, and store our JNI information
	 * so we can dispatch to Java land.
	 */
	cb_jpacket_t data;
	memset(&data, 0, sizeof(data));
	data.env = env;
	data.obj = jhandler;
	data.pcap = NULL;
	data.user = juser;
	data.header = jheader;
	data.packet = jpacket;
	data.state = jstate;
	data.id = id;
	data.scanner = jscanner;
	jclass clazz = env->GetObjectClass(jhandler);
	data.p = NULL;
	data.flags = 0;

	data.mid = env->GetMethodID(clazz, "nextPacket",
			"(Lorg/jnetpcap/packet/PcapPacket;Ljava/lang/Object;)V");
	if (data.mid == NULL) {
		return -1;
	}

	const pcap_pkthdr *pkt_header = (const pcap_pkthdr *)getJMemoryPhysical(env, jheader);
	const u_char *pkt_data = (const u_char *)getJMemoryPhysical(env, jheader);

	for (int i = 0; i < jcnt || jcnt == -1; i ++) {
		cb_pcap_packet_dispatch((u_char *)&data, pkt_header, pkt_data);
		if (data.exception != NULL) {
			env->Throw(data.exception);
			break;
		}

		if (data.flags & DEBUG_INJECT_PACKET_BREAK_LOOP) {
			break;
		}

	}

	return jcnt;
}
Esempio n. 2
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_buf
 * Signature: (Lorg/jnetpcap/nio/JBuffer;)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScan_scan_1buf
  (JNIEnv *env, jobject obj, jobject jbuf) {
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return;
	}

	char *buf = (char *)getJMemoryPhysical(env, jbuf);
	scan->buf = buf;
}
/*
 * Class:     org_jnetpcap_packet_JScanner
 * Method:    loadFlags
 * Signature: ([I)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScanner_loadFlags
(JNIEnv *env, jobject obj, jintArray jflags) {
#ifdef DEBUG
	debug_enter("loadFlags");
#endif

	scanner_t *scanner = (scanner_t *)getJMemoryPhysical(env, obj);
	if (scanner == NULL) {
		return;
	}

	jsize size = env->GetArrayLength(jflags);

#ifdef DEBUG
	debug_trace("load", "loaded %d flags", (int)size);
#endif

	if (size != MAX_ID_COUNT) {
		throwException(env,
				ILLEGAL_ARGUMENT_EXCEPTION,
				"size of array must be MAX_ID_COUNT size");
#ifdef DEBUG
		debug_error("IllegalArgumentException",
				"size of array must be MAX_ID_COUNT size");
#endif
		return;
	}

	env->GetIntArrayRegion(jflags, 0, size, (jint *)scanner->sc_flags);

#ifdef DEBUG
	debug_exit("loadFlags");
#endif
}
/*
 * Class:     org_jnetpcap_packet_JHeaderScanner
 * Method:    nativeScan
 * Signature: (Lorg/jnetpcap/packet/JScan;)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JHeaderScanner_nativeScan
(JNIEnv *env, jobject obj, jobject jscan) {

	native_protocol_func_t func = (native_protocol_func_t)getJMemoryPhysical(env, obj);
	if (func == NULL) {
		return;
	}

	scan_t *scan = (scan_t *)getJMemoryPhysical(env, jscan);
	if (jscan == NULL) {
		return;
	}

	// Dispatch to function pointer
	func(scan);
}
Esempio n. 5
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_packet
 * Signature: ()Lorg/jnetpcap/packet/JPacket;
 */
JNIEXPORT jobject JNICALL Java_org_jnetpcap_packet_JScan_scan_1packet
  (JNIEnv *env, jobject obj) {
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return NULL;
	}

	return scan->jpacket;
}
Esempio n. 6
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_offset
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScan_scan_1offset__I
  (JNIEnv *env, jobject obj, jint offset) {
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return;
	}

	scan->offset = (int) offset;
}
Esempio n. 7
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    record_header
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScan_record_1header
  (JNIEnv *env, jobject obj) {
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return;
	}

	record_header(scan);
}
Esempio n. 8
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_buf_len
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScan_scan_1buf_1len
  (JNIEnv *env, jobject obj, jint len) {
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return;
	}

	scan->buf_len = (int) len;
}
Esempio n. 9
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_length
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JScan_scan_1length__
  (JNIEnv *env, jobject obj) {
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return -1;
	}

	return scan->length;
}
Esempio n. 10
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_next_id
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScan_scan_1next_1id__I
  (JNIEnv *env, jobject obj, jint next_id) {
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return;
	}

	scan->next_id = (int) next_id;
}
Esempio n. 11
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    getFrameNumber
 * Signature: ()J
 */
JNIEXPORT jlong JNICALL Java_org_jnetpcap_packet_JPacket_00024State_getFrameNumber
  (JNIEnv *env, jobject obj) {
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}

	return (jint) packet->pkt_frame_num;
}
Esempio n. 12
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    get64BitHeaderMap
 * Signature: (I)J
 */
JNIEXPORT jlong JNICALL Java_org_jnetpcap_packet_JPacket_00024State_get64BitHeaderMap
  (JNIEnv *env, jobject obj, jint index) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}

	return (jlong) packet->pkt_header_map;
}
Esempio n. 13
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    findHeaderIndex
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JPacket_00024State_findHeaderIndex
  (JNIEnv *env, jobject obj, jint id, jint instance) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}
	
	return (jint) findHeaderById(packet, id, instance);
}
Esempio n. 14
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_postix
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScan_scan_1postix__I
(JNIEnv *env, jobject obj, jint jvalue) {
	
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return;
	}

	scan->hdr_postfix = (int) jvalue;
}
Esempio n. 15
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    getAnalysis
 * Signature: ()Lorg/jnetpcap/analysis/JAnalysis;
 */
JNIEXPORT jobject JNICALL Java_org_jnetpcap_packet_JPacket_00024State_getAnalysis

  (JNIEnv *env, jobject obj) {
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return NULL;
	}

	return packet->pkt_analysis;
}
Esempio n. 16
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    setFlags
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JPacket_00024State_setFlags
  (JNIEnv *env, jobject obj, jint jflags) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return;
	}
	
	packet->pkt_flags = (uint8_t) jflags;
}
Esempio n. 17
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    getWirelen
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JPacket_00024State_getWirelen
  (JNIEnv *env, jobject obj) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}
	
	return (jint) packet->pkt_wirelen;
}
Esempio n. 18
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    setWirelen
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JPacket_00024State_setWirelen
  (JNIEnv *env, jobject obj, jint jwirelen) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return;
	}
	
	packet->pkt_wirelen = (uint32_t) jwirelen;
}
Esempio n. 19
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_postix
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JScan_scan_1postix__
(JNIEnv *env, jobject obj) {
	
	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return -1;
	}
	
	return (jint) scan->hdr_postfix;
}
/*
 * Class:     org_jnetpcap_packet_JScanner
 * Method:    getFrameNumber
 * Signature: ()J
 */
JNIEXPORT jlong JNICALL Java_org_jnetpcap_packet_JScanner_getFrameNumber(
		JNIEnv *env, jobject obj) {

	scanner_t *scanner = (scanner_t *) getJMemoryPhysical(env, obj);
	if (scanner == NULL) {
		return -1;
	}

	return (jlong) scanner->sc_cur_frame_num;
}
/*
 * Class:     org_jnetpcap_packet_JScanner
 * Method:    setFrameNumber
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScanner_setFrameNumber
(JNIEnv *env, jobject obj, jlong frame_no) {

	scanner_t *scanner = (scanner_t *)getJMemoryPhysical(env, obj);
	if (scanner == NULL) {
		return;
	}

	scanner->sc_cur_frame_num = (uint64_t) frame_no;

	return;
}
Esempio n. 22
0
/*
 * Class:     org_jnetpcap_packet_JScan
 * Method:    scan_set_lengths
 * Signature: (IIIII)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScan_scan_1set_1lengths
  (JNIEnv *env, jobject obj, jint prefix, jint header, jint gap, jint payload, jint postfix) {

	scan_t *scan = (scan_t *)getJMemoryPhysical(env, obj);
	if (scan == NULL) {
		return;
	}

	scan->hdr_prefix =  (uint8_t) prefix;
	scan->length     =  (int) header;
	scan->hdr_gap    =  (uint8_t) gap;
	scan->hdr_payload = (uint32_t) payload;
	scan->hdr_postfix = (uint16_t) postfix;
}
/*
 * Class:     org_jnetpcap_packet_JScanner
 * Method:    scan
 * Signature: (Lorg/jnetpcap/packet/JPacket;Lorg/jnetpcap/packet/JPacket$State;II)I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JScanner_scan(JNIEnv *env,
		jobject obj, jobject jpacket, jobject jstate, jint id, jint wirelen) {

	scanner_t *scanner = (scanner_t *) getJMemoryPhysical(env, obj);
	if (scanner == NULL) {
		return -1;
	}

	char *buf = (char *) getJMemoryPhysical(env, jpacket);
	if (buf == NULL) {
		return -1;
	}

	int size = (int) env->GetIntField(jpacket, jmemorySizeFID);

	if (wirelen < size) {
		throwException(env, ILLEGAL_ARGUMENT_EXCEPTION, "wirelen < buffer len");
		return -1;
	}

	return scanJPacket(env, obj, jpacket, jstate, scanner, id, buf, size,
			(uint32_t) wirelen);
}
Esempio n. 24
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    getHeaderOffsetByIndex
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JPacket_00024State_getHeaderOffsetByIndex
  (JNIEnv *env, jobject obj, jint index) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}
	
	if (index < 0 || index >= packet->pkt_header_count) {
		throwException(env, INDEX_OUT_OF_BOUNDS_EXCEPTION, "header index out of range");
		return -1;
	}

	return (jint) packet->pkt_headers[index].hdr_offset;
}
Esempio n. 25
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    peerHeaderByIndex
 * Signature: (ILorg/jnetpcap/packet/JHeader$State;)I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JPacket_00024State_peerHeaderByIndex
  (JNIEnv *env, jobject obj, jint index, jobject dst) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}
	
	if (index >= packet->pkt_header_count) {
		return -1;
	}
	
	setJMemoryPhysical(env, dst, toLong(&packet->pkt_headers[index]));

	return sizeof(header_t);
}
Esempio n. 26
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    getInstanceCount
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JPacket_00024State_getInstanceCount
  (JNIEnv *env, jobject obj, jint id) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}
	
	int count = 0;
	for (int i = 0; i < packet->pkt_header_count; i ++) {
		if (packet->pkt_headers[i].hdr_id == id) {
			count ++;
		}
	}

	return (jint) count;
}
Esempio n. 27
0
/*
 * Class:     org_jnetpcap_packet_JPacket_State
 * Method:    peerHeaderById
 * Signature: (IILorg/jnetpcap/packet/JHeader$State;)I
 */
JNIEXPORT jint JNICALL Java_org_jnetpcap_packet_JPacket_00024State_peerHeaderById
  (JNIEnv *env, jobject obj, jint id, jint instance, jobject dst) {
	
	packet_state_t *packet = (packet_state_t *)getJMemoryPhysical(env, obj);
	if (packet == NULL) {
		return -1;
	}
	
	int index = findHeaderById(packet, id, instance);
	if (index == -1) {
		return -1;
	}
	
	setJMemoryPhysical(env, dst, toLong(&packet->pkt_headers[index]));
	jobject keeper = env->GetObjectField(obj, jmemoryKeeperFID);
	env->SetObjectField(dst, jmemoryKeeperFID, keeper);

	return sizeof(header_t);
}
Esempio n. 28
0
/*
 * Class:     org_jnetpcap_nio_JObjectBuffer
 * Method:    getObject
 * Signature: (Ljava/lang/Class;I)Ljava/lang/Object;
 */
JNIEXPORT jobject JNICALL Java_org_jnetpcap_nio_JObjectBuffer_getObject
  (JNIEnv *env, jobject obj, jclass clazz, jint offset) {
	
	
	jbyte *mem = (jbyte *)getJMemoryPhysical(env, obj);
	if (mem == NULL) {
		throwException(env, NULL_PTR_EXCEPTION, "JBuffer not initialized");
		return NULL;
	}
//#define DEBUG
#ifdef DEBUG
	printf("getObject(): here mem=%p offset=%d *=%p\n", 
			mem, 
			offset, 
			*((jobject *) (mem + offset)));
	fflush(stdout);
#endif
	return *((jobject *) (mem + offset));
}
/*
 * Class:     org_jnetpcap_packet_JScanner
 * Method:    init
 * Signature: (Lorg.jnetpcap.packet.JScan;)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_packet_JScanner_init
(JNIEnv *env, jobject obj, jobject jscan) {

#ifdef DEBUG
	debug_enter("JScanner_init");
#endif
	if (jscan == NULL) {
		throwException(env, NULL_PTR_EXCEPTION,
				"JScan parameter can not be null");
		return;
	}

	void *block = (char *)getJMemoryPhysical(env, obj);
	size_t size = (size_t)env->GetIntField(obj, jmemorySizeFID);

	memset(block, 0, size);

	scanner_t *scanner = (scanner_t *)block;
	scanner->sc_jscan = env->NewGlobalRef(jscan);
	scanner->sc_len = size - sizeof(scanner_t);
	scanner->sc_offset = 0;
	scanner->sc_packet = (packet_state_t *)((char *)block + sizeof(scanner_t));

	for (int i = 0; i < MAX_ID_COUNT; i++) {
		scanner->sc_scan_table[i] = native_protocols[i];
	}

	for (int i = 0; i < MAX_ID_COUNT; i++) {
		for (int j = 0; j < MAX_ID_COUNT; j++) {
			scanner->sc_heuristics_table[i][j] = native_heuristics[i][j];
		}
	}

	/* Initialize sub-header area - allocate 1/10th */
	scanner->sc_sublen = size / 10;
	scanner->sc_subindex = 0;
	scanner->sc_subheader = (header_t *)malloc(scanner->sc_sublen);

#ifdef DEBUG
	debug_exit("JScanner_init");
#endif

}
Esempio n. 30
0
/*
 * Class:     org_jnetpcap_PcapDumper
 * Method:    dump2
 * Signature: (JIILorg/jnetpcap/nio/JBuffer;II)V
 */
JNIEXPORT void JNICALL Java_org_jnetpcap_PcapDumper_dump2
  (JNIEnv *env, jobject obj,
		  jlong seconds,
		  jint useconds,
		  jint wirelen,
		  jobject jbuffer,
		  jint offset,
		  jint length) {

	if (jbuffer == NULL) {
		throwException(env, NULL_PTR_EXCEPTION, "buffer argument null");
		return;
	}

	pcap_dumper_t *d = getPcapDumper(env, obj);
	if (d == NULL) {
		return; // Exception already thrown
	}

	pcap_pkthdr hdr;
	hdr.ts.tv_sec = (int)seconds;
	hdr.ts.tv_usec = (int) useconds;
	hdr.caplen = (int)length;
	hdr.len = (int) wirelen;

	const u_char *b = (u_char *)getJMemoryPhysical(env, jbuffer);
	if (b == NULL) {
		throwException(env, NULL_PTR_EXCEPTION,
				"Unable to retrieve native address from JBuffer object");
		return;
	}

	jsize size = env->GetIntField(jbuffer, jmemorySizeFID);

	if (offset + length > size || offset < 0 || length < 0) {
		throwException(env, INDEX_OUT_OF_BOUNDS_EXCEPTION, "");
		return;
	}


	pcap_dump((u_char *)d, &hdr, b + offset);
}