OfficalCodexPH Ответов: 1

Что не так с моим кодом? Vb.net


привет всем я так запутался у меня есть этот код :

Dim LimitReached As Boolean = Me.InvokeIfRequired(Function() ProgressBar1.Value = ProgressBar1.Maximum)

'Keep looping until limit is reached.
While Not LimitReached

    'InvokeIfRequired() can take multiple lines.
    Me.InvokeIfRequired(
    Sub()
        ProgressBar1.Maximum = ListBox1.Items.Count.ToString() 'Calling ToString() is much better than Conversions.ToString().
        total.Text = ListBox1.Items.Count.ToString()
    End Sub) 'End of InvokeIfRequired().

    'Check if the limit is reached.
    LimitReached = Me.InvokeIfRequired(Function() ProgressBar1.Value = ProgressBar1.Maximum)

    If Not LimitReached Then

        Me.InvokeIfRequired(
        Sub()
            Try
                ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
                Label1.Text = ListBox1.SelectedItem.ToString
            Catch ex As Exception
            End Try
        End Sub)

        Try

            Me.InvokeIfRequired(
        Sub()
            ProgressBar1.Increment(1)
            detected.Text = Quarantine.ListBox2.Items.Count.ToString() 'Again, use .ToString(), not Conversions.ToString().
            Label5.Text = String.Format("{0:F2}%", ((ProgressBar1.Value / ProgressBar1.Maximum) * 100))
            files.Text = ProgressBar1.Value.ToString()
        End Sub)


            Dim SHA256 As New SHA256CryptoServiceProvider 'Shortened to "As New" instead of "As ... = New ..."

            'IMPORTANT: Wrap all streams in "Using .../End Using". This will ensure that the stream is closed and the file handle is released.
            Using f As New FileStream(ListBox1.SelectedItem, FileMode.Open, FileAccess.Read, FileShare.Read, 8192) 'Again, shortened to "As New".

                'REMOVED: You were setting "f = New FileStream..." two times. Not a good thing to do.
                SHA256.ComputeHash(f)
                Dim hash As Byte() = SHA256.Hash
                Dim buff As New StringBuilder '"As New".
                'This line is irrelevant: "Dim hashByte As Byte".
                For Each hashByte As Byte In hash
                    buff.Append(String.Format("{0:X2}", hashByte))
                Next


                Dim MyFilesList As String() = Directory.GetFiles(Application.StartupPath & "\Database\Sigs\Sha1\", "*.txt")
                Dim FoundedSearch As New List(Of String)()
                For Each filename As String In MyFilesList
                    Dim textFile As String = File.ReadAllText(filename)
                    If textFile.Contains(buff.ToString) Then
                        Me.InvokeIfRequired(Sub() f.Dispose())
                        Me.InvokeIfRequired(Sub() EncryptFile())
                        Me.InvokeIfRequired(Sub() Quarantine.ListBox2.Items.Add(ListBox1.SelectedItem()))
                        Me.InvokeIfRequired(Sub() WriteToLog("File Quarantined:" + ListBox1.SelectedItem))
                    End If
                Next

            End Using 'Close the FileStream.

        Catch ex As Exception
        End Try
    Else
        'REMOVED: "Timer1.Stop()" is no longer needed.

        Me.InvokeIfRequired(
        Sub()
            If CheckBox1.Checked = True Then
                System.Diagnostics.Process.Start("shutdown", "-s -t 00")
            Else
                ProgressBar1.Value = 0
                If ListBox1.Items.Count = 0 Then
                    If Form1.CheckBox1.Checked = True Then
                        full.CancelAsync()
                        quick.CancelAsync()
                        Critical.CancelAsync()
                        cust.CancelAsync()
                    End If
                Else
                    Form1.CheckBox1.Checked = False
                    Form1.CheckBox2.Checked = False
                    Form1.CheckBox3.Checked = False
                    Form1.CheckBox4.Checked = False
                    Quarantine.Label3.ForeColor = Color.DarkRed
                    Quarantine.Label2.ForeColor = Color.DarkRed
                    full.CancelAsync()
                    quick.CancelAsync()
                    Critical.CancelAsync()
                    cust.CancelAsync()

                End If
            End If
        End Sub) 'End of InvokeIfRequired().
    End If
    'Do some more background stuff...
End While


И
Dim SHA256 As New SHA256CryptoServiceProvider
был md5, и он работал и сканировал список хэшей md5, но теперь я хочу сделать sha256, и я использовал список хэшей sha256, и он не обнаруживает файл(файл-это тот же самый хэш, который я проверил с помощью virus total)

Что я уже пробовал:

как вы можете видеть выше, я попытался изменить его на sha256-единственное, что мне нужно изменить, но нет, не работает. :-(

1 Ответов

Рейтинг:
8

Dave Kreskowiak

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

Методы должны делать одну вещь, и делать эту одну вещь-это короткий объем кода. Вы должны пройти через тонну дерьма только для того, чтобы переключить алгоритм хэширования. Это плохо.

У вас должен быть метод, который просто принимает путь к файлу и возвращает массив байтов-результат хэширования. Таким образом, легко изменить алгоритм хэширования, и все это делается в одном месте.

Я сделал нечто подобное, но я написал класс, который обертывает путь к файлу и предоставляет пару методов, которые генерируют несколько хэшей для этого файла. Так уж получилось, что он генерирует как MD5, так и SHA1 хэш для файла. Что-то вроде этого (конечно, это C#. Я слишком ленив, чтобы преобразовать его в VB.NET):

public class FileHash
{
    public string Filepath { get; private set; }

    public string Filename
    {
        get
        {
            return Path.GetFileName(Filepath);
        }
    }

    public byte[] MD5Hash { get; private set; }

    public byte[] SHA1Hash { get; private set; }

    private FileHash()
    {
    }

    public FileHash(string filepath)
    {
        if (string.IsNullOrWhiteSpace(filepath))
        {
            throw new ArgumentNullException(nameof(filepath));
        }

        Filepath = filepath;
    }

    public void ComputeHashes()
    {
        using (MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider())
        {
            MD5Hash = GenerateHash(md5Provider, Filepath);
        }

        using (SHA1CryptoServiceProvider sha1Provider = new SHA1CryptoServiceProvider())
        {
            SHA1Hash = GenerateHash(sha1Provider, Filepath);
        }
    }

    private byte[] GenerateHash(HashAlgorithm cryptoProvider, string filepath)
    {
        // Check the input parameters to make sure we get
        // something useful.
        if (cryptoProvider == null)
        {
            throw new ArgumentNullException(nameof(cryptoProvider));
        }

        if (string.IsNullOrWhiteSpace(filepath) || !File.Exists(filepath))
        {
            throw new ArgumentNullException(nameof(filepath));
        }

        // We need something to hold the results we
        // get back from the alsogirthm.
        byte[] result;

        // Open the file and hash it using the provided
        // algorithm.
        using (FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            result = cryptoProvider.ComputeHash(stream);
        }

        // Return the result.
        return result;
    }
}

Это урезанная версия класса. Я удалил все асинхронные вещи для ясности.


OfficalCodexPH

твое здоровье приятель :-)

OfficalCodexPH

Чувак, я пробовал, но я действительно не уверен, как реализовать это в моем коде с помощью списка и т. д.?

Dave Kreskowiak

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

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

    Dim hash As New FileHash(filepath)    hash.ComputeHashes

Как только метод возвращается, вы получаете значения хэшей из двух свойств:
Скрыть   скопировать код
    whatever = hash.MD5Hash

Maciej Los

5ed!

OfficalCodexPH

не волнуйся Чувак я сам его написал и заставил работать