private static void WriteKelinciStatusAsync(NetworkStream stream, DataTypes.FuzzingResult fuzzingResult, CancellationToken token) { // Send Status stream.WriteAsync(fuzzingResult.FuzzingStatusByte, 0, 1, token); // Send Bitmap stream.WriteAsync(fuzzingResult.Bitmap, 0, fuzzingResult.Bitmap.Length, token); }
public static async Task StartKelinciInterface(int port, IfTargetState targetState) { TcpListener server = new TcpListener(IPAddress.Any, port); try { server.Start(); Logger.Trace("Kelinci Server Started, waiting for session"); while (true) { #region Initialize // Start new session with Kelinci TcpClient client = server.AcceptTcpClient(); var stream = client.GetStream(); DataTypes.FuzzingResult result = new DataTypes.FuzzingResult(StatusCommError, new byte[65536]); CancellationTokenSource cts = new CancellationTokenSource(); Logger.Trace("{0:000000} Start", _sessionCounter); #endregion try { #region ReadKelinciData cts.CancelAfter(Parameters.TimeoutReadKelinciDataAsync); KelinciData kelinciData = await ReadKelinciDataAsync(stream, cts.Token); Logger.Trace("{0:000000} REC KELINCI: Mode: {1}, Length: {2}, Data: {3}", _sessionCounter, kelinciData.Mode, kelinciData.Length, kelinciData.Data); #endregion if (Parameters.ShortCircuitTesting) { result.FuzzingStatus = StatusSuccess; } else { #region Start State Machine cts.CancelAfter(Parameters.TimeoutStartStateMachineAsync); result = await StateMachine.StartStateMachineAsync(_sessionCounter, kelinciData.Data, targetState, cts.Token); #endregion } } #region Error Handling and Writeback to Kelinci catch (OperationCanceledException e) { Logger.Warn("{0:000000} TIMEOUT: {1}", _sessionCounter, e.Message); result.FuzzingStatus = StatusTimeout; } catch (Exception e) { Logger.Error("{0:000000} Exception: {1}", _sessionCounter, e.Message); result.FuzzingStatus = StatusCommError; } #region WriteKelinciStatus and close stream + client try { cts.CancelAfter(Parameters.TimeoutWriteKelinciStatusAsync); WriteKelinciStatusAsync(stream, result, cts.Token); if (result.FuzzingStatus == StatusTimeout) { Logger.Warn("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter, result.FuzzingStatus, result.Bitmap.Length); } else if (result.FuzzingStatus == StatusCommError) { Logger.Error("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter, result.FuzzingStatus, result.Bitmap.Length); } else if (result.FuzzingStatus == StatusCrash) { Logger.Fatal("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter, result.FuzzingStatus, result.Bitmap.Length); Alarms.PlayAlarmInfinite(); } else { Logger.Info("{0:000000} STATUS: {1}, BITMAP: {2}", _sessionCounter, result.FuzzingStatus, result.Bitmap.Length); } } catch (Exception e) { Logger.Error("{0:000000} WriteKelinciException: {1}", _sessionCounter, e.Message); } finally { stream.Close(); client.Close(); } #endregion //if (result.FuzzingStatus == StatusCrash) //{ // throw new Exception("CRASH DETECTED"); //} Logger.Trace("{0:000000} End", _sessionCounter); _sessionCounter++; #endregion } } catch (SocketException e) { Logger.Fatal("CRASH: Kelinci Interface: SocketException: {0}", e.Message); server.Stop(); throw; } finally { server.Server.Dispose(); } }