このサイトから: http://www.enderunix.org/docs/en/rawipspoof/
次の関数をプルしました
unsigned short in_cksum(unsigned short *addr, int len)
{
int nleft = len;
int sum = 0;
unsigned short *w = addr;
unsigned short answer = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(unsigned char *) (&answer) = *(unsigned char *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}
unsigned short in_cksum_tcp(int src, int dst, unsigned short *addr, int len)
{
struct psd_tcp buf;
u_short ans;
memset(&buf, 0, sizeof(buf));
buf.src.s_addr = src;
buf.dst.s_addr = dst;
buf.pad = 0;
buf.proto = IPPROTO_TCP;
buf.tcp_len = htons(len);
memcpy(&(buf.tcp), addr, len);
ans = in_cksum((unsigned short *)&buf, 12 + len);
return (ans);
}
ただし、受信 TCP パケットに対してこれを実行すると、現在と同じチェックサム結果が得られません (チェックサム関数を実行する前に、受信 TCP チェックサムを保存し、パケットのチェックサムをゼロに設定します)。 )
ここで、IP ヘッダーに対して「in_cksum」を実行すると、正しい答えが得られます。
そのサイトの TCP 疑似ヘッダーは次のとおりです。
struct psd_tcp {
struct in_addr src;
struct in_addr dst;
unsigned char pad;
unsigned char proto;
unsigned short tcp_len;
struct tcphdr tcp;
};
これを機能させるために何かが欠けていますか?