fdump tcp抓包框架

栏目: 服务器 · 发布时间: 6年前

内容简介:fdump是一个创建抓二进制包解析程序的框架。对于自定义的二进制通信协议,在调试的时候会很困难。无论tcpdump还是wireshark抓到包都不能直接看到里面的内容。fdump做的事情就是抓包,并且把内容给到调用函数进行解析并返回一个可以阅读的对象, fdump把它做展示。

fdump是一个创建抓二进制包解析程序的框架。

对于自定义的二进制通信协议,在调试的时候会很困难。无论tcpdump还是wireshark抓到包都不能直接看到里面的内容。

fdump做的事情就是抓包,并且把内容给到调用函数进行解析并返回一个可以阅读的对象, fdump把它做展示。

简介

fdump的仓库地址: https://github.com/tenfyzhong/fdump

fdump的面板由三部分构造,左边为抓到的每一个包,称之为简介面板。右边为包的详细显示内容, 称之为详情面板。下边为状态栏。

以下图采自fdump中的tcp的程序的例子:

https://github.com/tenfyzhong/fdump/tree/master/_examples/tcp

fdump tcp抓包框架

fdump支持以下的特性:

  • tui展示所有的抓包记录
  • 对抓到的包记录进行重放
  • 保存记录到文件
  • 从文件中加载记录
  • 支持tcp
  • 支持udp

使用fdump创建抓包程序非常简单,只要以下几步:

func(gopacket.Flow, gopacket.Flow, []byte) (bodies []interface{}, n int, err error)
func(record *Record) []string
DetailFunc func(record *Record) string

程序进行起来后,有一堆可用的快捷键,详细见: https://github.com/tenfyzhong/fdump#key

状态说明

在状态栏的左边,有四个字母。

  • F:代表frozen状态,在简介面板按f触发和解除
  • D:代表进行详情面板,在简介面板按回车键进入,按q退回到简介面板
  • S:代表暂停抓包状态,按s触发和解除
  • M:代表多选状态,当前状态在简介面板中选择多个包进行删除、保存等操作

例子

func decode(net, transport gopacket.Flow, buf []byte)(bodies []interface{}, nint, err error) {
	if len(buf) < 4 {
		err = fdump.ErrPkgNoEnough
		return
	}
	pkgLen := binary.BigEndian.Uint32(buf)
	if uint32(len(buf)) < pkgLen {
		err = fdump.ErrPkgNoEnough
		return
	}
	str := string(buf[4:pkgLen])
	bodies = append(bodies, str)
	n = pkgLen
	return
}

func brief(record *fdump.Record)[]string {
	if record == nil || len(record.Bodies) == 0 {
		return nil
	}
	str, ok := record.Bodies[0].(string)
	if !ok {
		return nil
	}
	return []string{str[:10]}
}

func detail(record *fdump.Record)string {
	str, ok := record.Bodies[0].(string)
	if !ok {
		return ""
	}
	return str
}

func postSend(conn net.Conn, record *fdump.Record)error {
	lenBuf := make([]byte, 4)
	lenLen := 0
	for lenLen < 4 {
		err := conn.SetReadDeadline(time.Now().Add(1*time.Second))
		if err != nil {
			return err
		}
		n, err := conn.Read(headBuf[lenLen:])
		if err != nil {
			return err
		}
		lenLen += n
	}

	bodyLen := binary.BigEndian.Uint32(lenBuf) - 4
	body := make([]byte, bodyLen)
	curLen := 0
	for curLen < int(bodyLen) {
		err := conn.SetReadDeadline(time.Now().Add(t*time.Second))
		if err != nil {
			return err
		}
		n, err := conn.Read(body[curlen:])
		if err != nil {
			return err
		}
		curlen += n
	}
	return nil
}

func main() {
	logging.SetLevel(logging.INFO, "")
	fdump.Init()
	replayHook := &fdump.ReplayHook{
		PostSend: postSend,
	}
	briefAttributes := []*fdump.BriefColumnAttribute{&fdump.BriefColumnAttribute{
			Title: "Head10",
			MaxWidth: 10,
		},
	}

	a := fdump.NewApp(decode, brief, detail, replayHook, briefAttributes)
	a.Run()
}

这个例子程序非常简单,创建了一个decode函数用于解析包,brief函数用于返回简介面板的字段, detail函数用于返回详情页显示的内容。postSend用于在重放时,发包后的操作。 在 NewApp 函数中,分别传入以上的几个函数。最后,传入一个简介面板的头的字段。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Blog Design Solutions

Blog Design Solutions

Richard Rutter、Andy Budd、Simon Collison、Chris J Davis、Michael Heilemann、Phil Sherry、David Powers、John Oxton / friendsofED / 2006-2-16 / USD 39.99

Blogging has moved rapidly from being a craze to become a core feature of the Internetfrom individuals sharing their thoughts with the world via online diaries, through fans talking about their favori......一起来看看 《Blog Design Solutions》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具