none
ESCANER MD5 FILTRAR ARCHIVOS DE GRAN TAMAÑO RRS feed

  • Pregunta

  • hola a tdos aver si me pueden ayudar asi avanso un poco, estoy desarrollando un aplciacion tipo antivirus para usb , el problema mio es que el escaner cuando intenta esacaner un archivo  y que es muy grande  se tilda , por eso quisiera  ponerle algun filtro algo , que cuando es muy grande el archivo lo saltee y prosiga cn otro,  . ahi dejo el emplo del esacer MD5 , gracias a  todoos por la ayuda 

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

            ProgressBar1.Maximum = Conversions.ToString(ListBox1.Items.Count)
            total.Text = Conversions.ToString(ListBox1.Items.Count)

            If Not ProgressBar1.Value = ProgressBar1.Maximum Then
                Try

                    ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
                    TextBox1.Text = ListBox1.SelectedItem.ToString
                Catch ex As Exception
                End Try



                Try

                    Dim scanbox As New TextBox
                    Dim read As String = My.Computer.FileSystem.ReadAllText("viruslist.dat")
                    ProgressBar1.Increment(1)

                    detected.Text = Conversions.ToString(Quarantine.ListBox2.Items.Count)
                    files.Text = Conversions.ToString(ProgressBar1.Value)
                    scanbox.Text = read.ToString
                    Dim md5 As MD5CryptoServiceProvider = New MD5CryptoServiceProvider
                    Dim f As FileStream = New FileStream(ListBox1.SelectedItem, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
                    f = New FileStream(ListBox1.SelectedItem, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
                    md5.ComputeHash(f)
                    Dim hash As Byte() = md5.Hash
                    Dim buff As StringBuilder = New StringBuilder
                    Dim hashByte As Byte
                    For Each hashByte In hash
                        buff.Append(String.Format("{0:X2}", hashByte))
                    Next

                    If scanbox.Text.Contains(buff.ToString) Then

                        ProgressBar1.ForeColor = Color.Crimson
                        Quarantine.ListBox2.Items.Add(ListBox1.SelectedItem)
                    End If
                Catch ex As Exception
                End Try
            Else
                Timer1.Stop()

                Quarantine.Show()
                MsgBox("Finished Scanning")
                TabControl1.SelectTab(1)

                Label6.Text = ""
                Label4.Text = ""
                total.Text = ""
                detected.Text = ""
                files.Text = ""
                TextBox1.Clear()
                ProgressBar1.Value = 0
                Timer2.Start()
                If ListBox1.Items.Count = 0 Then
                    MsgBox("No Threats were detected", MsgBoxStyle.Information)
                    WriteToLog("No Threats were detected")

                End If
            End If
        End Sub


    alejandro

    lunes, 20 de abril de 2015 12:49

Respuestas

  • Veo varios detalles:

    1. Crear una casilla de texto "scanbox" para mantener una cadena de texto.  Innecesario.  Gasta RAM sin propósito.  Además crea uno nuevo cada vez que el timer se dispara, o sea un TextBox por cada archivo escaneado.
    2. Lee el archivo viruslist.dat cada vez que el timer se dispara.  Innecesario a menos que el archivo cambie constantemente durante la operación del programa.  Debería leerlo al inicio del proceso de escaneo y mantener el texto en una variable a nivel de formulario.
    3. detected.Text puede ser actualizado condicionalmente:  Sincronice el valor al inicio del escaneo (supongo que hay un botón de inicio o similar), luego únicamente actualice el valor si se ha encontrado un virus.
    4. Abre dos FileStream para el mismo archivo en la misma variable f.  Innecesario gasto de recursos.
    5. No parece cerrar los FileStream que abre así que el archivo queda en uso y gasta RAM.

    Fuera de esa lista, el problema en cuestión no parece obvio viendo el código que muestra.  Pienso que podría ser que el algoritmo de cálculo del hash tarda mucho para archivos muy grandes; realmente no es que el programa se tilde (yo entiendo por tildar a que el programa se cuelga, o sea, parece detenerse sin hacer nada).  Esto es muy factible.  Tengo alguna experiencia en el cálculo de hashes SHA-1 para verificación de descargas de MSDN Subscription y ciertamente no es inmediato cuando hablamos de cientos de MB o inclusive GB.  Depure usted el código y determine en qué línea se da el problema.

    Finalmente le recomiendo usar un hilo aparte para realizar el escaneo.  Esta construcción del timer no es ideal.


    Jose R. MCP
    Code Samples

    lunes, 20 de abril de 2015 14:54