123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- package smb
- import (
- "bufio"
- "bytes"
- "encoding/binary"
- "encoding/hex"
- "errors"
- "io"
- "imuslab.com/smb/driver/mod/smb/encoder"
- )
- func (s *session) RPC(request interface{}, responce interface{}) (err error) {
- rw := bufio.NewReadWriter(bufio.NewReader(s.conn), bufio.NewWriter(s.conn))
- buf, err := encoder.Marshal(request)
- if err != nil {
- s.Debug("", err)
- return err
- }
- err = s.Send(buf, rw)
- if err != nil {
- return err
- }
- data, _, err := s.Recv(rw)
- if err != nil {
- return err
- }
- s.Debug("Unmarshalling SessionSetup1 response", nil)
- if err = encoder.Unmarshal(data, responce); err != nil {
- s.Debug("Raw:\n"+hex.Dump(data), err)
- return
- }
- return err
- }
- func (s *session) Send(buf []byte, rw *bufio.ReadWriter) (err error) {
- b := new(bytes.Buffer)
- if err = binary.Write(b, binary.BigEndian, uint32(len(buf))); err != nil {
- s.Debug("", err)
- return
- }
- if _, err = rw.Write(append(b.Bytes(), buf...)); err != nil {
- s.Debug("", err)
- return
- }
- return rw.Flush()
- }
- func (s *session) Recv(rw *bufio.ReadWriter) (data []byte, ver string, err error) {
- var size uint32
- if err = binary.Read(rw, binary.BigEndian, &size); err != nil {
- s.Debug("", err)
- return
- }
- if size > 0x00FFFFFF {
- return nil, "", errors.New("Invalid NetBIOS Session message")
- }
- data = make([]byte, size)
- l, err := io.ReadFull(rw, data)
- if err != nil {
- s.Debug("", err)
- return nil, "", err
- }
- if uint32(l) != size {
- return nil, "", errors.New("Message size invalid")
- }
- protID := data[0:4]
- switch string(protID) {
- default:
- return nil, "", ErrHeaderSmb1 // errors.New("Protocol Not Implemented")
- case ProtocolSmb2:
- return data, string(protID), nil
- case ProtocolSmb:
- return data, string(protID), nil
- }
- }
- // func (s *Session) _______sendLegacy(req interface{}) (res []byte, err error) {
- // buf, err := encoder.Marshal(req)
- // if err != nil {
- // s.Debug("", err)
- // return nil, err
- // }
- // b := new(bytes.Buffer)
- // if err = binary.Write(b, binary.BigEndian, uint32(len(buf))); err != nil {
- // s.Debug("", err)
- // return
- // }
- // rw := bufio.NewReadWriter(bufio.NewReader(s.conn), bufio.NewWriter(s.conn))
- // if _, err = rw.Write(append(b.Bytes(), buf...)); err != nil {
- // s.Debug("", err)
- // return
- // }
- // rw.Flush()
- // var size uint32
- // if err = binary.Read(rw, binary.BigEndian, &size); err != nil {
- // s.Debug("", err)
- // return
- // }
- // if size > 0x00FFFFFF {
- // return nil, errors.New("Invalid NetBIOS Session message")
- // }
- // data := make([]byte, size)
- // l, err := io.ReadFull(rw, data)
- // if err != nil {
- // s.Debug("", err)
- // return nil, err
- // }
- // if uint32(l) != size {
- // return nil, errors.New("Message size invalid")
- // }
- // protID := data[0:4]
- // switch string(protID) {
- // default:
- // return nil, errors.New("Protocol Not Implemented")
- // case ProtocolSmb2:
- // }
- // return data, nil
- // }
|