- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试修改进入我的电脑的 ip 数据包。我正在使用 iptables 对数据包进行排队,并使用 libnetfilter_queue 库来修改数据包,实际上是一些 http-header 内容。即使我更改了单个字符,数据包也会被拒绝,这很可能是由于 tcp 校验和的更改。所以,我正在尝试重新计算修改后的数据包的 tcp 校验和。最初,为了测试校验和功能,我没有修改数据包,只是重新计算校验和。但是计算出的校验和,与原来的不匹配。这是校验和函数:`
unsigned short tcp_sum_calc(unsigned short len_tcp, unsigned short src_addr[],unsigned short dest_addr[], unsigned short buff[])
{
unsigned char prot_tcp=6;
unsigned long sum;
int nleft;
unsigned short *w;
sum = 0;
nleft = len_tcp;
w=buff;
/* calculate the checksum for the tcp header and payload */
while(nleft > 1)
{
sum = sum + ntohs(*w);
w++;
nleft = nleft - 2;
}
/* if nleft is 1 there ist still on byte left. We add a padding byte (0xFF) to build a 16bit word */
if(nleft>0)
{
cout<<"check out";
// sum += *w&0xFF;
sum += ntohs(*w&0xFF00); // is this the correct way of doing
}
/* add the pseudo header */
sum += ntohs(src_addr[0]);
sum += ntohs(src_addr[1]);
sum += ntohs(dest_addr[0]);
sum += ntohs(dest_addr[1]);
sum += len_tcp;
sum += prot_tcp;
// keep only the last 16 bits of the 32 bit calculated sum and add the carries
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
// Take the one's complement of sum
sum = ~sum;
return ((unsigned short) sum);
}
这里是libnetfilter_queue模块的回调函数:
static int analyzeResponse(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,struct nfq_data *nfa, void *data)
{
int len=0,id=0;
struct iphdr *ip;
struct tcphdr *tcp;
char *pktData;
string tempPkt;
unsigned short chksum=0,ip_hdr_len,tcp_len;
unsigned int src_ip, des_ip;
struct nfqnl_msg_packet_hdr *pktHeader;
pktHeader = nfq_get_msg_packet_hdr(nfa);
if (pktHeader)
{
id = ntohl(pktHeader->packet_id);
}
len = nfq_get_payload ( ( struct nfq_data * ) nfa, (char**)&ip );
if(len)
{
pktData=(char*)ip;
ip_hdr_len=(unsigned short)(pktData[0]&0x7);
src_ip=ip->saddr;
des_ip=ip->daddr;
int pos;
tempPkt.assign(pktData,len);
pos=tempPkt.find("teststring",0);
tempPkt.replace("teststring");
pktData=(char*)tempPkt.c_str();
tcp = (struct tcphdr*) (pktData + (4*ip_hdr_len));
cout<<"*********************************************************************************";
cout<<ip_hdr_len;
cout<<"\ntcp checksum: "<<tcp->check;
cout<<"\nip packet length: "<<ip->tot_len;
cout<<"\nip packet length_calc: "<<len;
cout<<"\nip source address: "<<src_ip;
cout<<"\nip destination address: "<<des_ip;
cout<<"*********************************************************************************";
tcp->check=0;
tcp_len=len - (4*ip_hdr_len);
chksum = tcp_sum_calc(tcp_len, (unsigned short *) &src_ip, (unsigned short *) &des_ip, (unsigned short *) &tcp);
tcp->check=chksum;
cout<<"\nnew checkksum: "<<chksum;
return nfq_set_verdict(qh, id, NF_ACCEPT, len, (unsigned char*)pktData);
}
return nfq_set_verdict(qh, id, NF_ACCEPT, len, (unsigned char*)pktData);
}
这是输出:
5
tcp checksum: 11687
ip packet length: 54017
ip packet length_calc: 467
ip source address: 1719453657
ip destination address: 2569775296
new checkksum: 36507
`
最佳答案
看起来您没有更正数据的字节序,也没有更正伪 header 。原始数据是大端,但英特尔架构是小端。因此,您需要在直接添加之前交换单词的字节——您可以使用 ntohs()
。
查看此 example .
关于计算出的 tcp 校验和与原始 tcp 校验和不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939232/
如何在 PHP 中生成 CRC-8 校验和? 最佳答案 function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 CRC 操作的 XOR 函数的返回值时,它总是打印 0。我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚! 这是我的
ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下: 显示验证码 首先在Home/Controller下创建一个公共控制器PublicController
我想将自定义验证绑定(bind)到 TimePicker 自定义控件,但下面的代码显示“无法将内容添加到 TimePicker 的对象类型。”。
目录 Spring 校验(validator,JSR-303)实现 什么是JSR-303规范 与Spring MVC结合 实体类添加
导包和配置 导入 JSR 303 的包、hibernate valid 的包 ?
我是一名优秀的程序员,十分优秀!