hid_show.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package hid
  2. import (
  3. "sort"
  4. "time"
  5. "github.com/bettercap/bettercap/network"
  6. "github.com/dustin/go-humanize"
  7. "github.com/evilsocket/islazy/tui"
  8. )
  9. var (
  10. AliveTimeInterval = time.Duration(5) * time.Minute
  11. PresentTimeInterval = time.Duration(1) * time.Minute
  12. JustJoinedTimeInterval = time.Duration(10) * time.Second
  13. )
  14. func (mod *HIDRecon) getRow(dev *network.HIDDevice) []string {
  15. sinceLastSeen := time.Since(dev.LastSeen)
  16. seen := dev.LastSeen.Format("15:04:05")
  17. if sinceLastSeen <= JustJoinedTimeInterval {
  18. seen = tui.Bold(seen)
  19. } else if sinceLastSeen > PresentTimeInterval {
  20. seen = tui.Dim(seen)
  21. }
  22. return []string{
  23. dev.Address,
  24. dev.Type.String(),
  25. dev.Channels(),
  26. humanize.Bytes(dev.PayloadsSize()),
  27. seen,
  28. }
  29. }
  30. func (mod *HIDRecon) doFilter(dev *network.HIDDevice) bool {
  31. if mod.selector.Expression == nil {
  32. return true
  33. }
  34. return mod.selector.Expression.MatchString(dev.Address)
  35. }
  36. func (mod *HIDRecon) doSelection() (err error, devices []*network.HIDDevice) {
  37. if err = mod.selector.Update(); err != nil {
  38. return
  39. }
  40. devices = mod.Session.HID.Devices()
  41. filtered := []*network.HIDDevice{}
  42. for _, dev := range devices {
  43. if mod.doFilter(dev) {
  44. filtered = append(filtered, dev)
  45. }
  46. }
  47. devices = filtered
  48. switch mod.selector.SortField {
  49. case "mac":
  50. sort.Sort(ByHIDMacSorter(devices))
  51. case "seen":
  52. sort.Sort(ByHIDSeenSorter(devices))
  53. }
  54. // default is asc
  55. if mod.selector.Sort == "desc" {
  56. // from https://github.com/golang/go/wiki/SliceTricks
  57. for i := len(devices)/2 - 1; i >= 0; i-- {
  58. opp := len(devices) - 1 - i
  59. devices[i], devices[opp] = devices[opp], devices[i]
  60. }
  61. }
  62. if mod.selector.Limit > 0 {
  63. limit := mod.selector.Limit
  64. max := len(devices)
  65. if limit > max {
  66. limit = max
  67. }
  68. devices = devices[0:limit]
  69. }
  70. return
  71. }
  72. func (mod *HIDRecon) colNames() []string {
  73. colNames := []string{"MAC", "Type", "Channels", "Data", "Seen"}
  74. switch mod.selector.SortField {
  75. case "mac":
  76. colNames[0] += " " + mod.selector.SortSymbol
  77. case "seen":
  78. colNames[4] += " " + mod.selector.SortSymbol
  79. }
  80. return colNames
  81. }
  82. func (mod *HIDRecon) Show() (err error) {
  83. var devices []*network.HIDDevice
  84. if err, devices = mod.doSelection(); err != nil {
  85. return
  86. }
  87. rows := make([][]string, 0)
  88. for _, dev := range devices {
  89. rows = append(rows, mod.getRow(dev))
  90. }
  91. tui.Table(mod.Session.Events.Stdout, mod.colNames(), rows)
  92. if mod.sniffAddrRaw == nil {
  93. mod.Printf("\nchannel:%d\n\n", mod.channel)
  94. } else {
  95. mod.Printf("\nchannel:%d sniffing:%s\n\n", mod.channel, tui.Red(mod.sniffAddr))
  96. }
  97. if len(rows) > 0 {
  98. mod.Session.Refresh()
  99. }
  100. return nil
  101. }