npcap.go 4.7 KB

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