Обработка длинных циклов и предотвращение «Приложение не отвечает» - PullRequest
0 голосов
/ 13 апреля 2019

Я выполняю проект грубой силы в качестве школьного задания, и мне нужно получить пользовательский ввод (пароль) с максимальной длиной 12 символов и взломать его.Каждый ввод длиной 4 символа или менее проходит безупречно.Однако, что-нибудь более длинное, и приложение зависает и по какой-то странной причине останавливает цикл, а также предотвращает любое дальнейшее взаимодействие с пользовательским интерфейсом.

Я подумал, что, возможно, добавлю метку в форму и каждый раз меняю ее текст.время запуска цикла взлома решит проблему.Но потом я понял, что, поскольку все работает через основную форму, это не решение.

Вот функция, которая взламывает ввод пользователя:

private void startbtn_Click(object sender, EventArgs e)
        {
            okay = true;
            charstring = "";
            vpasswort = "            " + passwordtb.Text.ToString();
            passwort = vpasswort.Substring(vpasswort.Length - 12);

            var time = new System.Diagnostics.Stopwatch();
            time.Start();

            do
            {
                int ende = letters.Length - 1;
                for(int hmi = 0; hmi <= ende; hmi++)
                {
                    //MessageBox.Show(charstring);
                    for (int zmi = 0; zmi <= ende; zmi++)
                    {
                        //MessageBox.Show(charstring);
                        for (int mi = 0; mi <= ende; mi++)
                        {
                            //MessageBox.Show(charstring);
                            for (int hm = 0; hm <= ende; hm++)
                            {
                                //MessageBox.Show(charstring);
                                for (int zm = 0; zm <= ende; zm++)
                                {
                                    //MessageBox.Show(charstring);
                                    for (int m = 0; m <= ende; m++)
                                    {
                                        //MessageBox.Show(charstring);
                                        for (int ht = 0; ht <= ende; ht++)
                                        {
                                            //MessageBox.Show(charstring);
                                            for (int zt = 0; zt <= ende; zt++)
                                            {
                                                //MessageBox.Show(charstring);
                                                for (int t = 0; t <= ende; t++)
                                                {
                                                    //MessageBox.Show(charstring);
                                                    for (int h = 0; h <= ende; h++)
                                                    {
                                                        //MessageBox.Show(charstring);
                                                        for (int z = 0; z <= ende; z++)
                                                        {
                                                            //MessageBox.Show(charstring);
                                                            for (int E = 0; E <= ende; E++)
                                                            {
                                                                charstring = letters[hmi] + letters[zmi] + letters[mi] + letters[hm] + letters[zm] + 
                                                                               letters[m] + letters[ht] + letters[zt] + letters[t] + letters[h] + letters[z] + 
                                                                               letters[E];
                                                                Console.WriteLine(charstring);
                                                                if(charstring == passwort)
                                                                {
                                                                    okay = false;
                                                                    time.Stop();
                                                                    goto pizza;
                                                                }
                                                                //MessageBox.Show(charstring);
                                                            }//E
                                                        }//z
                                                    }//h
                                                }//t
                                            }//zt
                                        }//ht
                                    }//m
                                }//zm
                            }//hm
                        }//mi
                    }//zmi
                }//hmi

            } while (okay == true);
        pizza:
            MessageBox.Show("Your password was hacked!");
            result.Text = charstring;
            stopwatch.Text = time.ElapsedMilliseconds.ToString() + " ms";
        }

        //tried to change something in the form but didn't work

        private void timer1_Tick(object sender, EventArgs e)
        {
            result.Text = charstring;
        }

И вот основныевопрос.Можно ли, скажем, приостановить цикл на одну или две миллисекунды, чтобы предотвратить зависание и / или сбой приложения?Я почти уверен, что есть способ, и он действительно прост, и что у меня просто есть эта проблема, потому что я новичок в C # и программировании в целом.

РЕДАКТИРОВАТЬ: Я думаю, что яЯ должен найти способ заставить весь процесс взлома идти в фоновом режиме.Но, опять же, понятия не имею, как xD

Заранее спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Вы можете сделать это:

private void button1_Click(object sender, EventArgs e)
{
    var worker = new BackgroundWorker();
    worker.DoWork += (_, __) =>
    {
        // do your hack here...
    };
    worker.RunWorkerCompleted += (_, __) =>
    {
        MessageBox.Show("Finito!");
    };
    worker.RunWorkerAsync();
}

или

private async void button1_Click(object sender, EventArgs e)
{
    await Task.Run(() =>
    {
         // do your hack here...
    });
    MessageBox.Show("Finito!");
}
0 голосов
/ 13 апреля 2019

Все это можно сделать, используя более контролируемое кодирование.Я не уверен, какой фреймворк вы используете.

см. Dispatchtimer , управляйте интервалом и затем используйте метод .stop (), если вызывается событие с правильным паролем или если диапазон полони переданная единица неверна (буквенно-цифровой вместо цифр)

Это лучше для шлюзов и все.

Пожалуйста, будьте осторожны, где этот инструмент используется.подчиняться правилам и нормам права и этики

...