/// <summary> /// Return if are WER file /// </summary> /// <param name="zipCrashData">Crash data</param> /// <param name="exploitResult">Exploitation result</param> /// <param name="isAlive">IsAlive</param> /// <param name="errorId">Error Id</param> public bool IsCrashed(out byte[] zipCrashData, out FuzzerError.EExplotationResult exploitResult, Func <bool> isAlive, out Guid errorId) { zipCrashData = null; errorId = Guid.Empty; exploitResult = FuzzerError.EExplotationResult.Unknown; if (CreatedProcess == null || CreatedProcess.Length == 0) { return(false); } // Wait for exit var isBreak = false; foreach (var p in CreatedProcess) { try { p.WaitForExit(p.ExitTimeOut); } catch { } // Check store location for changes if (!isBreak && ItsChangedStoreLocation()) { isBreak = true; } } // Courtesy wait Thread.Sleep(250); // Search logs var fileAppend = new List <ZipEntryEx>(); if (_FileNames != null) { foreach (var f in _FileNames) { if (ZipHelper.TryReadFile(f, TimeSpan.FromSeconds(isBreak ? 5 : 2), out var entry)) { fileAppend.Add(new ZipEntryEx() { Entry = entry, OriginalPath = f }); } } } // If its alive kill them foreach (var p in CreatedProcess) { try { p.KillProcess(); } catch { } } // Compress to zip if (fileAppend.Count <= 0) { return(false); } // Check exploitability for (int x = 0, m = fileAppend.Count; x < m; x++) { var dump = fileAppend[x]; if (dump.OriginalPath.ToLowerInvariant().EndsWith(".dmp")) { var l = DumpAnalyzer.WinDbgAnalyzer.CheckMemoryDump(dump.OriginalPath, out errorId, out exploitResult); if (!string.IsNullOrEmpty(l)) { fileAppend.Add(new ZipEntryEx() { Entry = new ZipHelper.FileEntry($"exploitable-{exploitResult.ToString().ToLowerInvariant()}.log", Encoding.UTF8.GetBytes(l)) }); break; } } } // Compress information byte[] zip = null; if (ZipHelper.AppendOrCreateZip(ref zip, fileAppend.Select(u => u.Entry).ToArray()) > 0 && zip != null && zip.Length > 0) { zipCrashData = zip; } return(true); }
/// <summary> /// Constructor /// </summary> /// <param name="errorId">Error Id</param> /// <param name="zip">Zip</param> /// <param name="result">Result</param> public FuzzerException(Guid errorId, byte[] zip, FuzzerError.EExplotationResult result) { ErrorId = errorId; Result = result; Zip = zip; }