npcap.go 4.2 KB

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