pcap 코드 관련 질문드립니다.
돌삥
질문 제목 :pcap 코드 관련 질문드립니다.
질문 내용 :pcap을 이용하여 처음에 SYN패킷을 하나 잡아 서버로 1~65535까지의 모든 포트에 SYN패킷을 보내 ACK,SYN패킷을 보내는 즉 응답하는 포트를 찾는 코드를 작성하였습니다.아래 코드가 메인에서 실제로 SYN패킷을 보내고 ACK,SYN패킷을 받는 코드구요.
struct pcap_pkthdr *header;
struct pcap_pkthdr *send_header;
const unsigned char *send_data;
const unsigned char *pkt_data;
int res;
while((res=pcap_next_ex(fp, &send_header, &send_data))=0){
if (res==0) continue;
break;
}
unsigned short port = 1;
unsigned short r_port[65535];
int index = 0;
bool jud = false;
pkt_data = NULL;
for(;;){
tcp_header(send_data, port);
if(port!=0){
if(pcap_sendpacket(fp, send_data,send_header-caplen)!=0)
printf(err in packet send:%s\n, pcap_geterr(fp));
port++;
}
if((res=pcap_next_ex(fp, &header, &pkt_data))=0){
if(pkt_data!=NULL && tcp_header(pkt_data)!=0){
for(int i=0;iindex;i++){
if(r_port[i]==tcp_header(pkt_data)){
jud = true;
break;
}
}
if(jud==false){
r_port[index] = tcp_header(pkt_data);
printf(%d\t, r_port[index]);
index++;
}
jud = false;
}
}
}
여기서 문제가 malformat으로 보내는 패킷이 너무 많다는 것입니다.
그 이유를 제가 찾아본 결과
pcap_sendpacket(fp, send_data,send_header-caplen)!=0
이 부분에서 send_header-caplen이 불규칙적으로 변하여 패킷이 중간에 짤려 보내졌습니다.
그래서send_header-caplen을 처음에 잡은 패킷의 길이인 66으로
pcap_sendpacket(fp, send_data,66)!=0
으로 변경으로 변경하여 보냈더니 패킷이 정상적인 길이로 모두 보내지지만
원래 ACK,SYN패킷이 와야하는 포트에서 RST,ACK패킷이 도착하거나
TCP ackedCP acked lost segment 패킷이 도착하였습니다.
뭐가 문제인지 좀 확인해 주셨으면 좋겠습니다.
아래는 각각 역할을 하는 함수들입니다.unsigned short in_checksum(unsigned short *ptr, int nbytes){
register long sum;
unsigned short oddbyte;
register short answer; sum=0;
while(nbytes1){
sum += *ptr++;
nbytes-=2;
}
if(nbytes==1){
oddbyte=0;
*((u_char*)&oddbyte)=*(u_char*)ptr;
sum+=oddbyte;
} sum = (sum16)+(sum & 0xffff);
sum = sum + (sum16);
answer = (SHORT)~sum; return(answer);
}unsigned short ip_header(const unsigned char *pkt_data){ //ip헤더 프린트 함수
struct ip_header { //ip헤더 structure
unsigned char ip_header_len:4;
unsigned char ip_version:4;
unsigned char ip_tos;
unsigned short ip_total_length;
unsigned short identification;
unsigned char ip_frag_offset:5; //frag_offset 앞 3bit
unsigned char ip_more_fragment:1; //frag 1bit씩 3개
unsigned char ip_dont_fragment:1;
unsigned char ip_reserved_zero:1;
unsigned char ip_frag_offset1; //frag_offset 뒤 8bit
unsigned char ttl;
unsigned char protocol;
unsigned short header_checksum;
unsigned int ip_srcaddr;
unsigned int ip_destaddr;
}; struct ip_header *ih; //ip헤더 structure ih
ih = (struct ip_header *)(pkt_data+14); //ih에 pkt_data에 + 이더넷헤더 14하여 연결
ih-header_checksum = 0;
ih-header_checksum = in_checksum((unsigned short *)ih, 20);
return (ntohs(ih-ip_total_length) - (ih-ip_header_len * 4));
}void tcp_header(const unsigned char *pkt_data, unsigned short port){ //tcp헤더 프린트 함수
struct tcp_header { //tcp 헤더 structure
unsigned short source_port;
unsigned short dest_port;
unsigned int seq_num;
unsigned int ack_num;
unsigned char ns:1;
unsigned char reserved_part1:3;
unsigned char data_offset:4;
unsigned char fin:1;
unsigned char syn:1;
unsigned char rst:1;
unsigned char psh:1;
unsigned char ack:1;
unsigned char urg:1;
unsigned char ecn:1;
unsigned char cwr:1;
unsigned short window_size;
unsigned short checksum;
unsigned short urg_pointer;
}; struct tcp_header *th; //tcp header structure th선언
th = (struct tcp_header *)(pkt_data+34); //th를 pkt_data+이더넷 헤더 14 + IP헤더 20을 연결
th-dest_port = htons(port);
th-checksum = 0;
unsigned short tcp_header_len = ip_header(pkt_data);
struct pseudo_header{
unsigned int source_address;
unsigned int dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
};
struct pseudo_header psh;
psh.source_address = inet_addr(192.168.123.107); //my ip
psh.dest_address = inet_addr(165.246.38.157); //server ip
psh.placeholder = 0;
psh.protocol = 6;
psh.tcp_length = htons(tcp_header_len); unsigned char *seudo;
seudo = (unsigned char *)malloc(sizeof(struct pseudo_header) + tcp_header_len);
memcpy(seudo, &psh, sizeof(struct pseudo_header));
memcpy(seudo + sizeof(struct pseudo_header), th, tcp_header_len); th-checksum = in_checksum((unsigned short *)seudo, sizeof(struct pseudo_header) + tcp_header_len);
}unsigned short tcp_header(const unsigned char *pkt_data){ //tcp헤더 프린트 함수
struct tcp_header { //tcp 헤더 structure
unsigned short source_port;
unsigned short dest_port;
unsigned int seq_num;
unsigned int ack_num;
unsigned char ns:1;
unsigned char reserved_part1:3;
unsigned char data_offset:4;
unsigned char fin:1;
unsigned char syn:1;
unsigned char rst:1;
unsigned char psh:1;
unsigned char ack:1;
unsigned char urg:1;
unsigned char ecn:1;
unsigned char cwr:1;
unsigned short window_size;
unsigned short checksum;
unsigned short urg_pointer;
}; struct tcp_header *th; //tcp header structure th선언
th = (struct tcp_header *)(pkt_data+34); //th를 pkt_data+이더넷 헤더 14 + IP헤더 20을 연결
if(th-syn==1 && th-ack==1)
return ntohs(th-source_port);
else
return 0;
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692451 | 이 문제좀 풀어주세요 ^^ | 게자리 | 2025-04-23 |
2692424 | 2차원배열 자료입력질문이요! (1) | 똘끼 | 2025-04-22 |
2692401 | 유닉스안에서 C언어를 이용한 명함 만들기 입니다; 이해안가는 부분이있네요 | 2gether | 2025-04-22 |
2692374 | 고수님들 댓글 마니부탁해요!!! (2) | 엄지 | 2025-04-22 |
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |