conn.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package smb
  2. import (
  3. "bufio"
  4. "bytes"
  5. "encoding/binary"
  6. "encoding/hex"
  7. "errors"
  8. "io"
  9. "imuslab.com/smb/driver/mod/smb/encoder"
  10. )
  11. func (s *session) RPC(request interface{}, responce interface{}) (err error) {
  12. rw := bufio.NewReadWriter(bufio.NewReader(s.conn), bufio.NewWriter(s.conn))
  13. buf, err := encoder.Marshal(request)
  14. if err != nil {
  15. s.Debug("", err)
  16. return err
  17. }
  18. err = s.Send(buf, rw)
  19. if err != nil {
  20. return err
  21. }
  22. data, _, err := s.Recv(rw)
  23. if err != nil {
  24. return err
  25. }
  26. s.Debug("Unmarshalling SessionSetup1 response", nil)
  27. if err = encoder.Unmarshal(data, responce); err != nil {
  28. s.Debug("Raw:\n"+hex.Dump(data), err)
  29. return
  30. }
  31. return err
  32. }
  33. func (s *session) Send(buf []byte, rw *bufio.ReadWriter) (err error) {
  34. b := new(bytes.Buffer)
  35. if err = binary.Write(b, binary.BigEndian, uint32(len(buf))); err != nil {
  36. s.Debug("", err)
  37. return
  38. }
  39. if _, err = rw.Write(append(b.Bytes(), buf...)); err != nil {
  40. s.Debug("", err)
  41. return
  42. }
  43. return rw.Flush()
  44. }
  45. func (s *session) Recv(rw *bufio.ReadWriter) (data []byte, ver string, err error) {
  46. var size uint32
  47. if err = binary.Read(rw, binary.BigEndian, &size); err != nil {
  48. s.Debug("", err)
  49. return
  50. }
  51. if size > 0x00FFFFFF {
  52. return nil, "", errors.New("Invalid NetBIOS Session message")
  53. }
  54. data = make([]byte, size)
  55. l, err := io.ReadFull(rw, data)
  56. if err != nil {
  57. s.Debug("", err)
  58. return nil, "", err
  59. }
  60. if uint32(l) != size {
  61. return nil, "", errors.New("Message size invalid")
  62. }
  63. protID := data[0:4]
  64. switch string(protID) {
  65. default:
  66. return nil, "", ErrHeaderSmb1 // errors.New("Protocol Not Implemented")
  67. case ProtocolSmb2:
  68. return data, string(protID), nil
  69. case ProtocolSmb:
  70. return data, string(protID), nil
  71. }
  72. }
  73. // func (s *Session) _______sendLegacy(req interface{}) (res []byte, err error) {
  74. // buf, err := encoder.Marshal(req)
  75. // if err != nil {
  76. // s.Debug("", err)
  77. // return nil, err
  78. // }
  79. // b := new(bytes.Buffer)
  80. // if err = binary.Write(b, binary.BigEndian, uint32(len(buf))); err != nil {
  81. // s.Debug("", err)
  82. // return
  83. // }
  84. // rw := bufio.NewReadWriter(bufio.NewReader(s.conn), bufio.NewWriter(s.conn))
  85. // if _, err = rw.Write(append(b.Bytes(), buf...)); err != nil {
  86. // s.Debug("", err)
  87. // return
  88. // }
  89. // rw.Flush()
  90. // var size uint32
  91. // if err = binary.Read(rw, binary.BigEndian, &size); err != nil {
  92. // s.Debug("", err)
  93. // return
  94. // }
  95. // if size > 0x00FFFFFF {
  96. // return nil, errors.New("Invalid NetBIOS Session message")
  97. // }
  98. // data := make([]byte, size)
  99. // l, err := io.ReadFull(rw, data)
  100. // if err != nil {
  101. // s.Debug("", err)
  102. // return nil, err
  103. // }
  104. // if uint32(l) != size {
  105. // return nil, errors.New("Message size invalid")
  106. // }
  107. // protID := data[0:4]
  108. // switch string(protID) {
  109. // default:
  110. // return nil, errors.New("Protocol Not Implemented")
  111. // case ProtocolSmb2:
  112. // }
  113. // return data, nil
  114. // }