rdp.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package sniff
  2. import (
  3. "context"
  4. "encoding/binary"
  5. "io"
  6. "os"
  7. "github.com/sagernet/sing-box/adapter"
  8. C "github.com/sagernet/sing-box/constant"
  9. "github.com/sagernet/sing/common/rw"
  10. )
  11. func RDP(_ context.Context, metadata *adapter.InboundContext, reader io.Reader) error {
  12. var tpktVersion uint8
  13. err := binary.Read(reader, binary.BigEndian, &tpktVersion)
  14. if err != nil {
  15. return err
  16. }
  17. if tpktVersion != 0x03 {
  18. return os.ErrInvalid
  19. }
  20. var tpktReserved uint8
  21. err = binary.Read(reader, binary.BigEndian, &tpktReserved)
  22. if err != nil {
  23. return err
  24. }
  25. if tpktReserved != 0x00 {
  26. return os.ErrInvalid
  27. }
  28. var tpktLength uint16
  29. err = binary.Read(reader, binary.BigEndian, &tpktLength)
  30. if err != nil {
  31. return err
  32. }
  33. if tpktLength != 19 {
  34. return os.ErrInvalid
  35. }
  36. var cotpLength uint8
  37. err = binary.Read(reader, binary.BigEndian, &cotpLength)
  38. if err != nil {
  39. return err
  40. }
  41. if cotpLength != 14 {
  42. return os.ErrInvalid
  43. }
  44. var cotpTpduType uint8
  45. err = binary.Read(reader, binary.BigEndian, &cotpTpduType)
  46. if err != nil {
  47. return err
  48. }
  49. if cotpTpduType != 0xE0 {
  50. return os.ErrInvalid
  51. }
  52. err = rw.SkipN(reader, 5)
  53. if err != nil {
  54. return err
  55. }
  56. var rdpType uint8
  57. err = binary.Read(reader, binary.BigEndian, &rdpType)
  58. if err != nil {
  59. return err
  60. }
  61. if rdpType != 0x01 {
  62. return os.ErrInvalid
  63. }
  64. var rdpFlags uint8
  65. err = binary.Read(reader, binary.BigEndian, &rdpFlags)
  66. if err != nil {
  67. return err
  68. }
  69. var rdpLength uint8
  70. err = binary.Read(reader, binary.BigEndian, &rdpLength)
  71. if err != nil {
  72. return err
  73. }
  74. if rdpLength != 8 {
  75. return os.ErrInvalid
  76. }
  77. metadata.Protocol = C.ProtocolRDP
  78. return nil
  79. }