Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

# go-sniffer

> Capture mysql,redis,http,mongodb etc protocol...
> Capture mysql,mssql,redis,http,mongodb etc protocol...
> 抓包截取项目中的数据库请求并解析成相应的语句,如mysql协议会解析为sql语句,便于调试。
> 不要修改代码,直接嗅探项目中的数据请求。

Expand All @@ -14,6 +14,7 @@
- [Redis](#redis)
- [Http](#http)
- [Mongodb](#mongodb)
- [mssql](#mssql)
- Kafka (developing)
- ...

Expand Down Expand Up @@ -104,6 +105,8 @@ $ go-sniffer lo0 mysql
$ go-sniffer en0 redis
$ go-sniffer eth0 http -p 8080
$ go-sniffer eth1 mongodb
$ go-sniffer eth0 mssql

```
## License:
[MIT](http://opensource.org/licenses/MIT)
61 changes: 29 additions & 32 deletions core/cmd.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package core

import (
"os"
"strings"
"fmt"
"net"
"os"
"strconv"
"strings"
)

const InternalCmdPrefix = "--"
Expand All @@ -18,14 +18,14 @@ const (
)

type Cmd struct {
Device string
Device string
plugHandle *Plug
}

func NewCmd(p *Plug) *Cmd {

return &Cmd{
plugHandle:p,
plugHandle: p,
}
}

Expand Down Expand Up @@ -55,27 +55,27 @@ func (cm *Cmd) parseInternalCmd() {
cmd := strings.Trim(arg, InternalCmdPrefix)

switch cmd {
case InternalCmdHelp:
cm.printHelpMessage()
break
case InternalCmdEnv:
fmt.Println("External plug-in path : "+cm.plugHandle.dir)
break
case InternalCmdList:
cm.plugHandle.PrintList()
break
case InternalCmdVer:
fmt.Println(cxt.Version)
break
case InternalDevice:
cm.printDevice()
break
case InternalCmdHelp:
cm.printHelpMessage()
break
case InternalCmdEnv:
fmt.Println("External plug-in path : " + cm.plugHandle.dir)
break
case InternalCmdList:
cm.plugHandle.PrintList()
break
case InternalCmdVer:
fmt.Println(cxt.Version)
break
case InternalDevice:
cm.printDevice()
break
}
os.Exit(1)
}

//usage
func (cm *Cmd) printHelpMessage() {
func (cm *Cmd) printHelpMessage() {

fmt.Println("==================================================================================")
fmt.Println("[Usage]")
Expand All @@ -85,6 +85,7 @@ func (cm *Cmd) printHelpMessage() {
fmt.Println(" [exp]")
fmt.Println(" go-sniffer en0 redis Capture redis packet")
fmt.Println(" go-sniffer en0 mysql -p 3306 Capture mysql packet")
fmt.Println(" go-sniffer en0 mssql -p 1433 Capture mssql packet")
fmt.Println()
fmt.Println(" go-sniffer --[commend]")
fmt.Println(" --help \"this page\"")
Expand All @@ -104,42 +105,38 @@ func (cm *Cmd) printHelpMessage() {
func (cm *Cmd) printPlugList() {
l := len(cm.plugHandle.InternalPlugList)
l += len(cm.plugHandle.ExternalPlugList)
fmt.Println("# Number of plug-ins : "+strconv.Itoa(l))
fmt.Println("# Number of plug-ins : " + strconv.Itoa(l))
}

//print device
func (cm *Cmd) printDevice() {
ifaces, err:= net.Interfaces()
ifaces, err := net.Interfaces()
if err != nil {
panic(err)
}
for _, iface := range ifaces {
addrs, _ := iface.Addrs()
for _,a:=range addrs {
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok {
if ip4 := ipnet.IP.To4(); ip4 != nil {
fmt.Println("[device] : "+iface.Name+" : "+iface.HardwareAddr.String()+" "+ip4.String())
fmt.Println("[device] : " + iface.Name + " : " + iface.HardwareAddr.String() + " " + ip4.String())
}
}
}
}
}

//Parameters needed for plug-ins
func (cm *Cmd) parsePlugCmd() {
func (cm *Cmd) parsePlugCmd() {

if len(os.Args) < 3 {
fmt.Println("not found [Plug-in name]")
fmt.Println("go-sniffer [device] [plug] [plug's params(optional)]")
os.Exit(1)
}

cm.Device = os.Args[1]
plugName := os.Args[2]
plugParams:= os.Args[3:]
cm.Device = os.Args[1]
plugName := os.Args[2]
plugParams := os.Args[3:]
cm.plugHandle.SetOption(plugName, plugParams)
}




61 changes: 33 additions & 28 deletions core/plug.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
package core

import (
"fmt"
"io"
"io/ioutil"
"path"
"path/filepath"
"plugin"
"github.com/google/gopacket"
"io"
mysql "github.com/40t/go-sniffer/plugSrc/mysql/build"
redis "github.com/40t/go-sniffer/plugSrc/redis/build"

hp "github.com/40t/go-sniffer/plugSrc/http/build"
mongodb "github.com/40t/go-sniffer/plugSrc/mongodb/build"
"path/filepath"
"fmt"
"path"
mssql "github.com/40t/go-sniffer/plugSrc/mssql/build"
mysql "github.com/40t/go-sniffer/plugSrc/mysql/build"
redis "github.com/40t/go-sniffer/plugSrc/redis/build"
"github.com/google/gopacket"
)

type Plug struct {

dir string
dir string
ResolveStream func(net gopacket.Flow, transport gopacket.Flow, r io.Reader)
BPF string
BPF string

InternalPlugList map[string]PlugInterface
ExternalPlugList map[string]ExternalPlug
Expand Down Expand Up @@ -48,7 +49,7 @@ func NewPlug() *Plug {

var p Plug

p.dir, _ = filepath.Abs( "./plug/")
p.dir, _ = filepath.Abs("./plug/")
p.LoadInternalPlugList()
p.LoadExternalPlugList()

Expand All @@ -60,16 +61,18 @@ func (p *Plug) LoadInternalPlugList() {
list := make(map[string]PlugInterface)

//Mysql
list["mysql"] = mysql.NewInstance()
list["mysql"] = mysql.NewInstance()

//Mongodb
list["mongodb"] = mongodb.NewInstance()
list["mongodb"] = mongodb.NewInstance()

//Redis
list["redis"] = redis.NewInstance()
list["redis"] = redis.NewInstance()

//Http
list["http"] = hp.NewInstance()
list["http"] = hp.NewInstance()

list["mssql"] = mssql.NewInstance()

p.InternalPlugList = list
}
Expand All @@ -87,7 +90,7 @@ func (p *Plug) LoadExternalPlugList() {
continue
}

plug, err := plugin.Open(p.dir+"/"+fi.Name())
plug, err := plugin.Open(p.dir + "/" + fi.Name())
if err != nil {
panic(err)
}
Expand All @@ -113,12 +116,12 @@ func (p *Plug) LoadExternalPlugList() {
}

version := versionFunc.(func() string)()
p.ExternalPlugList[fi.Name()] = ExternalPlug {
ResolvePacket:ResolvePacketFunc.(func(net gopacket.Flow, transport gopacket.Flow, r io.Reader)),
SetFlag:setFlagFunc.(func([]string)),
BPFFilter:BPFFilterFunc.(func() string),
Version:version,
Name:fi.Name(),
p.ExternalPlugList[fi.Name()] = ExternalPlug{
ResolvePacket: ResolvePacketFunc.(func(net gopacket.Flow, transport gopacket.Flow, r io.Reader)),
SetFlag: setFlagFunc.(func([]string)),
BPFFilter: BPFFilterFunc.(func() string),
Version: version,
Name: fi.Name(),
}
}
}
Expand All @@ -131,32 +134,34 @@ func (p *Plug) PrintList() {

//Print Internal Plug
for inPlugName, _ := range p.InternalPlugList {
fmt.Println("internal plug : "+inPlugName)
fmt.Println("internal plug : " + inPlugName)
}

//split
fmt.Println("-- --- --")

//print External Plug
for exPlugName, _ := range p.ExternalPlugList {
fmt.Println("external plug : "+exPlugName)
fmt.Println("external plug : " + exPlugName)
}
}

func (p *Plug) SetOption(plugName string, plugParams []string) {

fmt.Println("internalPlug", plugName)

//Load Internal Plug
if internalPlug, ok := p.InternalPlugList[plugName]; ok {

p.ResolveStream = internalPlug.ResolveStream
internalPlug.SetFlag(plugParams)
p.BPF = internalPlug.BPFFilter()
p.BPF = internalPlug.BPFFilter()

return
}

//Load External Plug
plug, err := plugin.Open("./plug/"+ plugName)
plug, err := plugin.Open("./plug/" + plugName)
if err != nil {
panic(err)
}
Expand All @@ -174,5 +179,5 @@ func (p *Plug) SetOption(plugName string, plugParams []string) {
}
p.ResolveStream = resolvePacket.(func(net gopacket.Flow, transport gopacket.Flow, r io.Reader))
setFlag.(func([]string))(plugParams)
p.BPF = BPFFilter.(func()string)()
}
p.BPF = BPFFilter.(func() string)()
}
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ import (
func main() {
core := core.New()
core.Run()
}
}
Loading