示例#1
0
        private static int SearchBase64(DelegateObject input, byte[] dataArray, byte[] checksum)
        {
            int checksumOffset = -1;

            for (int i = input.StartSearch; i < dataArray.Length - 1;)
            {
                #region Compare
                if (input.IsWorkDone)
                {
                    break;
                }
                foreach (byte item in checksum)
                {
                    if (i >= dataArray.Length)
                    {
                        return(-1);
                    }
                    if (dataArray[i] == item)
                    {
                        checksumOffset = i;
                        i++;
                    }
                    else
                    {
                        checksumOffset = -1;
                        break;
                    }
                }

                if (input.IsWorkDone)
                {
                    return(checksumOffset);
                }
                if (checksumOffset == -1)
                {
                    Array.Reverse(checksum);
                    foreach (byte item in checksum)
                    {
                        if (i >= dataArray.Length)
                        {
                            return(-1);
                        }
                        if (dataArray[i] == item)
                        {
                            checksumOffset = i;
                            i++;
                        }
                        else
                        {
                            checksumOffset = -1;
                            break;
                        }
                    }
                }
                #endregion

                if (checksumOffset != -1)
                {
                    break;
                }
                #region Search Type to determing next index
                switch (input.SearchType)
                {
                case SearchTypeEnum.LazyGenerateLazySearch:
                    i += checksum.Length;
                    break;

                case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                    i += input.SkipSearchBytesBy;
                    break;

                case SearchTypeEnum.LazyGenerateNotLazySearch:
                    i += input.SkipSearchBytesBy;
                    break;

                case SearchTypeEnum.NotLazyGenerateLazySearch:
                    i += checksum.Length;
                    break;
                }
                #endregion
            }
            return(checksumOffset);
        }
示例#2
0
        private static SearchResult OnParallelSearchAndGenerateReverse(DelegateObject input)
        {
            SearchResult searchResult = new SearchResult
            {
                ChecksumFound           = -1,
                ChecksumGeneratedLength = -1,
                ChecksumGeneratedOffset = -1,
                Checksum = "UNKNOWN"
            };

            try
            {
                int increment = 1;
                switch (input.SearchType)
                {
                case SearchTypeEnum.LazyGenerateLazySearch:
                case SearchTypeEnum.LazyGenerateNotLazySearch:
                    increment = input.ChecksumLength;
                    break;

                case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                case SearchTypeEnum.NotLazyGenerateLazySearch:
                    increment = 1;
                    break;
                }

                List <int> indexesToSearch = new List <int>();
                for (int i = input.StartGeneratedChecksumFrom; i < input.StopSearchAt;)
                {
                    indexesToSearch.Add(i);
                    i += increment;
                }

                Parallel.ForEach(indexesToSearch, (checksumGenerationIndex, loopState) =>
                {
                    for (int eof = input.DataArrayReversed.Length; eof >= 0;)
                    {
                        if (input.IsWorkDone)
                        {
                            break;
                        }
                        byte[] checksum = Helper.GenerateChecksum(input.ChecksumType, checksumGenerationIndex,
                                                                  input.DataArrayReversed);

                        int thisChecksumGeneratedOffset = checksumGenerationIndex;
                        int thisChecksumGeneratedLength = eof;
                        string thisChecksum             = BitConverter.ToString(checksum).Replace("-", string.Empty);
                        int thisChecksumFound           = NormalSearch(input,
                                                                       input.PossibleChecksumsArrayReversed ?? input.DataArrayReversed, checksum);

                        if (thisChecksumFound != -1)
                        {
                            Console.WriteLine("---Checksum Reversed---");
                            Console.WriteLine(thisChecksumFound);
                            searchResult = new SearchResult
                            {
                                ChecksumFound           = thisChecksumFound,
                                ChecksumGeneratedLength = thisChecksumGeneratedLength,
                                ChecksumGeneratedOffset = thisChecksumGeneratedOffset,
                                Checksum = thisChecksum
                            };
                            loopState.Stop();
                            break;
                        }

                        switch (input.SearchType)
                        {
                        case SearchTypeEnum.LazyGenerateLazySearch:
                            eof -= input.ChecksumLength;
                            break;

                        case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                            eof -= 1;
                            break;

                        case SearchTypeEnum.LazyGenerateNotLazySearch:
                            eof -= input.ChecksumLength;
                            break;

                        case SearchTypeEnum.NotLazyGenerateLazySearch:
                            eof -= 1;
                            break;
                        }
                        if (!input.ExhaustiveSearch)
                        {
                            break;
                        }
                    }

                    if (searchResult.ChecksumFound != -1)
                    {
                        loopState.Stop();
                    }
                    if (input.IsWorkDone)
                    {
                        loopState.Stop();
                    }
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine("---OnSearchAndGenerateReverse---");
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.WriteLine("Done 1");
            }
            return(searchResult);
        }
示例#3
0
        private static SearchResult OnSearchAndGenerateBase64Reverse(DelegateObject input)
        {
            SearchResult searchResult = new SearchResult
            {
                ChecksumFound           = -1,
                ChecksumGeneratedLength = -1,
                ChecksumGeneratedOffset = -1,
                Checksum = "UNKNOWN"
            };

            try
            {
                for (int checksumGenerationIndex = 0; checksumGenerationIndex < input.DataArrayBase64Reversed.Length;)
                {
                    for (int eof = input.DataArrayBase64Reversed.Length; eof >= 0;)
                    {
                        //if (token.IsCancellationRequested) return -1;
                        if (input.IsWorkDone)
                        {
                            break;
                        }
                        byte[] checksum = Helper.GenerateChecksum(input.ChecksumType, checksumGenerationIndex, input.DataArrayBase64Reversed);
                        searchResult.ChecksumGeneratedOffset = checksumGenerationIndex;
                        searchResult.ChecksumGeneratedLength = eof;
                        searchResult.Checksum      = BitConverter.ToString(checksum).Replace("-", string.Empty);
                        searchResult.ChecksumFound = SearchBase64(input, input.PossibleChecksumsBase64ArrayReversed ?? input.DataArrayBase64Reversed, checksum);
                        if (searchResult.ChecksumFound != -1)
                        {
                            break;
                        }
                        switch (input.SearchType)
                        {
                        case SearchTypeEnum.LazyGenerateLazySearch:
                            eof -= input.ChecksumLength;
                            break;

                        case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                            eof -= 1;
                            break;

                        case SearchTypeEnum.LazyGenerateNotLazySearch:
                            eof -= input.ChecksumLength;
                            break;

                        case SearchTypeEnum.NotLazyGenerateLazySearch:
                            eof -= 1;
                            break;
                        }
                        if (!input.ExhaustiveSearch)
                        {
                            break;
                        }
                    }

                    if (searchResult.ChecksumFound != -1)
                    {
                        break;
                    }
                    switch (input.SearchType)
                    {
                    case SearchTypeEnum.LazyGenerateLazySearch:
                        checksumGenerationIndex += input.ChecksumLength;
                        break;

                    case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                        checksumGenerationIndex += 1;
                        break;

                    case SearchTypeEnum.LazyGenerateNotLazySearch:
                        checksumGenerationIndex += input.ChecksumLength;
                        break;

                    case SearchTypeEnum.NotLazyGenerateLazySearch:
                        checksumGenerationIndex += 1;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("---OnSearchAndGenerateBase64Reverse---");
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.WriteLine("Done 2");
            }
            return(searchResult);
        }
示例#4
0
        private static SearchResult OnSearchAndGenerate(DelegateObject input)
        {
            SearchResult searchResult = new SearchResult
            {
                ChecksumFound           = -1,
                ChecksumGeneratedLength = -1,
                ChecksumGeneratedOffset = -1,
                Checksum = "UNKNOWN"
            };

            try
            {
                for (int checksumGenerationIndex = input.StartGeneratedChecksumFrom; checksumGenerationIndex < input.StopSearchAt;)
                {
                    for (int eof = input.DataArray.Length; eof >= 0;)
                    {
                        if (input.IsWorkDone)
                        {
                            break;
                        }
                        byte[] checksum = Helper.GenerateChecksum(input.ChecksumType, checksumGenerationIndex, input.DataArray, eof);
                        searchResult.ChecksumGeneratedOffset = checksumGenerationIndex;
                        searchResult.ChecksumGeneratedLength = eof;
                        searchResult.Checksum      = BitConverter.ToString(checksum).Replace("-", string.Empty);
                        searchResult.ChecksumFound = NormalSearch(input, input.PossibleChecksumsArray ?? input.DataArray, checksum);

                        if (searchResult.ChecksumFound != -1)
                        {
                            break;
                        }
                        switch (input.SearchType)
                        {
                        case SearchTypeEnum.LazyGenerateLazySearch:
                            eof -= input.ChecksumLength;
                            break;

                        case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                            eof -= 1;
                            break;

                        case SearchTypeEnum.LazyGenerateNotLazySearch:
                            eof -= input.ChecksumLength;
                            break;

                        case SearchTypeEnum.NotLazyGenerateLazySearch:
                            eof -= 1;
                            break;
                        }
                        if (!input.ExhaustiveSearch)
                        {
                            break;
                        }
                    }
                    if (searchResult.ChecksumFound != -1)
                    {
                        break;
                    }
                    switch (input.SearchType)
                    {
                    case SearchTypeEnum.LazyGenerateLazySearch:
                        checksumGenerationIndex += input.ChecksumLength;
                        break;

                    case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                        checksumGenerationIndex += 1;
                        break;

                    case SearchTypeEnum.LazyGenerateNotLazySearch:
                        checksumGenerationIndex += input.ChecksumLength;
                        break;

                    case SearchTypeEnum.NotLazyGenerateLazySearch:
                        checksumGenerationIndex += 1;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                // ReSharper disable once LocalizableElement
                Console.WriteLine("---OnSearchAndGenerate---");
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.WriteLine("Done 2");
            }
            return(searchResult);
        }
示例#5
0
        public static void OnSearchForwardAndReverse(DelegateObject input)
        {
            Task <SearchResult>[] tasks = new Task <SearchResult> [2];
            if (input.UseTPL)
            {
                if (input.ConvertFromBase64String)
                {
                    //Assign work
                    tasks[0] = Task <SearchResult> .Factory.StartNew(() => OnSearchAndGenerateBase64(input));

                    tasks[1] = Task <SearchResult> .Factory.StartNew(() => OnSearchAndGenerateBase64Reverse(input));
                }
                else
                {
                    tasks[0] = Task <SearchResult> .Factory.StartNew(() => OnParallelSearchAndGenerate(input));

                    tasks[1] = Task <SearchResult> .Factory.StartNew(() => OnParallelSearchAndGenerateReverse(input));
                }
            }
            else
            {
                if (input.ConvertFromBase64String)
                {
                    //Assign work
                    tasks[0] = Task <SearchResult> .Factory.StartNew(() => OnSearchAndGenerateBase64(input));

                    tasks[1] = Task <SearchResult> .Factory.StartNew(() => OnSearchAndGenerateBase64Reverse(input));
                }
                else
                {
                    tasks[0] = Task <SearchResult> .Factory.StartNew(() => OnSearchAndGenerate(input));

                    tasks[1] = Task <SearchResult> .Factory.StartNew(() => OnSearchAndGenerateReverse(input));
                }
            }

            //Wait for the first to finish
            int index = Task.WaitAny(tasks);
            //Get result of the finished task
            SearchResult result = tasks[index].Result;

            //Validate Result
            if (result.ChecksumFound != -1)
            {
                input.ChecksumGenerationLength = result.ChecksumGeneratedLength;
                input.ChecksumGeneratedOffset  = result.ChecksumGeneratedOffset;
                input.Checksum      = result.Checksum;
                input.ChecksumFound = true;
            }
            else
            {
                switch (index)
                {
                case 0:
                    result = tasks[1].Result;
                    break;

                case 1:
                    result = tasks[0].Result;
                    break;
                }

                if (result.ChecksumFound != -1)
                {
                    input.ChecksumGenerationLength = result.ChecksumGeneratedLength;
                    input.ChecksumGeneratedOffset  = result.ChecksumGeneratedOffset;
                    input.Checksum      = result.Checksum;
                    input.ChecksumFound = true;
                }
                else
                {
                    input.ChecksumGenerationLength = result.ChecksumGeneratedLength;
                    input.ChecksumGeneratedOffset  = result.ChecksumGeneratedOffset;
                    input.Checksum      = result.Checksum;
                    input.ChecksumFound = false;
                }
            }
        }
示例#6
0
        public WorkerViewForm(DelegateObject input)
        {
            InitializeComponent();
            //=====================================================
            Text = "Worker Details - Worker Id: " + input.WorkerId;
            fileNameLabel.Text     = input.FileName;
            fileLocationLabel.Text = input.FileLocation;
            if (!string.IsNullOrEmpty(input.PossibleChecksumFileName))
            {
                possibleChecksumFileLabel.Text    = input.PossibleChecksumFileName;
                possibleChecksumFileLocation.Text = input.PossibleChecksumFileLocation;
            }
            if (input.ExhaustiveSearch)
            {
                exhausiveSearchLabel.Text = "Yes";
            }
            if (input.UseTPL)
            {
                taskParallelismLabel.Text = "Yes";
            }
            if (input.ConvertFromBase64String)
            {
                convertFromBase64StringLabel.Text = "Yes";
            }
            startFromPositionLabel.Text   = input.StartSearch.ToString();
            stopAtPositionLabel.Text      = input.StopSearchAt.ToString();
            startGenerationFromLabel.Text = input.StartGeneratedChecksumFrom.ToString();
            switch (input.SearchType)
            {
            case SearchTypeEnum.LazyGenerateLazySearch:
                lazyGenerateLabel.Text       = "Yes";
                lazySearchLabel.Text         = "Yes";
                enableByteSkippingLabel.Text = "Yes";
                if (input.Checksum != "")
                {
                    skipBytesLabel.Text = input.Checksum.Length.ToString();
                }
                break;

            case SearchTypeEnum.NotLazyGenerateNotLazySearch:
                skipBytesLabel.Text = "1";
                break;

            case SearchTypeEnum.LazyGenerateNotLazySearch:
                lazyGenerateLabel.Text       = "Yes";
                enableByteSkippingLabel.Text = "Yes";
                skipBytesLabel.Text          = input.SkipSearchBytesBy.ToString();
                break;

            case SearchTypeEnum.NotLazyGenerateLazySearch:
                lazySearchLabel.Text         = "Yes";
                enableByteSkippingLabel.Text = "Yes";
                if (input.Checksum != "")
                {
                    skipBytesLabel.Text = input.Checksum.Length.ToString();
                }
                break;
            }
            if (input.ChecksumFound)
            {
                checksumLabel.Text                = input.Checksum;
                checksumOffsetLabel.Text          = input.ChecksumGeneratedOffset.ToString();
                checksumGeneratedLengthLabel.Text = input.ChecksumGenerationLength.ToString();
            }
        }