Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
 /// <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;
 }