리눅스 패킷캡쳐 하고있는데요..
지금 시간당 패킷 캡쳐할려고 하는데 너무 어렵네요.
시간당 캡쳐할려면
소스 중간에
pcap_open_live 부분만 바꿔주면은 되는건가요??ㅠㅠ
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXBYTES2CAPTURE 2048
struct ip *iph;
struct tcphdr *tcph;
float threshold = 10.0;
float syn_rate =0.0;
time_t previous_time =0;
time_t current_time =0;
int num_sample =0;
void processPacket(u_char * useless, const struct pcap_pkthdr* pkthdr, const u_char* packet){
static int count = 1;
struct ether_header *ep;
unsigned short ether_type;
int chcnt =0;
int length = pkthdr->len;
int i;
ep = (struct ether_header *) packet;
packet += sizeof(struct ether_header);
ether_type = ntohs(ep->ether_type);
if(ether_type == ETHERTYPE_IP) {
iph = (struct ip *) packet;
printf("IP Packet\n");
printf("Version : %d\n", iph->ip_v);
printf("Header Len : %d\n", iph->ip_hl);
printf("Src Addr : %s\n", inet_ntoa(iph->ip_src));
printf("Dest Addr : %s\n", inet_ntoa(iph->ip_dst);
// pps 瑜?援ы븷?ㅻ㈃? if 臾??덉뿉???섏젙?대낫??. 留덉?留?ppt 蹂대㈃? ?⑦궥罹≪퀜瑜??좊븣 tcpdump ip (?꾪꽣?섎뒗寃? 'tcp[tcpflags] & (tcp-syn[tcp-fin)!=0 ~~~
if(iph->ip_p == IPPROTO_TCP) {
packet +=iph->ip_hl*4;
tcph = (struct tcp *) packet;
if(tcph->th_flags ==TH_SYN){
if(current_time == 0){
current_time = time();
num_syn=1;
rate = num_syn/60.0 //rate calculation
}
else if(current_time >0){ //泥섏쓬???쒕쾲 ?ㅽ뻾?덉쑝?덇퉸 else if
if (previous_time ==0 ) //?댁쟾?쒓컙 ?ㅼ젙???덈맟?쇰?濡?0
previous_time = current_time;
current_time =time();
if difftime(current_time,previous_time) <60)
rate =(num_syn + 1)/60.0; //rate 珥덈떦怨꾩궛
else if (difftime(current_time,previous_time) >=60)
printf("recent syn packet rate (/sec) is %f",rate);
num_sample++;
avg_rate = (avg_rate*num_sample-1)+rate)/num_sample;
printf("AVG syn packet rate (/sec) is %f",avg_rate);
previous_time = current_time;
num_syn =1;
rate = num_syn/60.0; //rate calculation
}
}
}
if(rate > threshold)
printf(" Alarm !!! the tcp syn scan is occurred~~ \n");
printf("Src Port : %d \n", ntohs(tcph->source));
printf("Dst Port : %d \n", ntohs(tcph->dest));
}
printf("Payload: \n");
for (i=0; ilen; i++) {
if(isprint(packet[i]))
printf("%c ", packet[i]);
else
printf(". ");
if( (i%16 == 0 && i != 0 ) || i == pkthdr->len-1 );
printf("\n");
}
return;
}
int main(int argc, char **argv){
int i=0, count=0;
pcap_t *descr = NULL;
char errbuf[PCAP_ERRBUF_SIZE], *device=NULL;
memset(errbuf, 0, PCAP_ERRBUF_SIZE);
char *net;
char *mask;
bpf_u_int32 netp;
bpf_u_int32 maskp;
struct in_addr addr;
struct bpf_program fp;
device = pcap_lookupdev(errbuf);
printf("Openinig device %s\n", device);
pcap_lookupnet(device,&netp, &maskp,errbuf);
addr.s_addr = netp;
net= inet_ntoa(addr);
printf("NET: %s\n",net);
addr.s_addr = maskp;
mask =inet_ntoa(addr);
printf("MASK: %s\n",mask);
getchar();
descr = pcap_open_live(device, MAXBYTES2CAPTURE, 1, 512, errbuf);
pcap_compile(descr,&fp, argv[2], 0, netp);
pcap_setfilter(descr, &fp);
pcap_loop(descr, atoi(argv[1]), processPacket, (u_char *) &count);
return 0;
}
단순히 시간당 패킷량을 계산하는
단순히 시간당 패킷량을 계산하는 거라면...
/sys/class/net/eth0/statistics/ 에 가보시면 ( eth0 는 다를수도 있습니다. )
rx_packets, tx_packets 이 부분을 1시간 주기로 읽어서 이전값 - 현재값 정도로 하시면 될 듯 싶은데요 ^^;
-----------------------------------------------------
세상은 인간이 해결해야할 문제들로 가득차 있다.
이런것도 있네요..
http://blog.naver.com/PostView.nhn?blogId=h4ck_you&logNo=30130860074&parentCategoryNo=&categoryNo=25&viewDate=&isShowPopularPosts=true&from=search
악용 또는 법을 위반한 해킹의 시도'등에 사용할경우 법적 책임이 있으니 조심하셔야 합니다. ㅇ_ㅇ;;
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기