linux手动注入网络数据_Linux内核模块:如何重新注入内核认为是NF_STOLEN的数据包?...

晚上好.发布到这个网站对我来说是新的,但我一直是一个感恩的读者,他已经从这个论坛学到了很多东西,现在已经有一段时间了.这是我第一次遇到问题我既不能自己解决,也不能借助Stackoverflow上已存在的条目或互联网提供的任何其他资源.

我希望你能再次帮助我(从现在开始,我也能帮助别人,因为我觉得自己已经成长为能够成为写作会员的地方).

问题:

我正在研究内核模块.它的目的是使用PRE_ROUTING netfilter挂钩从内核窃取带有特定源IP的传入数据包.只有TCP数据包才对它很有用.

现在,钩子通过dev_queue_xmit()将数据包重新注入正常的内核数据包处理例程,并将数据包的NF_STOLEN返回给内核.来自其他源地址的数据包不会被重新注入,但会通过返回NF_ACCEPT而不是NF_STOLEN来忽略.

内核模块还存储每个被盗数据包的TCP seq号,以便确定来自所提到的IP的传入数据包是新的,还是已经通过dev_queue_xmit()进行了修改和重新注入,因为这些数据包再次遍历钩子.

什么工作:

>模块加载

> Hook已注册

>为每个数据包调用Hook.

> Hook可以确定数据包SRC IP是否是我正在寻找的IP.

> Hook为具有其他源地址的数据包返回NF_ACCEPT

>重新注入具有源地址的数据包,同时为它们返回NF_STOLEN

>重新传输的数据包再次遍历钩子并被忽略

问题

当我在加载模块后使用浏览器访问IP时,我的IP堆栈似乎崩溃了.我不能再ping任何地址了.模块记录它遇到来自相关IP的数据包,并且它将它们重新排队并且之后它发现了一个已知的数据包(所以一切看起来都很好),但仍然:没有正确连接到站点/任何其他地址.

这是钩子代码:

static unsigned int hook(unsigned int hooknum,struct sk_buff *skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))

{

struct iphdr *iph;

struct tcphdr *tcph;

unsigned int i;

if(!skb)

return NF_ACCEPT;

iph = (struct iphdr *)skb_network_header(skb);

if(!iph || !(iph->saddr) || iph->saddr != *(unsigned int*)suspicious_ip)

return NF_ACCEPT;

tcph = (struct tcphdr *)skb_transport_header(skb);

for(i=0; i < number_of_known_packets; i++)

{

if(tcph->seq == *(already_known_packets+i))

{

debug("Already known packet");

return NF_ACCEPT;

}

}

debug("Ne

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值