首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从TCP数据包有效负载获取主机字段

从TCP数据包有效负载获取主机字段
EN

Stack Overflow用户
提问于 2016-06-06 02:32:18
回答 1查看 608关注 0票数 0

我正在用C语言编写一个内核模块,并尝试从TCP数据包的有效负载中获取Host字段,其中包含http请求头。我已经设法用FTP做了一些类似的事情(扫描有效负载并查找FTP命令),但我似乎不能做同样的事情并找到字段。

我的模块连接到POST_ROUTING钩子。到达该钩子的每个数据包(如果它的dst端口为80 )将被识别为HTTP数据包,因此我的模块开始解析它。

由于某些原因,我似乎无法获得主机线路(事实上,我只看到服务器HTTP 200 ok)

这些报头是否始终位于使用端口80的数据包上?如果是这样,那么解析这些packt的有效负载的最佳方法是什么?看起来一个字符接一个字符是一项很大的工作。有没有更好的办法?

谢谢

编辑:取得了一些进展。我从服务器收到的每个数据包,我都可以毫不费力地读取有效载荷。但我发送的每一个包--好像负载是空的。

我认为这是skb指针的问题,但我得到的TCP端口很好。就是看不懂这该死的有效载荷。这是我解析它的方式:

代码语言:javascript
复制
unsigned char* user_data = (unsigned char *)((int)tcphd + (int)(tcphd->doff * 4));
unsigned char *it;
for (it = user_data; it != tail; ++it) {
    unsigned char c = *(unsigned char *)it;

    http_command[http_command_index] = c;
    http_command_index++;
}

其中,tail:

代码语言:javascript
复制
 tail = skb_tail_pointer(skb);

指针在循环中根本不会前进。好像从一开始就是空的,我不知道为什么。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2016-06-06 17:56:00

我已经设法解决了这个问题。

使用this,我已经了解了如何解析所有数据包的有效负载。我希望这段代码能解释这个问题。

代码语言:javascript
复制
int http_command_offset = iphd->ihl*4 + tcphd->doff*4; 
int http_command_length = skb->len - http_command_offset;
http_command =  kmalloc(http_command_length + 1, GFP_ATOMIC);
skb_copy_bits(skb, http_command_offset , (void*)http_command, http_command_length);

skb_cop_bits,只是将有效负载完全复制到我创建的缓冲区中。现在解析它非常简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37645390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档