tcp cheksum 계산방법요
어플리케이션 레벨에서 패킷이 들어오면 tcp 헤더의 값중에 FIN 이나 RST 값을 변경하여 보내려고 하는데요
체크섬 계산하는 소스를 찾아서 테스트 중인데요
ip header checksum 은 제대로 나오는데
tcp header checksum 은 계속 다르게 나오네요
모가 문제인지.....쩝
struct pseudo_header {
u_int32_t saddr;
u_int32_t daddr;
u_int8_t useless;
u_int8_t protocol;
u_int16_t tcplength;
};
unsigned short in_cksum(unsigned short *ptr, int nbytes)
{
register long sum;
u_short oddbyte;
register u_short answer;
sum = 0;
while (nbytes > 1) {
sum += *ptr++;
nbytes -= 2;
}
if (nbytes == 1) {
oddbyte = 0;
*((u_char *) &oddbyte) = *(u_char *)ptr;
sum += oddbyte;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return(answer);
}
change_tcp() {
struct pseudo_heaer phdr;
printf("hahah ip check : %x \n", tp->iph->check);
tp->iph->check = 0;
tp->iph->check = in_cksum(tp->iph, 20);
printf("hahah check2 : %x \n", tp->iph->check);
memset(&phdr, 0, sizeof(struct pseudo_header));
phdr.saddr = tp->iph->saddr;
phdr.daddr = tp->iph->daddr;
phdr.useless = 0;
phdr.protocol = tp->iph->protocol;
phdr.tcplength = htons(ntohs(tp->iph->tot_len)-20);
totLen = sizeof(struct pseudo_header) + ntohs(tp->iph->tot_len) - 20;
/*
if ( totLen % 2 != 0 ) totLen++;
*/
if ( NULL == (newpkt = (unsigned char *)malloc(totLen))) goto test;
memset(newpkt, 0, totLen);
memcpy(newpkt, &phdr, sizeof(struct pseudo_header));
memcpy(newpkt + sizeof(struct pseudo_header), tp->tcph, ntohs(tp->iph->tot_len) - 20);
printf("hahah tcp check : %x \n", tp->tcph->check); <= <1>
tp->tcph->check = 0;
tp->tcph->check = in_cksum(newpkt, totLen);
printf("hahah tcp check2 : %x \n", tp->tcph->check); <= <2> // <1> 과 <2> 결과값이 다릅니다.
free(newpkt);
}
이룬..
이룬..
소스를 자세히 안 보고 리플을 달았더니 실수를 :)
sum 변수를 32bit로 해주고..
마지막 sum 16 bit씩 더할 때 while로 해주는게 좋을 것 같네요.
아래 링크를 한 번
아래 링크를 한 번 참고해 보세요.
http://www.netfor2.com/tcpsum.htm
댓글 달기