TCP 체크섬. 도와주세요 ㅠ.ㅠ

declspec의 이미지

리눅스상에서
패킷변조를 하면서
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;
}

혹시 어디가 잘못됬는지 알려주시는 분은 정말정말 감사드릴게요 ㅠ.ㅠ
아니면 실수할 법한 것에 대한 조언이라도 해주시면 감사하겠습니다 ㅠㅠ

shint의 이미지

http://blog.naver.com/seokcrew/30086075847

저는 그냥 데이터 합치기만 하면 될줄 알았는데... 아닌가보네요.?

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

declspec의 이미지

해결됬습니다
뭐가 원인이었는지는 모르겠지만;;
체크섬 계산하는 함수가 뭔가 살짝 잘못됬던거였는지
그걸 다른거로 교체하니까 되네요 ㅋㅋ
아무래도 패딩 바이트에 대한 처리가 이상하게 됬던듯 합니다

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.