npcap.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package network
  2. import (
  3. "fmt"
  4. "gbase/glog"
  5. "github.com/google/gopacket"
  6. "github.com/google/gopacket/layers"
  7. "github.com/google/gopacket/pcap"
  8. "os"
  9. "strings"
  10. "time"
  11. )
  12. func GetLoopbackInterface() (loopbackInterfaceName string, err error) {
  13. // 获取所有网络接口
  14. interfaces, err := pcap.FindAllDevs()
  15. if err != nil {
  16. glog.XWarning(fmt.Sprintf("pcap.FindAllDevs error : %v\n", err))
  17. return
  18. }
  19. found := false
  20. // 遍历所有接口,找到环回接口
  21. for _, iface := range interfaces {
  22. if isLoopback(iface) {
  23. //fmt.Printf("Name: %s, Description: %s\n", iface.Name, iface.Description)
  24. loopbackInterfaceName = iface.Name
  25. found = true
  26. break
  27. }
  28. }
  29. if !found {
  30. glog.XWarning("No loopback interface found")
  31. return loopbackInterfaceName, fmt.Errorf("No loopback interface found")
  32. }
  33. return loopbackInterfaceName, nil
  34. }
  35. func GetAllLoopbackInterface() (interfaceNames []string, err error) {
  36. interfaceNames = []string{}
  37. // 获取所有网络接口
  38. interfaces, err := pcap.FindAllDevs()
  39. if err != nil {
  40. glog.XWarning(fmt.Sprintf("pcap.FindAllDevs error : %v\n", err))
  41. return interfaceNames, err
  42. }
  43. for _, face := range interfaces {
  44. for _, address := range face.Addresses {
  45. println(face.Name + "-----------------" + address.IP.String())
  46. }
  47. interfaceNames = append(interfaceNames, face.Name)
  48. }
  49. return interfaceNames, nil
  50. }
  51. // 判断接口是否是环回接口
  52. func isLoopback(iface pcap.Interface) bool {
  53. for _, address := range iface.Addresses {
  54. if address.IP.IsLoopback() {
  55. return true
  56. }
  57. }
  58. return false
  59. }
  60. func Sniffer(interfaceName, sqlName string, port int) (err error) {
  61. // 打开环回接口
  62. handle, err := pcap.OpenLive(interfaceName, 1600, true, pcap.BlockForever)
  63. if err != nil {
  64. glog.XWarning(fmt.Sprintf("pcap.OpenLive %v error : %v\n", interfaceName, err))
  65. return err
  66. }
  67. defer handle.Close()
  68. // 设置过滤器,只捕获 TCP 1433 端口(SQL Server 端口)的数据包
  69. filter := fmt.Sprintf("tcp and port %v", port)
  70. err = handle.SetBPFFilter(filter)
  71. if err != nil {
  72. glog.XWarning(fmt.Sprintf("handle.SetBPFFilter error : %v\n", err))
  73. return err
  74. }
  75. glog.XWarning(fmt.Sprintf("Listening on %s\n", interfaceName))
  76. filename := fmt.Sprintf("%v%v.txt", sqlName, time.Now().Format("20060102030405"))
  77. fileHandle, err := os.Create(filename)
  78. if err != nil {
  79. glog.XWarning(fmt.Sprintf("os.Create %v error : %v\n", filename, err))
  80. return err
  81. }
  82. defer fileHandle.Close()
  83. // 创建数据包源
  84. packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
  85. for packet := range packetSource.Packets() {
  86. sqlStatement, err := processPacket(packet)
  87. if err == nil {
  88. fileHandle.Write([]byte(sqlStatement + "\n"))
  89. }
  90. }
  91. return nil
  92. }
  93. func processPacket(packet gopacket.Packet) (sqlStatement string, err error) {
  94. // 检测是否存在任何错误
  95. errs := packet.ErrorLayer()
  96. if err != nil {
  97. glog.XWarning(fmt.Sprintf("decoding packet error : %v\n", errs.Error()))
  98. return
  99. }
  100. // 解析 TCP 层
  101. tcpLayer := packet.Layer(layers.LayerTypeTCP)
  102. if tcpLayer == nil {
  103. return
  104. }
  105. // 打印应用层/有效载荷
  106. applicationLayer := packet.ApplicationLayer()
  107. if applicationLayer == nil {
  108. return
  109. }
  110. payload := applicationLayer.Payload()
  111. sqlStatement = extractSQLFromPayload(payload)
  112. if sqlStatement != "" {
  113. return sqlStatement, nil
  114. }
  115. return sqlStatement, nil
  116. }
  117. func extractSQLFromPayload(payload []byte) string {
  118. // 将字节转换为字符串
  119. data := string(payload)
  120. data = strings.ReplaceAll(data, "\r", "")
  121. data = strings.ReplaceAll(data, "\n", "")
  122. data = strings.ReplaceAll(data, "\r\n", "")
  123. data = strings.ReplaceAll(data, "\t", "")
  124. // 检查是否包含 SQL 关键字
  125. if containsSQLKeyword(data) {
  126. return data
  127. }
  128. return ""
  129. }
  130. func containsSQLKeyword(data string) bool {
  131. keywords := []string{"INSERT", "UPDATE", "DELETE", "SELECT"}
  132. for _, keyword := range keywords {
  133. if strings.Contains(strings.ToUpper(data), keyword) {
  134. return true
  135. }
  136. }
  137. return false
  138. }