dcerpc.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. package smb
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "encoding/hex"
  6. "fmt"
  7. "strings"
  8. "imuslab.com/smb/driver/mod/smb/encoder"
  9. "imuslab.com/smb/driver/mod/util"
  10. )
  11. // 此文件提供ms-rpce封装
  12. // DCE/RPC RPC over SMB 协议实现
  13. // https://pubs.opengroup.org/onlinepubs/9629399/
  14. // RPC over SMB 标准头
  15. // type PDUHeader struct {
  16. // StructureSize uint16
  17. // DataOffset uint16 `smb:"offset:Buffer"`
  18. // WriteLength uint32 `smb:"len:Buffer"`
  19. // FileOffset []byte `smb:"fixed:8"`
  20. // FileId []byte `smb:"fixed:16"` //16字节,服务端返回句柄
  21. // Channel uint32
  22. // RemainingBytes uint32
  23. // WriteChannelInfoOffset uint16
  24. // WriteChannelInfoLength uint16
  25. // WriteFlags uint32
  26. // Buffer interface{} //写入的数据
  27. // }
  28. // DCE/RPC 标准头
  29. type PDUHeaderStruct struct {
  30. Version uint8
  31. VersionMinor uint8
  32. PacketType PDUType
  33. PacketFlags uint8
  34. DataRepresentation uint32 //4字节,小端排序,0x10
  35. FragLength uint16 //2字节,整个结构的长度
  36. AuthLength uint16
  37. CallId uint32
  38. Buffer interface{} //PDUBindStruct //PDUBindAckStruct//PDUResponseStruct
  39. }
  40. // 函数绑定结构
  41. type PDUBindStruct struct {
  42. //PDUHeader
  43. MaxXmitFrag uint16 //4字节,发送大小协商
  44. MaxRecvFrag uint16 //4字节,接收大小协商
  45. AssocGroup uint32
  46. NumCtxItems uint8
  47. Reserved uint8
  48. Reserved2 uint16
  49. CtxItem PDUCtxEItem
  50. }
  51. // PDU CtxItem结构
  52. type PDUCtxEItem struct {
  53. ContextId uint16
  54. NumTransItems uint8
  55. Reserved uint8
  56. AbstractSyntax PDUSyntaxID
  57. TransferSyntax PDUSyntaxID
  58. }
  59. type PDUSyntaxID struct {
  60. UUID []byte `smb:"fixed:16"`
  61. Version uint32
  62. }
  63. type PDURequestStruct struct {
  64. //PDUHeader
  65. AllocHint uint32
  66. ContextID uint16
  67. Opnum uint16 //15 is NetSharedEnumAll
  68. Buffer interface{} //写入的数据
  69. }
  70. type PointerToServerUnc struct {
  71. ReferentId uint32
  72. MaxCount uint32
  73. Offset uint32
  74. ActualCount uint32
  75. ServerUnc string
  76. }
  77. var _ encoder.BinaryMarshallable = Status(0)
  78. func (c *PointerToServerUnc) MarshalBinary(meta *encoder.Metadata) ([]byte, error) {
  79. buf := bytes.NewBuffer(nil)
  80. serverUNC := encoder.ToUnicode(c.ServerUnc)
  81. c.MaxCount = uint32(len(serverUNC))
  82. c.ActualCount = uint32(len(serverUNC))
  83. binary.Write(buf, binary.LittleEndian, c.ReferentId)
  84. binary.Write(buf, binary.LittleEndian, c.MaxCount)
  85. binary.Write(buf, binary.LittleEndian, c.Offset)
  86. binary.Write(buf, binary.LittleEndian, c.ActualCount)
  87. if len(c.ServerUnc) > 0 {
  88. buf.Write(serverUNC)
  89. return buf.Bytes(), nil
  90. }
  91. return buf.Bytes(), nil
  92. }
  93. func (c *PointerToServerUnc) UnmarshalBinary(data []byte, meta *encoder.Metadata) (interface{}, error) {
  94. buf := bytes.NewBuffer(data)
  95. binary.Read(buf, binary.LittleEndian, &c.ReferentId)
  96. binary.Read(buf, binary.LittleEndian, &c.MaxCount)
  97. binary.Read(buf, binary.LittleEndian, &c.Offset)
  98. binary.Read(buf, binary.LittleEndian, &c.ActualCount)
  99. name := make([]byte, c.ActualCount*2)
  100. buf.Read(name)
  101. c.ServerUnc, _ = encoder.FromUnicode(name)
  102. meta.CurrOffset += uint64(16 + len(name))
  103. // logx.Infof("unc: [%v]", c.ServerUnc)
  104. return c, nil
  105. }
  106. type PointerToResumeHandle struct {
  107. ReferentID uint32
  108. ResumeHandle uint32
  109. }
  110. type NetShareEnumAllRequest struct {
  111. PointerToServerUnc
  112. Reserved uint16
  113. PointertoLevel uint32 //level 1
  114. PointerToCtr PointerToCtr //[]byte `smb:"fixed:16"`
  115. MaxBuffer uint32
  116. PointerToResumeHandle
  117. }
  118. type NetShareEnumAllResponse struct {
  119. PointertoLevel uint32 //level 1
  120. PointerToCtr *PointerToCtr // []byte `smb:"fixed:16"`
  121. // Reserved uint16
  122. PointerToTotalentries uint32
  123. PointerToResumeHandle uint32
  124. Werr_OK uint32
  125. }
  126. type PointerToCtr struct {
  127. Ctr uint32
  128. Ctr1ReferentID uint32 //ctr1
  129. Ctr1Count uint32
  130. info *srvsvc_NetShareInfo1
  131. }
  132. func (p *PointerToCtr) SetInfo(names, comments []string) error {
  133. if len(names) != len(comments) {
  134. return fmt.Errorf("names not equal comments")
  135. }
  136. var Array []srvsvc_NetShareInfo1_ArrayItem
  137. for i := 0; i < len(names); i++ {
  138. Array = append(Array, srvsvc_NetShareInfo1_ArrayItem{
  139. PointerToName_Name: []rune(names[i]),
  140. PointerToComment_Name: []rune(comments[i]),
  141. })
  142. }
  143. p.info = &srvsvc_NetShareInfo1{
  144. Array: Array,
  145. }
  146. return nil
  147. }
  148. var _ encoder.BinaryMarshallable = Status(0)
  149. func (c *PointerToCtr) MarshalBinary(meta *encoder.Metadata) ([]byte, error) {
  150. c.Ctr = 0x0001
  151. if c.info != nil {
  152. c.Ctr1Count = c.info.MaxCount
  153. }
  154. c.Ctr1ReferentID = 0x0001
  155. buf := bytes.NewBuffer(nil)
  156. binary.Write(buf, binary.LittleEndian, c.Ctr)
  157. binary.Write(buf, binary.LittleEndian, c.Ctr1ReferentID)
  158. binary.Write(buf, binary.LittleEndian, c.Ctr1Count)
  159. if c.info == nil {
  160. binary.Write(buf, binary.LittleEndian, uint32(0))
  161. return buf.Bytes(), nil
  162. }
  163. info := c.info
  164. info.MaxCount = uint32(len(info.Array))
  165. info.ReferentID = 0x0001
  166. binary.Write(buf, binary.LittleEndian, info.ReferentID)
  167. binary.Write(buf, binary.LittleEndian, info.MaxCount)
  168. for i := 0; i < int(info.MaxCount); i++ {
  169. item := &info.Array[i]
  170. item.PointerToName_ReferenceID = 0x001
  171. item.PointerToComment_ReferenceID = 0x001
  172. binary.Write(buf, binary.LittleEndian, item.PointerToName_ReferenceID)
  173. binary.Write(buf, binary.LittleEndian, item.Type)
  174. binary.Write(buf, binary.LittleEndian, item.PointerToComment_ReferenceID)
  175. }
  176. for i := 0; i < int(info.MaxCount); i++ {
  177. item := &info.Array[i]
  178. if true {
  179. //name
  180. size := uint32(len(item.PointerToName_Name))
  181. item.PointerToName_MaxCount = size + 1
  182. item.PointerToName_Offset = 0
  183. item.PointerToName_ActualCount = size + 1
  184. // logx.Printf("name: %v, len: %v", item.PointerToName_Name, len(item.PointerToName_Name))
  185. // for i, str := range item.PointerToName_Name {
  186. // logx.Printf("i: %v, char: %v", i, string(str))
  187. // }
  188. binary.Write(buf, binary.LittleEndian, item.PointerToName_MaxCount)
  189. binary.Write(buf, binary.LittleEndian, item.PointerToName_Offset)
  190. binary.Write(buf, binary.LittleEndian, item.PointerToName_ActualCount)
  191. name := encoder.ToUnicode(string(item.PointerToName_Name))
  192. buf.Write(name)
  193. //ouput 0x after name
  194. buf.Write(make([]byte, 2))
  195. if item.PointerToName_ActualCount%2 == 1 {
  196. //单数就对齐一下, 需要把对齐的写一下.
  197. padbuf := make([]byte, 2)
  198. buf.Write(padbuf)
  199. }
  200. }
  201. if true {
  202. //comment
  203. size := uint32(len(item.PointerToComment_Name))
  204. item.PointerToComment_MaxCount = size + 1
  205. item.PointerToComment_Offset = 0
  206. item.PointerToComment_ActualCount = size + 1
  207. binary.Write(buf, binary.LittleEndian, item.PointerToComment_MaxCount)
  208. binary.Write(buf, binary.LittleEndian, item.PointerToComment_Offset)
  209. binary.Write(buf, binary.LittleEndian, item.PointerToComment_ActualCount)
  210. name := encoder.ToUnicode(string(item.PointerToComment_Name))
  211. buf.Write(name)
  212. //ouput 0x after name
  213. buf.Write(make([]byte, 2))
  214. isEnd := int(info.MaxCount)-1 == i
  215. if item.PointerToComment_ActualCount%2 == 1 && !isEnd {
  216. //单数就对齐一下, 需要把对齐的写一下.
  217. padbuf := make([]byte, 2)
  218. buf.Write(padbuf)
  219. }
  220. }
  221. }
  222. return buf.Bytes(), nil
  223. }
  224. func (c *PointerToCtr) UnmarshalBinary(data []byte, meta *encoder.Metadata) (interface{}, error) {
  225. buf := bytes.NewBuffer(data)
  226. binary.Read(buf, binary.LittleEndian, &c.Ctr)
  227. binary.Read(buf, binary.LittleEndian, &c.Ctr1ReferentID)
  228. binary.Read(buf, binary.LittleEndian, &c.Ctr1Count)
  229. if c.Ctr1Count == 0 {
  230. meta.CurrOffset += 16
  231. return c, nil
  232. }
  233. info := &srvsvc_NetShareInfo1{}
  234. c.info = info
  235. binary.Read(buf, binary.LittleEndian, &info.ReferentID)
  236. binary.Read(buf, binary.LittleEndian, &info.MaxCount)
  237. info.Array = make([]srvsvc_NetShareInfo1_ArrayItem, int(info.MaxCount))
  238. for i := 0; i < int(info.MaxCount); i++ {
  239. item := &info.Array[i]
  240. binary.Read(buf, binary.LittleEndian, &item.PointerToComment_ReferenceID)
  241. binary.Read(buf, binary.LittleEndian, &item.Type)
  242. binary.Read(buf, binary.LittleEndian, &item.PointerToComment_ReferenceID)
  243. }
  244. for i := 0; i < int(info.MaxCount); i++ {
  245. item := &info.Array[i]
  246. if true {
  247. binary.Read(buf, binary.LittleEndian, &item.PointerToName_MaxCount)
  248. binary.Read(buf, binary.LittleEndian, &item.PointerToName_Offset)
  249. binary.Read(buf, binary.LittleEndian, &item.PointerToName_ActualCount)
  250. namebuf := make([]byte, (item.PointerToName_ActualCount)*2)
  251. buf.Read(namebuf)
  252. if item.PointerToName_ActualCount%2 == 1 {
  253. //单数就对齐一下, 需要把对齐的读取出来.
  254. padbuf := make([]byte, 2)
  255. buf.Read(padbuf)
  256. }
  257. name, err := encoder.FromUnicode(namebuf)
  258. if err != nil {
  259. return nil, err
  260. }
  261. if name[len(name)-1] == 0x00 {
  262. name = name[:len(name)-1]
  263. }
  264. printstr := func(name string) {
  265. fmt.Printf("name len: %v", len(name))
  266. for i, str := range name {
  267. fmt.Printf("string i: %v, char: %v", i, string(str))
  268. }
  269. r := []rune(name)
  270. fmt.Println(r)
  271. for i, str := range r {
  272. fmt.Printf("run i: %v, char: %v", i, string(str))
  273. }
  274. }
  275. printstr(name)
  276. item.PointerToName_Name = []rune(name)
  277. }
  278. if true {
  279. binary.Read(buf, binary.LittleEndian, &item.PointerToComment_MaxCount)
  280. binary.Read(buf, binary.LittleEndian, &item.PointerToComment_Offset)
  281. binary.Read(buf, binary.LittleEndian, &item.PointerToComment_ActualCount)
  282. namebuf := make([]byte, (item.PointerToComment_ActualCount)*2)
  283. buf.Read(namebuf)
  284. if item.PointerToComment_ActualCount%2 == 1 {
  285. //单数就对齐一下, 需要把对齐的读取出来.
  286. padbuf := make([]byte, 2)
  287. buf.Read(padbuf)
  288. }
  289. name, err := encoder.FromUnicode(namebuf)
  290. if err != nil {
  291. return nil, err
  292. }
  293. if name[len(name)-1] == 0x00 {
  294. name = name[:len(name)-1]
  295. }
  296. item.PointerToComment_Name = []rune(name)
  297. }
  298. }
  299. return c, nil
  300. }
  301. type srvsvc_NetShareInfo1_ArrayItem struct {
  302. PointerToName_ReferenceID uint32
  303. Type uint32
  304. PointerToComment_ReferenceID uint32
  305. PointerToName_MaxCount uint32
  306. PointerToName_Offset uint32
  307. PointerToName_ActualCount uint32
  308. PointerToName_Name []rune // string
  309. PointerToComment_MaxCount uint32
  310. PointerToComment_Offset uint32
  311. PointerToComment_ActualCount uint32
  312. PointerToComment_Name []rune // string
  313. }
  314. type srvsvc_NetShareInfo1 struct {
  315. ReferentID uint32
  316. MaxCount uint32
  317. Array []srvsvc_NetShareInfo1_ArrayItem
  318. }
  319. type PDUResponseStruct struct {
  320. //PDUHeader
  321. AllocHint uint32
  322. ContextID uint16
  323. Opnum uint16 //15 is NetSharedEnumAll
  324. Buffer interface{} //写入的数据
  325. }
  326. // PDU CtxItem响应结构
  327. type PDUCtxEItemResponseStruct struct {
  328. AckResult uint16
  329. AckReason uint16
  330. TransferSyntax []byte `smb:"fixed:16"` //16字节
  331. SyntaxVer uint32
  332. }
  333. type PDUBindAckStruct struct {
  334. //https://pubs.opengroup.org/onlinepubs/9629399/chap12.htm
  335. MaxXmitFrag uint16
  336. MaxRecvFrag uint16
  337. AssocGroup uint32
  338. ScndryAddrlen uint16
  339. ScndryAddr []byte `smb:"count:ScndryAddrlen"` //取决管道的长度
  340. Reserved0 uint8 //这里的0-3我不确定会不会有问题.因为没找到文档.
  341. NumResults uint8
  342. Reserved1 uint8
  343. Reserved2 uint8
  344. Reserved3 uint8
  345. CtxItem PDUCtxEItemResponseStruct
  346. }
  347. type PDUType uint8
  348. // PDU PacketType
  349. // https://pubs.opengroup.org/onlinepubs/9629399/chap12.htm
  350. const (
  351. PDURequest PDUType = 0
  352. PDUPing PDUType = 1
  353. PDUResponse PDUType = 2
  354. PDUFault PDUType = 3
  355. PDUWorking PDUType = 4
  356. PDUNoCall PDUType = 5
  357. PDUReject PDUType = 6
  358. PDUAck PDUType = 7
  359. PDUCl_Cancel PDUType = 8
  360. PDUFack PDUType = 9
  361. PDUCancel_Ack PDUType = 10
  362. PDUBind PDUType = 11
  363. PDUBind_Ack PDUType = 12
  364. PDUBind_Nak PDUType = 13
  365. PDUAlter_Context PDUType = 14
  366. PDUAlter_Context_Resp PDUType = 15
  367. PDUShutdown PDUType = 17
  368. PDUCo_Cancel PDUType = 18
  369. PDUOrphaned PDUType = 19
  370. )
  371. var _ encoder.BinaryMarshallable = PDUType(0)
  372. func (c PDUType) MarshalBinary(meta *encoder.Metadata) ([]byte, error) {
  373. return MarshalBinary(c, meta, c)
  374. }
  375. func (c PDUType) UnmarshalBinary(data []byte, meta *encoder.Metadata) (interface{}, error) {
  376. return UnmarshalBinary(c, data, meta, c)
  377. }
  378. // PDU PacketFlags
  379. // https://pubs.opengroup.org/onlinepubs/9629399/chap12.htm
  380. const (
  381. PDUFlagReserved_01 = 0x01
  382. PDUFlagLastFrag = 0x02
  383. PDUFlagPending = 0x03
  384. PDUFlagFrag = 0x04
  385. PDUFlagNoFack = 0x08
  386. PDUFlagMayBe = 0x10
  387. PDUFlagIdemPotent = 0x20
  388. PDUFlagBroadcast = 0x40
  389. PDUFlagReserved_80 = 0x80
  390. )
  391. // NDR 传输标准
  392. // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rpce/b6090c2b-f44a-47a1-a13b-b82ade0137b2
  393. const (
  394. NDRSyntax = "8a885d04-1ceb-11c9-9fe8-08002b104860" //Version 02, NDR64 data representation protocol
  395. NDR64Syntax = "71710533-BEBA-4937-8319-B5DBEF9CCC36" //Version 01, NDR64 data representation protocol
  396. )
  397. // 处理PDU uuid 转成字节数组
  398. func PDUUuidFromBytes(uuid string) []byte {
  399. s := strings.ReplaceAll(uuid, "-", "")
  400. b, _ := hex.DecodeString(s)
  401. r := []byte{b[3], b[2], b[1], b[0], b[5], b[4], b[7], b[6], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]}
  402. return r
  403. }
  404. func DcerpcRead(ctx *DataCtx, r *ReadRequest) (interface{}, error) {
  405. data, err := DcerpcReadRaw(ctx)
  406. if err != nil {
  407. return nil, err
  408. }
  409. resp := ReadResponse{
  410. Header: r.Header,
  411. StructureSize: 0x0011,
  412. DataOffset: 0x0050,
  413. DataLength: uint32(len(data)),
  414. Data: data,
  415. }
  416. return &resp, nil
  417. }
  418. func DcerpcReadRaw(ctx *DataCtx) ([]byte, error) {
  419. pdb := ctx.session.pdb
  420. var pdudata []byte
  421. var err error
  422. switch pdb.PacketType {
  423. case PDUBind:
  424. bind := pdb.Buffer.(PDUBindStruct)
  425. ScndryAddr := append([]byte("\\pipe\\srvsvc"), 0x0)
  426. NDRSyntaxData := PDUUuidFromBytes(NDRSyntax)
  427. var pduAck = &PDUBindAckStruct{
  428. MaxXmitFrag: bind.MaxXmitFrag,
  429. MaxRecvFrag: bind.MaxRecvFrag,
  430. AssocGroup: bind.AssocGroup,
  431. ScndryAddrlen: uint16(len(ScndryAddr)),
  432. ScndryAddr: ScndryAddr, //[]byte `smb:"count:ScndryAddrlen"` //取决管道的长度
  433. NumResults: 1, //uint8
  434. CtxItem: PDUCtxEItemResponseStruct{
  435. AckResult: 0,
  436. TransferSyntax: NDRSyntaxData,
  437. SyntaxVer: 2,
  438. },
  439. }
  440. fragLength := uint16(16 + util.SizeOfStruct(*pduAck))
  441. var pdu = PDUHeaderStruct{
  442. Version: pdb.Version,
  443. VersionMinor: pdb.VersionMinor,
  444. PacketType: PDUBind_Ack, //Bind_ack
  445. PacketFlags: pdb.PacketFlags,
  446. DataRepresentation: pdb.DataRepresentation,
  447. FragLength: fragLength, // 68, // pdb.FragLength,
  448. AuthLength: pdb.AuthLength,
  449. CallId: pdb.CallId,
  450. Buffer: pduAck,
  451. }
  452. pdudata, err = encoder.Marshal(pdu)
  453. if err != nil {
  454. return nil, err
  455. }
  456. case PDURequest:
  457. // request := pdb.Buffer.(PDURequestStruct)
  458. // var info = &srvsvc_NetShareInfo1{}
  459. ptc := &PointerToCtr{}
  460. var names = []string{
  461. // "IPC$",
  462. // "Documents",
  463. }
  464. var comments = []string{
  465. // "IPC Service",
  466. // "",
  467. }
  468. for _, anchor := range ctx.session.anchors {
  469. names = append(names, anchor.Name)
  470. comment := ""
  471. if anchor.Name == NamedPipeShareName {
  472. comment = "IPC Service"
  473. }
  474. comments = append(comments, comment)
  475. }
  476. ptc.SetInfo(names, comments)
  477. shareEnumAllResp := NetShareEnumAllResponse{
  478. PointertoLevel: 1,
  479. PointerToTotalentries: 2,
  480. PointerToCtr: ptc,
  481. }
  482. ptcBuf, err := encoder.Marshal(shareEnumAllResp)
  483. if err != nil {
  484. return nil, err
  485. }
  486. var response = &PDUResponseStruct{
  487. AllocHint: uint32(len(ptcBuf)),
  488. Buffer: shareEnumAllResp,
  489. // Buffer: &NetShareEnumAllResponse{PointerToCtr: ptc},
  490. }
  491. fragLength := uint16(24 + len(ptcBuf))
  492. var pdu = PDUHeaderStruct{
  493. Version: pdb.Version,
  494. VersionMinor: pdb.VersionMinor,
  495. PacketType: PDUResponse,
  496. PacketFlags: pdb.PacketFlags,
  497. DataRepresentation: pdb.DataRepresentation,
  498. FragLength: fragLength, // 68, // pdb.FragLength,
  499. AuthLength: pdb.AuthLength,
  500. CallId: pdb.CallId,
  501. Buffer: response,
  502. }
  503. pdudata, err = encoder.Marshal(pdu)
  504. if err != nil {
  505. return nil, err
  506. }
  507. default:
  508. return nil, fmt.Errorf("Not Support")
  509. }
  510. return pdudata, nil
  511. }
  512. func DcerpcWrite(ctx *DataCtx, r *WriteRequest) (interface{}, error) {
  513. buf := r.Data
  514. fragType := PDUType(buf[2])
  515. switch fragType {
  516. case PDUBind:
  517. var bind = &PDUBindStruct{}
  518. var pdb = PDUHeaderStruct{
  519. Buffer: bind,
  520. }
  521. if err := encoder.Unmarshal(buf, &pdb); err != nil {
  522. return nil, err
  523. }
  524. ctx.session.pdb = pdb
  525. case PDURequest:
  526. var PointerToCtr PointerToCtr
  527. var pdb = PDUHeaderStruct{
  528. Buffer: &PDURequestStruct{
  529. Buffer: &NetShareEnumAllRequest{
  530. PointerToCtr: PointerToCtr,
  531. },
  532. },
  533. }
  534. if err := encoder.Unmarshal(buf, &pdb); err != nil {
  535. return nil, err
  536. }
  537. ctx.session.pdb = pdb
  538. default:
  539. return nil, fmt.Errorf("Not Support")
  540. }
  541. resp := WriteResponse{
  542. Count: uint32(len(buf)),
  543. Header: r.Header,
  544. StructureSize: 0x0011,
  545. }
  546. return &resp, nil
  547. }