问题标签 [gopacket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4478 浏览

go - gopacket 中的 tcp 汇编包如何使用?

我一直在使用 pcap 包和 gopacket 来解析网络流量并取得了相当大的成功。这些库使处理网络捕获变得更加容易,它们无疑为我节省了大量时间。

我想更进一步,使用 tcp 程序集包开始重新组装 TCP 流,但是从文档中提供的示例中我不确定如何去做。

链接在这里:

http://godoc.org/code.google.com/p/gopacket/tcpassembly/tcpreader

我正在寻找的是一个简单的例子,它演示了如何设置它,以便你有数据包进入一端,一个很好的字节顺序数据流从另一端出来。

提前致谢!

0 投票
1 回答
18753 浏览

sockets - 如何使用 Golang 组合原始 TCP 数据包(使用 gopacket)并通过原始套接字发送

我想使用 gopacket 制作自定义 TCP 数据包,然后使用原始套接字发送它们。

这是一个简短易读的示例 go 程序,演示了我想做的事情:

但是运行这个程序不起作用...... SerializeLayer 失败。这是恐慌:

恐慌:src IP 127.0.0.1 无效

goroutine 16 [运行]: runtime.panic(0x5bb020, 0xc2090723e0) /home/human/golang-empire/go/src/pkg/runtime/panic.c:279 +0xf5 main.main() /home/human/golang-帝国/gopkg/src/github.com/david415/HoneyBadger/packetSendTest.go:41 +0x464

goroutine 19 [finalizer wait]: runtime.park(0x413cc0, 0x7bc6c0, 0x7bb189) /home/human/golang-empire/go/src/pkg/runtime/proc.c:1369 +0x89 runtime.parkunlock(0x7bc6c0, 0x7bb189) / home/human/golang-empire/go/src/pkg/runtime/proc.c:1385 +0x3b runfinq() /home/human/golang-empire/go/src/pkg/runtime/mgc0.c:2644 +0xcf runtime.goexit() /home/human/golang-empire/go/src/pkg/runtime/proc.c:1445

0 投票
0 回答
1863 浏览

sockets - 更改 Gopacket 的 IP 地址并使用原始套接字重新传输

我正在编写一个程序,它读取通过运行它的计算机的所有数据包。我希望抓取一个数据包(通过 dst ip 或 src ip),然后更改 dstIP 和 TCP dstPort 并将其放回线路上。

我对更改 dstIP 没有任何问题,但是如何正确序列化它以使数据包不会出现格式错误并到达我希望它去的目的地?

0 投票
1 回答
1887 浏览

go - 使用 gopacket 作为入门学习 Golang

最近(1月)开始学习golang。我正在尝试重现我们内部用 Go 语言编写的 Python 工具。

所以我有这个工具完全可以用于 DNS 的 UDP 解码,但是我已经努力了一周试图获得基于 TCP 的 DNS 解码。我的目标是为到达我们的 DNS 服务器的每个数据包记录 DNS 源、目标、查询和答案。与dnstap的做法类似,但是我们有一个内部解决方案,目前使用 Python 来适应我们内部的自定义日志记录和事件关联系统。

我试图将层/tcp.go 中的 NextLayerType 强制为 DNS Layertype 等,以试图找到我所缺少的。到目前为止还没有运气。任何建议都是王牌。我们使用 UDP 看到的是以下输出。(pprint json 编码输出)

[{ "src": "172.10.56.23", "src_port": "52464", "dst": "172.10.16.120", "dst_port": "53", "bytes": 63, "transport": "UDP", "reply_code": "Query", "query_count": 1, "answer_count": 0, "question": ["helposx.apple.com"], "query_type": "A", "answer": null, "truncated": false }, { "src": "172.10.16.120", "src_port": "53", "dst": "172.10.56.23", "dst_port": "52464", "bytes": 156, "transport": "UDP", "reply_code": "Query", "query_count": 1, "answer_count": 3, "question": ["helposx.apple.com"], "query_type": "A", "answer": [{ "response-name": "helposx.apple.com", "response-query_type": "CNAME", "response-ttl": 4607, "response-bytes": 31, "response-cname": "helposx.apple.com.edgekey.net", "response-soa": {}, "response-srv": {}, "response-mx": {} }, { "response-name": "helposx.apple.com.edgekey.net", "response-query_type": "CNAME", "response-ttl": 33, "response-bytes": 22, "response-cname": "e3167.e9.akamaiedge.net", "response-soa": {}, "response-srv": {}, "response-mx": {} }, { "response-name": "e3167.e9.akamaiedge.net", "response-query_type": "A", "response-ttl": 13, "response-bytes": 4, "response-ip": "104.98.20.77", "response-soa": {}, "response-srv": {}, "response-mx": {} }], "truncated": false }]

如果我现在使用 dig +tcp(强制 TCP)执行完全相同的查询,我会得到以下输出。

[{ "src": "172.10.56.23", "src_port": "57188", "dst": "172.10.16.120", "dst_port": "53", "bytes": 64, "transport": "TCP", "reply_code": "", "query_count": 0, "answer_count": 0, "question": null, "query_type": "", "answer": null, "truncated": false }, { "src": "172.10.16.120", "src_port": "53", "dst": "172.10.56.23", "dst_port": "57188", "bytes": 60, "transport": "TCP", "reply_code": "", "query_count": 0, "answer_count": 0, "question": null, "query_type": "", "answer": null, "truncated": false }, { "src": "172.10.56.23", "src_port": "57188", "dst": "172.10.16.120", "dst_port": "53", "bytes": 52, "transport": "TCP", "reply_code": "", "query_count": 0, "answer_count": 0, "question": null, "query_type": "", "answer": null, "truncated": false }, { "src": "172.10.56.23", "src_port": "57188", "dst": "172.10.16.120", "dst_port": "53", "bytes": 86, "transport": "TCP", "reply_code": "", "query_count": 0, "answer_count": 0, "question": null, "query_type": "", "answer": null, "truncated": false }, { "src": "172.10.16.120", "src_port": "53", "dst": "172.10.56.23", "dst_port": "57188", "bytes": 102, "transport": "TCP", "reply_code": "", "query_count": 0, "answer_count": 0, "question": null, "query_type": "", "answer": null, "truncated": false }, { "src": "172.10.56.23", "src_port": "57188", "dst": "172.10.16.120", "dst_port": "53", "bytes": 52, "transport": "TCP", "reply_code": "", "query_count": 0, "answer_count": 0, "question": null, "query_type": "", "answer": null, "truncated": false }] 通过查看 Wireshark 中的相同数据包,我可以看到这些不同的数据包是 TCP 握手,然后是响应。哪个没有解码。

当我在 for _, layer := range 解码行之后添加 fmt.Println(layer) 时,我得到以下信息。

以太网 IPv4 TCP << 上面的 JSON 输出。

VS

以太网 IPv4 UDP DNS

如您所见,基于 TCP 的 DNS 永远不会有下一个解码器。它只是停在 TCP 上。我不确定解决方案是什么。阅读上游库看起来应该可以工作。然而事实并非如此,我对我应该去哪里感到困惑。作为 Go 的新手,它让我陷入循环。

0 投票
3 回答
6660 浏览

go - compile gopacket on windows 64bit

I am trying to use gopacket on my windows 10.
I'm using it to sniff and inject packets directly to/from the NIC.
I can easily compile and run my code with GOARCH=386 but can't in GOARCH=amd64.

Worth noticing: I am NOT trying to cross-compile.
I'm using go1.6.windows-386 to compile the 32bit version and when I try to compile with GOARCH=amd64 I use go1.6.windows-amd64.

I used TDM-GCC as linux like compile tools.
The error isn't indicative. it just says

c:/WpdPack/Lib/x64/wpcap.lib: error adding symbols: File in wrong format collect2.exe: error ld returned 1 exit status

Did anyone manage to build this, if it's even possible?

0 投票
0 回答
437 浏览

go - gopacket 层 TCP 结构 ACK 与 Ack

我正在尝试使用 golang 库 gopacket 和层构建 TCP 数据包。在层中有一个结构体,恰当地称为TCP。有两个 ACK​​ 字段,我不确定为什么会有这样的区别。一个是布尔值,一个是 uint16。这种分歧的目的是什么。任何帮助深表感谢。

0 投票
2 回答
2563 浏览

networking - 使用 gopacket 发送 UDP 数据包

我正在尝试将 UDP 数据包发送到这样的远程主机

但这在使用read ip4 0.0.0.0: i/o timeout. 当我 tcpdump 时,我看到数据包被发送出去,一个 UDP 响应在端口 53 上返回,其他的都是 ICMP。为什么我的代码无法读取这些数据包?

0 投票
1 回答
1271 浏览

go - 如何使用 gopacket 获取标头字节/长度

尝试使用 gopacket 创建一个以太网数据包(ARP、BGP、UDP、TCP)并获取它的头字节和长度。

尝试使用下面的示例,尝试列出所有层并找到有效负载位置,然后计算总标头长度和字节:

我得到如下错误:

我在那里做错了吗?

谁能给我任何想法如何获取标头字节?

0 投票
1 回答
1356 浏览

go - 使用 gopacket 更改目标端口

我目前正在尝试从nfqueue读取包并对其进行修改。不幸的是,我在更改包的目标端口时有点卡住了。请参阅下面的代码片段。想法是将 dest 端口8888重写为8000。我确实看到修改后的包从队列中出来了,但是如果我想通过连接到端口 8888 来连接到侦听端口 8000 的 HTTP 服务器,则连接超时。我假设包装中有一些格式错误的东西。

0 投票
1 回答
196 浏览

go - 使用 golang 进行 NTP 检测,有效载荷为空

我正在使用 golang 和 gopacket 包检测 NTP。我正在使用从wireshark 下载的pcap。我有以下代码用于打开 PCAP 并处理它们:

这是我正在编写的执行实际检测的代码

ApplicationLayer 中的 Payload 内容为空,我无法弄清楚为什么会发生这种情况。

当我打印出 ApplicationLayer 本身时的示例屏幕截图:

https://i.gyazo.com/6257f298a09e7403bbc0be5b8ac84ccc.png

我打印出有效负载时的示例屏幕截图: https ://i.gyazo.com/7f4abd449025f5d65160fdbecffa8181.png

可以使用一些帮助找出我做错了什么。谢谢!