如何winhex怎么修改tot包

LG G3 D858HK tot底包 - LG G3 - 奇兔论坛-安卓智能手机刷机,刷机包,刷机工具,刷机教程_奇兔刷机官方论坛 -
Powered by Discuz! Archiver
LG G3 D858HK tot底包
地址已给出,请叫我雷锋
**** Hidden Message *****
刚才上线看到很多朋友都在问刷机方法,这两天比较忙,大致跟大家说一下刷机步骤。多探索,会成功的。
其实方法很简单
2、改型号,D858与D857均可直接修改system/build.prop 。其中有一段为ro.product.model=LG-D858(D857),改为ro.product.model=LG-D858HK(有人说要改有人说不用改,我的是需要改的,用的机器为D857,不修改型号刷机时就会出现Cross DL D858 TO D858HK ,大家可自行尝试)
3、保存退出并关机,然后进入刷机模式。tot刷机教程大家去搜索一下。(刷机.dll用坛子里的万能dll就可以了)
4、大功告成!
刷机有风险,大家请谨慎。root也很有可能会让你失去保修。再次提醒,改型号一定要谨慎,如果修改不当会导致无限重启,开不了机。提前备份好build.prop ,如出现无限重启 刷入对应型号tot底包即可恢复!
注:有朋友碰到刷机工具升级被提示版本号不对,无法继续的问题,也就是Cross DL D858 TO D858HK 我昨晚刷机也卡在这里很久,这是因为版本号的问题,需要修改system/build.prop这个文件
其中有一段为ro.product.model=LG-D858,改为ro.product.model=LG-D858HK 保存退出再进入刷机模式,这就需要root 并且通过r.e浏览器进行修改。改过之后就能刷过去了。记得提前备份好原文件,有备无患。
看完楼主的帖子,我的心情竟是久久不能平静。
楼主的帖子实在是写得太好了。
看完楼主的帖子,我的心情竟是久久不能平静。
看到你的帖子,我脑海中冒出一个字,顶!
感谢楼主为我们广大机友谋福利!
楼主的帖子实在是写得太好了。
很喜欢这个包包,支持大神!
看到你的帖子,我脑海中冒出一个字,顶!
很喜欢这个包包,支持大神!
查看完整版本:后使用快捷导航没有帐号?
一步搞定
只需一步,快速开始
查看: 1407|回复: 2
在线时间96 小时最后登录阅读权限20UID
, 积分 181, 距离下一级还需 19 积分
注册时间积分181精华0主题帖子 金币613 元 智豆0 点
WINHEX修改tot怎么减小一位,我按回车键去掉的时候刷机显示Notdefine
手机LG G3在线时间694 小时最后登录阅读权限30UID
, 积分 1070, 距离下一级还需 130 积分
注册时间积分1070精华0主题帖子 金币2386 元 智豆0 点
你万能DLL 试过了吗? 不行再修改TOT 比较好
当年我们还小,起的网名或酷炫或装逼或文艺小清新再或者狂拽杀马特......别害羞,告诉我你用过的第一个网名是啥?
Powered by基于netfilter的tcp网络包的过滤与修改(修正版)
基于netfilter的tcp网络包的过滤与修改(修正版)
一直对公司封掉mp3文件的下载耿耿于怀,上次写的那个netfilter驱动还是有点问题,修改后的后续tcp网络包的序号还是有问题。最近有空,仔细看了下内核里面的代码,结合别人你的代码研究一下。更正如下,改正之后&打开网址/1.mp3&这个内核模块就可以自动帮我把地址改为&&&&/1.mp%3&,&哈哈,这样就可以穿透公司的防火墙了,他们没有过滤这个地址。这样就可以打开百度音乐播放器在线听歌了,不然会被过滤掉。哈哈希望不会很快被公司那些人检测到。
linux/module.h&
linux/moduleparam.h&
linux/kernel.h&
inux/skbuff.h&
linux/ip.h&
linux/tcp.h&
net/tcp.h&
net/udp.h&
linux/netfilter.h&
linux/netfilter_ipv4.h&
net/sock.h&
MODULE_LICENSE("GPL");&//用了nf_conntrack_tcp_update&函数要用这个遵守GPL开放协议才能编译通过
//MODULE_LICENSE("copyright&(c)&2009&widebright");
MODULE_AUTHOR("widebright");
MODULE_DESCRIPTION("widebright's&netfilter");
MODULE_VERSION("1.0");
static&void&hex_dump(const&unsigned&char&*buf,&size_t&len)&{
&&&&&size_t&i;
&&&&&for&(i&=&0;&i&&&&i++)&{
&&&&&&&&&&if&(i&&&&!(i&%&16))
&&&&&&&&&&&&&&&printk("\n");
&&&&&&&&&&printk("x&",&*(buf&+&i));
&&&&&printk("\n");
char&*&is_mp3_request(char&*&start)&{
&&&&&char&data[4]&=&".mp3";
&&&&&char&*&i&=&
&&&&&i&+=&4;&//跳过&GET
&&&&&while&(*i&!=&'&'&&&&*i&!=&'\n')
&&&&&&&&&&i++;&//查找网络地址最后的位置
&&&&&if&(*(int&*)&(i&-&4)&==&*(int&*)&data)
&&&&&&&&&&return&i;
&&&&&&&&&&return&NULL;
unsigned&int&check_link_address(unsigned&int&hooknum,&struct&sk_buff&*skb,
&&&&&&&&&&const&struct&net_device&*in,&const&struct&net_device&*out,&int(*okfn)(
&&&&&&&&&&&&&&&&&&&&struct&sk_buff&*))&{
&&&&&char&*&payload&=&NULL;
&&&&&const&struct&iphdr&*iph&=&NULL;
&&&&&struct&tcphdr&*tcph&=&NULL;
&&&&&__be32&daddr,&
&&&&&__be16&dport,&
&&&&&int&oldlen,&
&&&&&struct&rtable&*rt&=&skb-&
&&&&&enum&ip_conntrack_info&
&&&&&//Note&that&the&connection&tracking&subsystem
&&&&&//is&invoked&after&the&raw&table&has&been&processed,&but&before&the&mangle&table.
&&&&&//所以下面&要指定.priority&=&NF_IP_PRI_MANGLE&&nf_ct_get&才会返回有效的值
&&&&&struct&nf_conn&*ct&=&nf_ct_get(skb,&&ctinfo);
&&&&&iph&=&ip_hdr(skb);
&&&&&if&(iph-&protocol&==&IPPROTO_TCP)&{
&&&&&&&&&&//if&(&skb-&sk-&sk_protocol&==&&IPPROTO_TCP&)&{&用这个应该也可以的
&&&&&&&&&&tcph&=&(void&*)&iph&+&iph-&ihl&*&4;
&&&&&&&&&&//saddr&=&iph-&
&&&&&&&&&&//sport&=&tcph-&
&&&&&&&&&&daddr&=&iph-&
&&&&&&&&&&dport&=&tcph-&
&&&&&&&&&&if&(likely(ntohs(dport)&!=&80))&{
&&&&&&&&&&&&&&&return&NF_ACCEPT;&//忽略不是远程&80&端口的包,http&server一般都是80端口了
&&&&&&&&&&}
&&&&&&&&&&//&printk("tcp&packet&to&:&%u.%u.%u.%u:%u\n",
&&&&&&&&&&//&&&&&NIPQUAD(daddr),ntohs(dport));
&&&&&&&&&&//&printk("---------ip&total&len&=%d--------\n",&ntohs(iph-&tot_len));
&&&&&&&&&&//&printk("---------tcph-&doff&=%d--------\n",&tcph-&doff*4);
&&&&&&&&&&
&&&&&&&&&&if&(0&!=&skb_linearize(skb))&{
&&&&&&&&&&&&&&&return&NF_ACCEPT;
&&&&&&&&&&}
&&&&&&&&&&//&payload&=&(void&*)tcph&+&tcph-&doff*4;&skb_linearize(skb)&调用之后,skb被重新构建了,之前的tcp指向的不是正确的地址了。
&&&&&&&&&&payload&=&(void&*)&skb-&data&+&40;&//我的机器上tcph-&doff*4&+&iph-&ihl*4&&等于40,&就是从data里面偏移出前面的ip包头和tcp包头
&&&&&&&&&&//tcp&包长度&ntohs(iph-&tot_len)&-&iph-&ihl*4&-&tcph-&doff*4
&&&&&&&&&&//hex_dump(payload&,ntohs(iph-&tot_len)&-&iph-&ihl*4&-&tcph-&doff*4);
&&&&&&&&&&&&&
&&&&&&&&&&if&(0&==&strncmp(payload,&"GET",&3))&{
&&&&&&&&&&&&&&&char&*&head&=&is_mp3_request(payload);
&&&&&&&&&&&&&&&if&(head)&{
&&&&&&&&&&&&&&&&&&&&//刚刚发现把&/1.mp3&改成&&&&/1.mp3&就可以跳过网关的检测了,mp3&是mp3的html编码
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&//nf_nat_mangle_tcp_packet&是netfilter&nat模块里面的导出函数,所以需要nat模块加载之后才能进行的。
&&&&&&&&&&&&&&&&&&&&//如果你没有配置内核自动加载这个模块,好像执行一下“sudo&iptables&-t&nat&--list”&命令就会加载起来。
&&&&&&&&&&&&&&&&&if&(ct&&&&nf_nat_mangle_tcp_packet(skb,&ct,&ctinfo,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(char*)&head&-&(char&*)payload&-3&,&3,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(char&*)&"mp3",&sizeof("mp3")-1&))&{
&&&&&&&&&&&&&&&&&&&&&&&&&printk("-----------------nf_nat_mangle_tcp_packet--------------------\n
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&payload);
&&&&&&&&&&&&&&&&&&&&&&&&&return&NF_ACCEPT;
&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&//wineshark&抓包说明后续tcp包的序号依然不对,原因是修改后,tcp的需要加上&增加的字节,但系统不知道这个改变,所以下次还是用以前的&序号来发送数据,
&&&&&&&&&&&&&&&//所以后面的包的序号就不对了.&在/net/ipv4/tcp_output.c&中的tcp_transmit_skb函数中,可以看到系统是如何填写这个数据的。但在hook的时候无法
&&&&&&&&&&&&&&&//得到tcp层的信息,本来想一劳永逸的把初始序号改正确的但无法做到。只好hook没个包的时候都把序号改正过来了。
&&&&&&&&&&&&&&&//nf_nat_mangle_tcp_packet修改tcp包后,会记录下需要调整的seq的序列(参考内核源代码/net/ipv4/netfilter/nf_nat_helper.c&文件爱你里面的
&&&&&&&&&&&&&&&//adjust_tcp_sequence函数,他把需要调整的信息记录在两个&struct&nf_nat_seq结构里面了。)但没有看到自动对后续的网络国包进行处理了。
&&&&&&&&&&&&&&&//所以需要在另外的hook里面把标识出来的需要修复序号的包都,调用一下seq修复函数nf_nat_seq_adjust,把后面所有tcp包的seq都进行修复。
&&&&&&&&&&&&&&&//这个工作如果你的修改导致包的长度改变的都需要作。conntrack模块里面会调用helper&module的
&&&&&&&&&&&&&&&//nf_nat_seq_adjust_hook函数来作这个工作的。参考&内核源代码的&/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c&中的ipv4_confirm函数
&&&&&&&&&&&&&&&//但没看到调用nf_nat_seq_adjust&函数的地方,所以我自己又加了两个hook来捕获后续网络包,显示的调用nf_nat_seq_adjust&函数。
&&&&&&&&&&&&&&&//nf_nat_seq_adjust&函数在net/ipv4/netfilter/nf_nat_helper.c&文件的里面有,但没有导出,所以我把他复制过来了,不过&注意不同的内核扳本有所不同
&&&&&&&&&&&&&&&//如果编译有问题,就去把对应的内核源代码中的几个函数复制出来吧。
&&&&&&&&&&&&&&&return&NF_ACCEPT;
&&&&&&&&&&&&&&&&&//不用&nf_nat_mangle_tcp_packet&函数来修改感到话,虽然下面修改办法没有问题,但计算tcp校验和和序列号的结果不对。
&&&&&&&&&&&&&&&&&&&&char&*end&=&skb_put(skb,&9);&//希望skb的buffer的容两可以继续在尾部加上9个字节的数据,不然这个会导致BUG()触发,http请求数据不会太大吧。
&&&&&&&&&&&&&&&&&&&&//memmove(
&&&&&&&&&&&&&&&&&&&&while&(end&&&head)&{
&&&&&&&&&&&&&&&&&&&&&&&&&end--;
&&&&&&&&&&&&&&&&&&&&&&&&&*(end&+&9)&=&*
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&memcpy(head,&"mp3",&9);
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&ip_hdr(skb)-&tot_len&=&htons(skb-&len);
&&&&&&&&&&&&&&&&&&&&ip_send_check(ip_hdr(skb));
&&&&&&&&&&&&&&&&&&&&//计算校验和,参考内核源码&的net/ipv4/tcp_ipv4.c&tcp_v4_send_check函数
&&&&&&&&&&&&&&&&&&&&//和net/ipv4/netfilter/nf_nat_helper.c&nf_nat_mangle_tcp_packet&函数
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//和net/netfilter/xt_TCPMSS.c&的&tcpmss_mangle_packet&函数
&&&&&&&&&&&&&&&&&&&&datalen&=&skb-&len&-&iph-&ihl&*&4;
&&&&&&&&&&&&&&&&&&&&oldlen&=&datalen&-&9;
&&&&&&&&&&&&&&&&&&&&if&(skb-&ip_summed&!=&CHECKSUM_PARTIAL)&{
&&&&&&&&&&&&&&&&&&&&&&&&&if&(!(rt-&rt_flags&&&RTCF_LOCAL)&&&&skb-&dev-&features
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NETIF_F_V4_CSUM)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&skb-&ip_summed&=&CHECKSUM_PARTIAL;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&skb-&csum_start&=&skb_headroom(skb)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&skb_network_offset(skb)&+&iph-&ihl&*&4;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&skb-&csum_offset&=&offsetof(struct&tcphdr,&check);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tcph-&check&=&~tcp_v4_check(datalen,&iph-&saddr,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&iph-&daddr,&0);
&&&&&&&&&&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tcph-&check&=&0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tcph-&check&=&tcp_v4_check(datalen,&iph-&saddr,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&iph-&daddr,&csum_partial(tcph,&datalen,&0));
&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}&else
&&&&&&&&&&&&&&&&&&&&&&&&&inet_proto_csum_replace2(&tcph-&check,&skb,&htons(oldlen),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&htons(datalen),&1);
&&&&&&&&&&&&&&&&&&&&&printk("---------------------------------------\n
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&payload);
&&&&&&&&&&&&&&&}
&&&&&&&&&&}
&&&&&&&&&&return&NF_ACCEPT;
&&&&&&&&&&//return&NF_DROP;&
&&&&&}&else&{
&&&&&&&&&&return&NF_ACCEPT;
//一下3个函数是内核源代码的net/ipv4/netfilter/nf_nat_helper.c&里面的,没有导出。需要找到对应的内核扳本的才能编译通过
//在http://lxr.linux.no/&&上看到2.6.31&和2.6.28用到的其他函数有点变化了。下面是
static&void
sack_adjust(struct&sk_buff&*skb,
&&&&&&&&&&&&&struct&tcphdr&*tcph,
&&&&&&&&&&&&&unsigned&int&sackoff,
&&&&&&&&&&&&&unsigned&int&sackend,
&&&&&&&&&&&&&struct&nf_nat_seq&*natseq)
&&&&&&&&&while&(sackoff&&&sackend)&{
&&&&&&&&&&&&&&&&&struct&tcp_sack_block_wire&*
&&&&&&&&&&&&&&&&&__be32&new_start_seq,&new_end_
&&&&&&&&&&&&&&&&&sack&=&(void&*)skb-&data&+&
&&&&&&&&&&&&&&&&&if&(after(ntohl(sack-&start_seq)&-&natseq-&offset_before,
&&&&&&&&&&&&&&&&&&&&&&&&&&&natseq-&correction_pos))
&&&&&&&&&&&&&&&&&&&&&&&&&new_start_seq&=&htonl(ntohl(sack-&start_seq)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&-&natseq-&offset_after);
&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&new_start_seq&=&htonl(ntohl(sack-&start_seq)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&-&natseq-&offset_before);
&&&&&&&&&&&&&&&&&if&(after(ntohl(sack-&end_seq)&-&natseq-&offset_before,
&&&&&&&&&&&&&&&&&&&&&&&&&&&natseq-&correction_pos))
&&&&&&&&&&&&&&&&&&&&&&&&&new_end_seq&=&htonl(ntohl(sack-&end_seq)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&-&natseq-&offset_after);
&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&new_end_seq&=&htonl(ntohl(sack-&end_seq)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&-&natseq-&offset_before);
&&&&&&&&&&&&&&&&&pr_debug("sack_adjust:&start_seq:&%d-&%d,&end_seq:&%d-&%d\n",
&&&&&&&&&&&&&&&&&&&&&&&&&&ntohl(sack-&start_seq),&new_start_seq,
&&&&&&&&&&&&&&&&&&&&&&&&&&ntohl(sack-&end_seq),&new_end_seq);
&&&&&&&&&&&&&&&&&inet_proto_csum_replace4(&tcph-&check,&skb,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sack-&start_seq,&new_start_seq,&0);
&&&&&&&&&&&&&&&&&inet_proto_csum_replace4(&tcph-&check,&skb,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sack-&end_seq,&new_end_seq,&0);
&&&&&&&&&&&&&&&&&sack-&start_seq&=&new_start_
&&&&&&&&&&&&&&&&&sack-&end_seq&=&new_end_
&&&&&&&&&&&&&&&&&sackoff&+=&sizeof(*sack);
&&&&&&&&&}
static&inline&unsigned&int
nf_nat_sack_adjust(struct&sk_buff&*skb,
&&&&&&&&&&&&&&&&&&&&struct&tcphdr&*tcph,
&&&&&&&&&&&&&&&&&&&&struct&nf_conn&*ct,
&&&&&&&&&&&&&&&&&&&&enum&ip_conntrack_info&ctinfo)
&&&&&&&&&unsigned&int&dir,&optoff,&
&&&&&&&&&struct&nf_conn_nat&*nat&=&nfct_nat(ct);
&&&&&&&&&optoff&=&ip_hdrlen(skb)&+&sizeof(struct&tcphdr);
&&&&&&&&&optend&=&ip_hdrlen(skb)&+&tcph-&doff&*&4;
&&&&&&&&&if&(!skb_make_writable(skb,&optend))
&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&dir&=&CTINFO2DIR(ctinfo);
&&&&&&&&&while&(optoff&&&optend)&{
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&unsigned&char&*op&=&skb-&data&+&
&&&&&&&&&&&&&&&&&switch&(op[0])&{
&&&&&&&&&&&&&&&&&case&TCPOPT_EOL:
&&&&&&&&&&&&&&&&&&&&&&&&&return&1;
&&&&&&&&&&&&&&&&&case&TCPOPT_NOP:
&&&&&&&&&&&&&&&&&&&&&&&&&optoff++;
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&default:
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&if&(optoff&+&1&==&optend&||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&optoff&+&op[1]&&&optend&||
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&op[1]&&&2)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&&&&&&&&&&&&&&&&&if&(op[0]&==&TCPOPT_SACK&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&op[1]&&=&2+TCPOLEN_SACK_PERBLOCK&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&((op[1]&-&2)&%&TCPOLEN_SACK_PERBLOCK)&==&0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sack_adjust(skb,&tcph,&optoff+2,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&optoff+op[1],&&nat-&seq[!dir]);
&&&&&&&&&&&&&&&&&&&&&&&&&optoff&+=&op[1];
&&&&&&&&&&&&&&&&&}
&&&&&&&&&}
&&&&&&&&&return&1;
nf_nat_seq_adjust(struct&sk_buff&*skb,
&&&&&&&&&&&&&&&&&&&struct&nf_conn&*ct,
&&&&&&&&&&&&&&&&&&&enum&ip_conntrack_info&ctinfo)
&&&&&&&&&struct&tcphdr&*
&&&&&&&&&int&
&&&&&&&&&__be32&newseq,&
&&&&&&&&&struct&nf_conn_nat&*nat&=&nfct_nat(ct);
&&&&&&&&&struct&nf_nat_seq&*this_way,&*other_
&&&&&&&&&dir&=&CTINFO2DIR(ctinfo);
&&&&&&&&&this_way&=&&nat-&seq[dir];
&&&&&&&&&other_way&=&&nat-&seq[!dir];
&&&&&&&&&if&(!skb_make_writable(skb,&ip_hdrlen(skb)&+&sizeof(*tcph)))
&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&tcph&=&(void&*)skb-&data&+&ip_hdrlen(skb);
&&&&&&&&&if&(after(ntohl(tcph-&seq),&this_way-&correction_pos))
&&&&&&&&&&&&&&&&&newseq&=&htonl(ntohl(tcph-&seq)&+&this_way-&offset_after);
&&&&&&&&&else
&&&&&&&&&&&&&&&&&newseq&=&htonl(ntohl(tcph-&seq)&+&this_way-&offset_before);
&&&&&&&&&if&(after(ntohl(tcph-&ack_seq)&-&other_way-&offset_before,
&&&&&&&&&&&&&&&&&&&other_way-&correction_pos))
&&&&&&&&&&&&&&&&&newack&=&htonl(ntohl(tcph-&ack_seq)&-&other_way-&offset_after);
&&&&&&&&&else
&&&&&&&&&&&&&&&&&newack&=&htonl(ntohl(tcph-&ack_seq)&-&other_way-&offset_before);
&&&&&&&&&inet_proto_csum_replace4(&tcph-&check,&skb,&tcph-&seq,&newseq,&0);
&&&&&&&&&inet_proto_csum_replace4(&tcph-&check,&skb,&tcph-&ack_seq,&newack,&0);
&&&&&&&&&pr_debug("Adjusting&sequence&number&from&%u-&%u,&ack&from&%u-&%u\n",
&&&&&&&&&&&&&&&&&&ntohl(tcph-&seq),&ntohl(newseq),&ntohl(tcph-&ack_seq),
&&&&&&&&&&&&&&&&&&ntohl(newack));
&&&&&&&&&tcph-&seq&=&
&&&&&&&&&tcph-&ack_seq&=&
&&&&&&&&&if&(!nf_nat_sack_adjust(skb,&tcph,&ct,&ctinfo))
&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&nf_conntrack_tcp_update(skb,&ip_hdrlen(skb),&ct,&dir);
&&&&&&&&&return&1;
unsigned&int&fix_seq(unsigned&int&hooknum,&struct&sk_buff&*skb,
&&&&&&&&&&const&struct&net_device&*in,&const&struct&net_device&*out,&int(*okfn)(
&&&&&&&&&&&&&&&&&&&&struct&sk_buff&*))&
&&&&&enum&ip_conntrack_info&
&&&&&//Note&that&the&connection&tracking&subsystem
&&&&&//is&invoked&after&the&raw&table&has&been&processed,&but&before&the&mangle&table.
&&&&&//所以下面&要指定.priority&=&NF_IP_PRI_MANGLE&&nf_ct_get&才会返回有效的值
&&&&&struct&nf_conn&*ct&=&nf_ct_get(skb,&&ctinfo);
&&&&&//调用nf_nat_seq_adjust函数,修正nf_nat_mangle_tcp_packet&之后造成的tcp包的序列号不对问题&
&&&&&//这个需要在修改后的双向网络包上都要进行,所以需要hook双向的吧?,nf_nat_mangle_tcp_packet&
&&&&&//中调用了adjust_tcp_sequence知识记录下了应该作的修改。
&&&&&//因为nf_nat_mangle_tcp_packet&&给需要进行序号修正的conntrack加上IPS_SEQ_ADJUST_BIT标志了。
&&&&&//所以这里判断是不是这个标志就进行修改。不知道这会不会和其他nat&helper&moudle冲突,如果别人也用这个
&&&&&//标志时就可能出现重复修改等问题,因为里面的序号调整结构都是通用的。
&&&&&//也许进行更细致的检查,比如给conntrack的ct结构加上&其他唯一的status标志比较好一点,
&&&&&//反正就是要保证我们要修复序号的包是我们前面用nf_nat_mangle_tcp_packet
&&&&&//修改过包内容的那个连接的,而不是其他的连接的包。
&&&&&//写一个nat&helper&module来修改tcp包也许比在这种hook&module里面进行修改更合适。去看看netfilter的文档看看。
&&&&&//因为我确信自己系统&&没有运行nat&help&module,所以为了简单就这样进行修改了,测试过没有什么问题。
&&&&&//最好研究一下nat&conntrack的那些代码,我也不是清楚具体的细节。
&&&&&if&(ct&&&&&&test_bit(IPS_SEQ_ADJUST_BIT,&&ct-&status)
&&&&&&&&&&&&&&&&(ctinfo&!=&IP_CT_RELATED&+&IP_CT_IS_REPLY)&&)&{
&&&&&&&&&&&&&nf_nat_seq_adjust(skb,&ct,&ctinfo);
&&&&&return&NF_ACCEPT;
static&struct&nf_hook_ops&http_hooks&=&{&.pf&=&NFPROTO_IPV4,&
&&&&&&&&&.priority&=&NF_IP_PRI_MANGLE&,&//&NF_IP_PRI_FIRST,&//NF_IP_PRI_LAST&;NF_IP_PRI_NAT_SRC&;
&&&&&&&&&&.hooknum&=&NF_INET_LOCAL_OUT,&
&&&&&&&&&&.hook&=&check_link_address,
&&&&&&&&&&.owner&=&THIS_MODULE,&};
static&struct&nf_hook_ops&&seq_adjust[]&=&{
&&&&&&&&&{
&&&&&&&&&&&&&&&&&.hook&&&&&&&&&&&&=&fix_seq,
&&&&&&&&&&&&&&&&&.owner&&&&&&&&&&&=&THIS_MODULE,
&&&&&&&&&&&&&&&&&.pf&&&&&&&&&&&&&&=&PF_INET,
&&&&&&&&&&&&&&&&&.hooknum&&&&&&&&&=&NF_INET_POST_ROUTING,
&&&&&&&&&&&&&&&&&.priority&&&&&&&&=&NF_IP_PRI_CONNTRACK_CONFIRM,
&&&&&&&&&},
&&&&&&&&&{
&&&&&&&&&&&&&&&&&.hook&&&&&&&&&&&&=&fix_seq,
&&&&&&&&&&&&&&&&&.owner&&&&&&&&&&&=&THIS_MODULE,
&&&&&&&&&&&&&&&&&.pf&&&&&&&&&&&&&&=&PF_INET,
&&&&&&&&&&&&&&&&&.hooknum&&&&&&&&&=&NF_INET_LOCAL_IN,
&&&&&&&&&&&&&&&&&.priority&&&&&&&&=&NF_IP_PRI_CONNTRACK_CONFIRM,
&&&&&&&&&},
static&int&__init&widebright_init(void)
&&&&&&int&ret&=&0;
&&&&&&ret&=&nf_register_hooks(seq_adjust,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ARRAY_SIZE(seq_adjust));
&&&&&&&&&if&(ret&&&0)&{
&&&&&&&&&&&&return&
&&&&&&&&&}
&&&&&return&nf_register_hook(&http_hooks);
static&void&__exit&widebright_cleanup(void)
&&&&&nf_unregister_hooks(seq_adjust,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ARRAY_SIZE(seq_adjust));
&&&&&nf_unregister_hook(&http_hooks);
module_init(widebright_init);
module_exit(widebright_cleanup);
===========================================
补充,有网友评论碰到nfct_nat(ct)&为空指针导致内核崩溃的情况。需要用下面这个代码添加&struct&nf_conn_nat&结构来修复这个问题。
&&94&&&&&&&&nat&=&nfct_nat(ct);
&&95&&&&&&&&if&(!nat)&{
&&96&&&&&&&&&&&&&&&&
&&97&&&&&&&&&&&&&&&&if&(nf_ct_is_confirmed(ct))
&&98&&&&&&&&&&&&&&&&&&&&&&&&return&NF_ACCEPT;
&&99&&&&&&&&&&&&&&&&nat&=&nf_ct_ext_add(ct,&NF_CT_EXT_NAT,&GFP_ATOMIC);
&100&&&&&&&&&&&&&&&&if&(nat&==&NULL)&{
&101&&&&&&&&&&&&&&&&&&&&&&&&pr_debug("failed&to&add&NAT&extension\n");
&102&&&&&&&&&&&&&&&&&&&&&&&&return&NF_ACCEPT;
&103&&&&&&&&&&&&&&&&}
&104&&&&&&&&}
在内核里面找一下,以下地方都有做这个初始化的。
http://lxr.linux.no/linux+v3.9.6/net/netfilter/nf_nat_core.c#L370
nf_nat_setup_info
http://lxr.linux.no/linux+v3.9.6/net/ipv4/netfilter/iptable_nat.c#L99
nf_nat_ipv4_fn&
http://lxr.linux.no/linux+v2.6.26/net/ipv4/netfilter/nf_nat_standalone.c#L108
应该是nat功能的hook函数都会调用到,这个是nat功能的主要实现吧?每次都会进行检查看看这个nat结构是不是已经初始化
&&94&&&&&&&&nat&=&nfct_nat(ct);
&&95&&&&&&&&if&(!nat)&{
&&96&&&&&&&&&&&&&&&&
&&97&&&&&&&&&&&&&&&&if&(nf_ct_is_confirmed(ct))
&&98&&&&&&&&&&&&&&&&&&&&&&&&return&NF_ACCEPT;
&&99&&&&&&&&&&&&&&&&nat&=&nf_ct_ext_add(ct,&NF_CT_EXT_NAT,&GFP_ATOMIC);
&100&&&&&&&&&&&&&&&&if&(nat&==&NULL)&{
&101&&&&&&&&&&&&&&&&&&&&&&&&pr_debug("failed&to&add&NAT&extension\n");
&102&&&&&&&&&&&&&&&&&&&&&&&&return&NF_ACCEPT;
&103&&&&&&&&&&&&&&&&}
&104&&&&&&&&}
&244static&struct&nf_hook_ops&nf_nat_ipv4_ops[]&__read_mostly&=&{
&245&&&&&&&&
&246&&&&&&&&{
&247&&&&&&&&&&&&&&&&.hook&&&&&&&&&&&=&nf_nat_ipv4_in,&&&//&这里会调用&nf_nat_ipv4_fn&&函数
&248&&&&&&&&&&&&&&&&.owner&&&&&&&&&&=&THIS_MODULE,
&249&&&&&&&&&&&&&&&&.pf&&&&&&&&&&&&&=&NFPROTO_IPV4,
&250&&&&&&&&&&&&&&&&.hooknum&&&&&&&&=&NF_INET_PRE_ROUTING,
&251&&&&&&&&&&&&&&&&.priority&&&&&&&=&NF_IP_PRI_NAT_DST,
&252&&&&&&&&},
&253&&&&&&&&
&254&&&&&&&&{
&255&&&&&&&&&&&&&&&&.hook&&&&&&&&&&&=&nf_nat_ipv4_out,&&&//&这里会调用&nf_nat_ipv4_fn&&函数
&256&&&&&&&&&&&&&&&&.owner&&&&&&&&&&=&THIS_MODULE,
&257&&&&&&&&&&&&&&&&.pf&&&&&&&&&&&&&=&NFPROTO_IPV4,
&258&&&&&&&&&&&&&&&&.hooknum&&&&&&&&=&NF_INET_POST_ROUTING,
&259&&&&&&&&&&&&&&&&.priority&&&&&&&=&NF_IP_PRI_NAT_SRC,
&260&&&&&&&&},
我之前的注释写了hook的定义要使用NF_IP_PRI_MANGLE&才能使用conntrack,之前代码也不怎么检查connntack的struct&nf_conn&和struct&nf_conn_nat&*nat&=&nfct_nat(ct);结构的指针是不是为空。
http://lxr.linux.no/linux+v3.9.6/include/uapi/linux/netfilter_ipv4.h#L67
NF_IP_PRI_MANGLE&优先级是低于NF_IP_PRI_NAT_DST&这些的,所以按道理说前面这里nat的hook点点&nf_nat_ipv4_in等函数处理过后会做了初始化,struct&nf_conn_nat&*nat&=&nfct_nat(ct);&应该是不会为空指针的了。
&301static&int&__init&iptable_nat_init(void)
&303&&&&&&&&int&
&305&&&&&&&&err&=&register_pernet_subsys(&iptable_nat_net_ops);
&306&&&&&&&&if&(err&&&0)
&307&&&&&&&&&&&&&&&&goto&err1;
&309&&&&&&&&err&=&nf_register_hooks(nf_nat_ipv4_ops,&ARRAY_SIZE(nf_nat_ipv4_ops));
&310&&&&&&&&if&(err&&&0)
&311&&&&&&&&&&&&&&&&goto&err2;
&312&&&&&&&&return&0;
&315&&&&&&&&unregister_pernet_subsys(&iptable_nat_net_ops);
&317&&&&&&&&return&
iptable的nat模块初始化是会注册这两个点的。我之前文档有说了使用“sudo&iptables&-t&nat&--list”&&才能加载这个模块,因为nf_nat_mangle_tcp_packet&函数也是这个模块里面导出的,为了使用nf_nat_mangle_tcp_packet函数,是需要实现加载这个&iptable的&nat&模块的。
我怀疑是他直接把nf_nat_mangle_tcp_packet&函数也复制出来使用了,而不是手工加载nat模块,所以这个nat&hook的点的初始化工作还没有做,后面就碰到空指针了。
而一个关键点修改包内容的函数&
__nf_nat_mangle_tcp_packet&-》nf_nat_set_seq_adjust&-&&adjust_tcp_sequence
struct&nf_nat_seq&*this_way&=&&nat-&seq[dir];
就是为了把把修改了包长度导致的序号变化记录到&&struct&nf_conn_nat&接口里面seq数组里面。分两个方向。
如果前面自己在代码里面用来下面这个代码创建这个结构的话,
&&94&&&&&&&&nat&=&nfct_nat(ct);
&&95&&&&&&&&if&(!nat)&{
&&96&&&&&&&&&&&&&&&&
&&97&&&&&&&&&&&&&&&&if&(nf_ct_is_confirmed(ct))
&&98&&&&&&&&&&&&&&&&&&&&&&&&return&NF_ACCEPT;
&&99&&&&&&&&&&&&&&&&nat&=&nf_ct_ext_add(ct,&NF_CT_EXT_NAT,&GFP_ATOMIC);
&100&&&&&&&&&&&&&&&&if&(nat&==&NULL)&{
&101&&&&&&&&&&&&&&&&&&&&&&&&pr_debug("failed&to&add&NAT&extension\n");
&102&&&&&&&&&&&&&&&&&&&&&&&&return&NF_ACCEPT;
&103&&&&&&&&&&&&&&&&}
&104&&&&&&&&}
确实不用手工再去加载&iptable的nat模块了。
这里分配的内存应该会在&&struct&nf_conn&结构释放的时候,自己调用kfree释放了。
http://lxr.linux.no/linux+v3.9.6/net/netfilter/nf_conntrack_core.c#L762&
void&nf_conntrack_free(struct&nf_conn&*ct)&-&&nf_ct_ext_free
不过再看那个__nf_nat_mangle_tcp_packet&函数,依赖的好多内存函数,如果直接复制应该很麻烦吧,还是使用iptable的nat模块的内核导出符号方便吧。
这样就不知道该网友怎么会碰到struct&nf_conn_nat&*nat&=&nfct_nat(ct)&为空的现象了。
有可能他使用的不是NF_IP_PRI_MANGLE&的优先级,他的hook函数调用__nf_nat_mangle_tcp_packet&的时候先于&nat的hook函数执行了。
总结一下:
这个__nf_nat_mangle_tcp_packet&函数用到的是iptable的&nat&模块和conntrack模块,需要内核记载了&iptables和&conntrack的模块才能使用。有些内核编译是应该灭有启用这些功能就没法使用了。调整序号还好,可以自己搞一个简单的出来,但那个conntack很重要,应该自己弄一个很麻烦,还是直接用人家这个功能好了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 修改tot型号 的文章

 

随机推荐