rdp.go 1.9 KB

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