TCP 체크섬. 도와주세요 ㅠ.ㅠ
리눅스상에서
패킷변조를 하면서
TCP 체크섬을 재계산 하려고 합니다.
pseudo header 12 바이트를 구성했으면
그것과 TCP헤더 ~ 데이터 마지막까지.
를 하나의 배열로 쭉 이어져 있도록 놓고
일단은 TCP 체크섬부분은 0 으로 채우고.
2바이트씩 잘라서 전부 더한다음에
1바이트가 남는다면 그것도 0 을 패딩넣어서 더해주고.
2바이트 초과하는 부분을 다시 2바이트에 더하고
맨마지막에 전체 비트반전.
이렇게 해서 2바이트를 만들면
그게 체크섬 아닌가요?ㅠㅠ
근데 지금 체크섬 구하는 함수를 만들었는데
이게 맞다가, 틀렸다가, 맞다가, 틀렸다가
계속 막 이러네요 ㅠ.ㅠ
틀려도 아주 미세하게 틀립니다 ㅠㅠ
45FE -> 46FE 이런식으로...
어디가 잘못된건지 한참 헤메고있는데 도와주세요 ㅠ.ㅠ
먼저 pseudo header 부터 데이터 끝까지를 담는 구조체를
아래와같이 선언했습니다.
#pragma pack(1)
struct pseudohdr{
unsigned int sip;
unsigned int dip;
unsigned short protocol;
unsigned short len;
unsigned char payload[1500];
};
#pragma pack()
struct pseudohdr pshdr; // 전역변수
그리고 아래와같이 재계산 했습니다
tcph 는 tcp헤더부분 포인터이고
iph 는 ip헤더부분 포인터이고
buf 는 이더넷 프레임 시작부분 포인터입니다.
먼저 기존의 체크섬을 0 으로 채웁니다
tcph->check = (unsigned short)0x00;
그리고 체크섬 계산용 구조체를 모두 0으로 채웁니다.
memset(&pshdr, 0, sizeof(pshdr));
아래처럼 pseudo header 를 채웁니다.
pshdr.sip = iph->saddr;
pshdr.dip = iph->daddr;
pshdr.protocol = htons(iph->protocol);
pshdr.len = htons(r-34);
그리고 아래처럼 원본 tcp헤더부터 데이터 끝까지를 쭉 연이어서 복사해줍니다. r 은 이더넷 프레임의 총 바이트 길이입니다
memcpy( pshdr.payload, &buf[34], r-34 ); // make tcp pseudo header
그리고 체크섬 함수를 호출합니다. pad 는 r%2 입니다.(패딩용)
tcph->check = checksum_calc( (r-34+12+pad)/2, (unsigned short*)&pshdr );
printf("check after: %04X\n", tcph->check);
그런데 결과가 한 10번중 4번은 올바르게 계산되고 6번정도는 살짝 다르게 계산되네요 ㅠㅠ
아예 틀리는거도 아니고 맞았다가 틀렸다가 하니까 정말 미치겟네요 ㅠㅠ 어디가 잘못된건지... ㅠ.ㅠ
아래는 체크섬 구하는 함수입니다. 단순하게 2바이트씩 쭉 더하고 마지막에 비트반전하고...
이걸로 IP 체크섬은 항상 옳게 구했으므로 이 함수는 이상 없을겁니다 ㅠㅠ
unsigned short checksum_calc(unsigned short len, unsigned short buff[]){
unsigned short word;
unsigned int sum=0;
unsigned short i;
for(i=0; i
sum += (unsigned int)buff[i];
}
while(sum>>16)
sum = (sum & 0xFFFF) + (sum>>16);
sum = ~sum;
return (unsigned short)sum;
}
혹시 어디가 잘못됬는지 알려주시는 분은 정말정말 감사드릴게요 ㅠ.ㅠ
아니면 실수할 법한 것에 대한 조언이라도 해주시면 감사하겠습니다 ㅠㅠ
이거 한번 참고해보세요
http://blog.naver.com/seokcrew/30086075847
저는 그냥 데이터 합치기만 하면 될줄 알았는데... 아닌가보네요.?
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
해결
해결됬습니다
뭐가 원인이었는지는 모르겠지만;;
체크섬 계산하는 함수가 뭔가 살짝 잘못됬던거였는지
그걸 다른거로 교체하니까 되네요 ㅋㅋ
아무래도 패딩 바이트에 대한 처리가 이상하게 됬던듯 합니다
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
댓글 달기