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

📄 macdisc.c

📁 linux或unix下回话劫持工具
💻 C
字号:
/* * *	This is free software. You can redistribute it and/or modify under *	the terms of the GNU General Public License version 2. * * 	Copyright (C) 1998 by kra * */#include "hunt.h"#include <sys/time.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <assert.h>void mac_discover_range(unsigned int start_ip, unsigned int end_ip, int count){	unsigned int addr, j;	struct timespec ts;	for (j = 1; j <= count; j++) {		for (addr = start_ip;		     ntohl(addr) <= ntohl(end_ip);		     addr = htonl(ntohl(addr) + 1)) {			mac_discover(addr, 1);		}		ts.tv_sec = 0;		ts.tv_nsec = 200000000;		nanosleep(&ts, NULL);	}}void mac_discover(unsigned int ip, int count){	struct arp_spec as;	unsigned char mac_broadcast[ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};	struct timespec ts;	int i;		as.src_mac = my_eth_mac;	as.dst_mac = mac_broadcast;	as.oper = htons(ARPOP_REQUEST);	as.sender_mac = my_eth_mac;	as.sender_addr = my_eth_ip;	as.target_mac = mac_broadcast;	as.target_addr = ip;		ts.tv_sec = 0;	ts.tv_nsec = 100000000;	for (i = 0; i < count; i++) {		send_arp_packet(&as);		if (i < count - 1)			nanosleep(&ts, NULL);	}	/*	 * reply will be received by hunt	 */}/* * arp discovery modul */struct mac_disc_info {	unsigned int start_addr;	unsigned int end_addr;	struct mac_disc_info *next;	};static struct list l_mdi = LIST_INIT(struct mac_disc_info, next);static int  wait_sec = 300;static volatile int  stop_break = 0;static int thr_running = 0;static pthread_t mac_thr;static volatile int stop = 0;static pthread_mutex_t mutex_stop = PTHREAD_MUTEX_INITIALIZER;static pthread_cond_t  cond_stop = PTHREAD_COND_INITIALIZER;static void *mac_disc_thr(void *arg){	struct list_iterator li;	struct mac_disc_info *mdi;	unsigned int addr;	struct timeval tv;	struct timespec ts;	int retval;		pthread_sigmask(SIG_BLOCK, &intr_mask, NULL);	setpriority(PRIO_PROCESS, getpid(), 10);	stop_break = 0;	while (!stop) {		list_iter_set(&li, &l_mdi);		while ((mdi = list_iter_get(&li)) && !stop) {			for (addr = mdi->start_addr; 			     ntohl(addr) <= ntohl(mdi->end_addr) && !stop; 			     addr = htonl(ntohl(addr) + 1)) {				mac_discover(addr, 1);			}		}		list_iter_end(&li);		pthread_mutex_lock(&mutex_stop);		retval = 0;		gettimeofday(&tv, NULL);		ts.tv_sec = tv.tv_sec + wait_sec;		ts.tv_nsec = tv.tv_usec * 1000;		while (!stop && retval != ETIMEDOUT && !stop_break)			retval = pthread_cond_timedwait(&cond_stop, &mutex_stop, &ts);		pthread_mutex_unlock(&mutex_stop);		stop_break = 0;	}	return NULL;}static int start_mac_discovery(void){	if (thr_running) {		printf("mac discoverer already running\n");		return -1;	}	pthread_mutex_init(&mutex_stop, NULL);	pthread_cond_init(&cond_stop, NULL);	stop = 0;	pthread_create(&mac_thr, NULL, mac_disc_thr, NULL);	thr_running = 1;	return 0;}static int stop_mac_discovery(void){	if (!thr_running) {		printf("mac discoverer isn't running\n");		return -1;	}	stop = 1;	pthread_mutex_lock(&mutex_stop);	pthread_cond_signal(&cond_stop);	pthread_mutex_unlock(&mutex_stop);	pthread_join(mac_thr, NULL);	thr_running = 0;	return 0;}void print_mac_daemon(){	if (thr_running) {		if (pthread_kill(mac_thr, 0) != 0) {			pthread_join(mac_thr, NULL);			mac_thr = (pthread_t) 0;			thr_running = 0;			set_tty_color(COLOR_BRIGHTRED);			printf("MAC daemon failed - bug\n");			set_tty_color(COLOR_LIGHTGRAY);		} else			printf("M");	}}/* * print_mac_table is in hunt.c which will receive arp reply */static void mdi_list(void){	struct list_iterator li;	struct mac_disc_info *mdi;	int count = 0;		list_iter_set(&li, &l_mdi);	while ((mdi = list_iter_get(&li))) {		printf("%2d) %-24s - %-24s\n", count++,		       host_lookup(mdi->start_addr, hl_mode),		       host_lookup(mdi->end_addr, hl_mode));		if (count % lines_o == 0)			lines_o_press_key();	}	list_iter_end(&li);}static void mdi_add(void){	struct mac_disc_info *mdi;	unsigned int start_ip, end_ip;		if ((start_ip = menu_choose_hostname("start ip addr", NULL)) == -1)		return;	if ((end_ip = menu_choose_hostname("end ip addr", NULL)) == -1)		return;	assert(mdi = malloc(sizeof(struct mac_disc_info)));	mdi->start_addr = start_ip;	mdi->end_addr = end_ip;	list_enqueue(&l_mdi, mdi);}static void mdi_mod(void){	struct mac_disc_info *mdi;	unsigned int start_ip, end_ip;	int nr;		mdi_list();	if ((nr = menu_choose_unr("choose item", 0, list_count(&l_mdi) - 1, list_count(&l_mdi) - 1)) == -1)		return;	if (!(mdi = list_at(&l_mdi, nr)))		return;	if ((start_ip = menu_choose_hostname("start ip addr", host_lookup(mdi->start_addr, hl_mode))) == -1)		return;	if ((end_ip = menu_choose_hostname("end ip addr", host_lookup(mdi->end_addr, hl_mode))) == -1)		return;	mdi->start_addr = start_ip;	mdi->end_addr = end_ip;}static void mdi_del(void){	int i;	struct mac_disc_info *mdi;		mdi_list();	i = menu_choose_unr("item nr. to delete", 0, 			   list_count(&l_mdi) - 1, -1);	if (i >= 0) {		mdi = list_remove_at(&l_mdi, i);		free(mdi);	}}static void mdi_time_wait(void){	int min, sec;		min = wait_sec / 60;	sec = wait_sec % 60;	if ((min = menu_choose_unr("choose time interval min", 0, 1000, min)) == -1)		return;	if ((sec = menu_choose_unr("choose time interval sec", 0, 10000, sec)) == -1)		return;	wait_sec = min * 60 + sec;		stop_break = 1;	pthread_mutex_lock(&mutex_stop);	pthread_cond_signal(&cond_stop);	pthread_mutex_unlock(&mutex_stop);}void mac_disc_menu(void){ 	char *m_menu =  "s/k)   start/stop daemon\n"			"l)     list discoverer setup     h) list HW mac addresses\n"			"t)     time to sleep\n"			"a/m/d) add/mod/del entry\n"			"x)     return\n";	char *m_keys = "sklhtadmx";	int run_it;	run_it = 1;	while (run_it) {		switch (menu("mac discoverer daemon", m_menu, "macd", m_keys, 0)) {		    case 's':			start_mac_discovery();			break;		    case 'k':			stop_mac_discovery();			break;		    case 'l':			mdi_list();			break;		    case 'h':			print_mac_table();			break;		    case 't':			mdi_time_wait();			break;		    case 'a':			mdi_add();			break;		    case 'm':			mdi_mod();			break;		    case 'd':			mdi_del();			break;		    case 'x':			run_it = 0;			break;		}	}}

⌨️ 快捷键说明

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