none
SCANER MD5 PROBLEMA RRS feed

  • Pregunta

  • Hola  a todos  estoy desarrolando una aplicacion para scanear  cadenas MD5 com un antivirus  pero solo para usb , el problema es  que  tiene q escanear  un archivo con una  base de  datos de  miles y miles de codigo MD5, el tema q  al hacer el escaner   habre el archivo de  la base de datos de MD5 y se pone a comparar consume mucha ram 2gb  es muchisimo , quisiera saber si alguno conoce algun md5  o tra forma de que el escaneo no consuma tanta ram !!! no se si separando la base de datos o q , la verdad no se , GRACIAS A TODOS cualquier ayuda me sirve SALUDOS

    alejandro

    domingo, 29 de marzo de 2015 23:52

Todas las respuestas

  • Pues tiene que identificar qué es lo que consume tanta RAM.  Parece que usted cree (o sabe) que es por el tamaño del archivo.  Para que eso sea cierto, usted debe estar leyendo el archivo en su totalidad a RAM, tal vez en la forma de un List<string>, luego haciendo un foreach o un parallel foreach para recorrer la lista.

    Asumiendo que es porque lee el archivo completo a RAM, la solución es simple:  No lea el archivo completo en RAM.  En vez de eso lea, qué se yo, unas 1000 líneas, luego las procesa, luego lee las siguientes 1000 líneas, etc.


    Jose R. MCP
    Code Samples

    lunes, 30 de marzo de 2015 13:32
  • como dice Jose R. Primero identifica que es lo que consume esa cantidad de ram. Puede ser que el archivo que estes leyendo sea muy grande.

    ¿Que base de datos estas usando? tal vez estas cargando a la memoria todo lo qu esta en la base de datos, y como tu mismo dices, la base de datos es muy grande, tal vez cada vez que hace la comparacion llamas al procedimiento que calcula el hash MD5 (suena tonto pero puede pasar).

    una acotacion: los antivirus no trabajan de esa manera, por que con solo cambiar, quitar o poner un byte a un archivo su hash MD5 cambia y dejaria de reconocerlo. Los antivirus ponen firmas en los archivos maliciosos (identifican secuencias de bytes en los archivos maliciosos) y si encuentra un archivo con esas firmas te dice "hey encontre este archivo malicioso". Claro, ese no es el unico metodo que usan, pero si es el mas básico y es muy efectivo.

    lunes, 30 de marzo de 2015 18:35
  • hola dese ya grax por la repuesta, mira el tamño del archivos es de 176 mb cn mas de 500 mil lineas de md5 es un archivo de texto que abierto solo consume 300mb de ram , mi programa funciona de la siguiente maneara , saca el md5 del archivo, habre la base de datos de MD5 " archivo de texto" y empieza a comparar, y ahi dnd llega a consumir 2b de ram en el momento de la comparacion , hora on estoy en ksa  dspues usbo parte del codigo , yo no se si hay otra forma de guardar la base de datos de MD5 que no sea en un archivo de texto y que no sea tan pesada la comparacion , grax

    alejandro

    martes, 31 de marzo de 2015 15:13
  • Ok, entonces puede olvidarse completamente del archivo de texto.  Apenas consume un 15% de la RAM.  El "problema" grande está en otra parte.

    No hay forma sencilla de ubicar y resolver esto.  Deberá depurar ojalá con una aplicación profiler como la que provee Telerik para determinar qué objetos consumen la mayor RAM y partir de ahí.  Si la RAM se consume en objetos de terceros, deberá usted tratar de mantener dichos objetos al mínimo.

    Lo más que le puedo recomendar es verificar que en su código no hayan fugas.  En .Net, una fuga no dura para siempre, pero puede darse.  ¿Cuándo?  Cuando no usamos la sentencia using o no disponemos de los objetos tan pronto los desocupamos haciendo la llamada a Dispose() (de los objetos que implementan IDisposable).


    Jose R. MCP
    Code Samples

    martes, 31 de marzo de 2015 15:19
  • hola cm andas? como ahi arriba a jose le explicaba en que formato  tengo la base de datos de los MD5 y como funciona la comparacion, porque aunque el archivo q quiera escanear sea de 10 kb en el momento de la comparacion de MD5 sube a los 2gb de ram , el problema esta ahi en la comparacion y el tamaño de la base de datos , dspues subo parte del codigo para que vean mejor.

    el tema de lso antivirus se que funciona cn mas metodos de deteccion pero yo solo es incapas de crear algo asi por solo quiero implementar el escaneo de MD5 y otro metodo que uso tmbn para detectar ciertas inregularidades en el usb , y se que los antivirus tmbn usan escaneo de MD5 porq eh visto como cambiar el MD5 de un Virus por ejempl. y no lo detectaba despues como x ejemplo AVAST ,, grx por la ayuda cualquier ayuda me funciona 


    alejandro

    martes, 31 de marzo de 2015 15:20
  • mira otra cosa que ahora me acuerdo que lo cambie era que al iniciar el programa cargaba el archivos de la base de datos a la memoria y solo con cargarlo consumia los 2gb de ram a, ahora que me doy cuenta el problema no esata en el momento del escaeno de la comparacion del MD5 , grax

    alejandro

    martes, 31 de marzo de 2015 15:23
  • incluso eh probado con otros escaner de MD5 que encontre en internet para ver si era el problema de mi software y ocurre exactamente lo ,misno al cargar el archivo de MD5

    alejandro

    martes, 31 de marzo de 2015 15:34
  • Defina "cargar el archivo de base de datos a la memoria", y veremos si es posible mejorar el consumo de RAM del procedimiento.

    Jose R. MCP
    Code Samples

    martes, 31 de marzo de 2015 15:52
  • ahi te subo parte del codigo mira 

       

    Public Class Funciones

        Private _DataSetFirma As DataSet
        Private _BalonTip As New ToolTip
        Private _ErrorPro As New ErrorProvider
        Private Notyfi As New NotifyIcon
        Public mINI As New CIni
        Public URLDescarga As String

    DONDE CARGA LA BASE DE DATOS DE MD5

    #Region "Inicializa"

        Public Sub New()
            DataSetBloqueo = New DataSet
            DataSetFirma = New DataSet
            mINI = New CIni

    end regdion

     Public Sub LlenaDTXML()
     DataSetFirma.ReadXml("Firmas.xml")

    EL ESCANER MD5

        End SubPublic Overloads Function ObtenerMD5(ByVal fichero As String) As String
            Try
                Dim cadenaMD5 As String = ""
                Dim cadenaFichero As FileStream
                Dim bytesFichero As [Byte]()
                Dim MD5Crypto As New MD5CryptoServiceProvider
                cadenaFichero = File.Open(fichero, FileMode.Open, FileAccess.Read)
                bytesFichero = MD5Crypto.ComputeHash(cadenaFichero)
                cadenaFichero.Close()
                For Each datos As Byte In bytesFichero
                    If datos < 16 Then
                        cadenaMD5 &= "0" & datos.ToString("X")
                    Else
                        cadenaMD5 &= datos.ToString("X")
                    End If
                Next
                Return cadenaMD5
            Catch ex As System.Exception
                Return (ex.Message)
            End Try
        End Function

    DONDE LLAMA AL MD5 EN EL MOMENTO DE ESCANEAR

    Public Sub Analizar_Virus(ByVal vArchivo As FileInfo, ByVal vLV As ListView, ByVal IgnorarErr As Boolean)
            'busquedad de cadenas de archivos de mi antivirus
            Dim Rows() As DataRow = Nothing
            Dim EncontVir As Boolean = False
            Application.DoEvents()
            If Cancelar Then Exit Sub
            Try
                If vArchivo.FullName = "C:\SYSTEM VOLUME INFORMATION" Then Exit Sub
                Rows = Ftn.DataSetFirma.Tables(0).Select("Md5 = '" & Ftn.ObtenerMD5(vArchivo.FullName) & "'")
                If Rows.Length > 0 Then

    GRAX POR LA AYUDA 


    alejandro

    martes, 31 de marzo de 2015 16:12
  • Ok, no programo VB.net pero parece que "cargar el archivo de base de datos a la memoria" es cargar el archivo Firmas.xml a un DataSet.  ¿Estoy en lo cierto?  ¿Esta carga consume los 2GB que usted menciona?

    El DataSet es muy flexible pero es lento.  Casi nunca uso DataSet's o DataTable's por esta misma razón.  Para darle una alternativa, tendría que solicitarle un ejemplo del archivo XML y una cuenta estimada de la cantidad de registros que hay en él.


    Jose R. MCP
    Code Samples

    martes, 31 de marzo de 2015 16:26
  • claro uso dataSet, que necesitas el archivo xml ? o cuanas lineas tiene ? mi esat echo asi 

    Md5 = '"2143N32B4N65N6B5B6N3B45N4"  POR EL EJEMPLO  Y TIEENE UN TOTAL DE 750mil lineas

    PERO TAMBIEN PUEDO HACECO SIN EL Md5 "12321312312213b21b1" poniendo solo el codigo Md5 asi

    21321b4b23v4b3v4b3n43  asi en un TXT  en ves de cargar un XML y ocurre totamente lo mismo con el consum de la ram , creo q es como vs decis problema de la DataSet.. graciiaaass



    alejandro

    martes, 31 de marzo de 2015 17:05
  • Lo que ocupo es una muestra de cómo luce el XML.  Si tiene 10000000 de nodos, no los ocupo todos, ocupo unos dos o tres para ver "cómo lucen".  ¿Me expliqué bien?

    Jose R. MCP
    Code Samples

    martes, 31 de marzo de 2015 17:09
  • asi es solo una muestra 

    <?xml version="1.0" encoding="utf-8" ?>
    <Firmas>
      <Firma Nombre="Virus 1" Md5="53020D4FF91A2D348976D6A6820EC110" />
      <Firma Nombre="Virus 2" Md5="483FCF432217D71544246AA760D98CDC"/>
      <Firma Nombre="Virus 3" Md5="3018E99857F31A59E0777396AE634A8F"/>
      <Firma Nombre="Virus 4" Md5="DE58ABDCD78ABA2487F35AAE7143AC74"/>
      <Firma Nombre="Virus 5" Md5="0279739CA0AA2536172461B7462F2D50"/>
      <Firma Nombre="Virus 6" Md5="FD4A876E3DD9ECA2C73CBD6742971EAB"/>
      <Firma Nombre="Virus 7" Md5="319C226EC7ACB4B33B547AF2B3520757"/>
      <Firma Nombre="Virus 8" Md5="F9CDE6A4681F7A4C850A27C7F6C5BF67"/>
      <Firma Nombre="Virus 8" Md5="90BB9E8BF9C07910108329F47AD6E21A"/>
      <Firma Nombre="Virus 8" Md5="478751575C443D04433D3310F3A542FB"/>
      <Firma Nombre="Virus 8" Md5="18D73AAC013B484482582E5F3D773A7B"/>
      <Firma Nombre="Virus Prueba" Md5="DD2B04F3BEC1F9A7170A747CD0E86A96"/>
      <Firma Nombre="Virus Prueba2" Md5="F17375878F50A250AED63CD44E235004"/>
      <Revision Rev="1"/>
    </Firmas>


    alejandro

    martes, 31 de marzo de 2015 17:16
  • Ok, probemos con una clase simple y una lista.  Este código es C# pues no programo en VB.net, pero hay traductores en línea si necesita.

    Primero definimos la clase VirusDef con las propiedades Nombre y Md5:

        [XmlType("Firma")]
        public class VirusDef
        {
            [XmlAttribute]
            public string Nombre { get; set; }
            [XmlAttribute]
            public string Md5 { get; set; }
        }
    

    Luego podemos cargar el XML en una lista de este tipo de objeto fácilmente.  El método NewVirusSerializer() crea el serializador:

            private XmlSerializer NewVirusSerializer()
            {
                XmlAttributeOverrides overrides = new XmlAttributeOverrides();
                XmlAttributes atts = new XmlAttributes();
                atts.XmlRoot = new XmlRootAttribute("Firmas");
                overrides.Add(typeof(List<VirusDef>), atts);
                return new XmlSerializer(typeof(List<VirusDef>), overrides);
            }
    

    Ese serializador lo usamos en la función ReadVirusXml():

            private List<VirusDef> ReadVirusXml(string fileName)
            {
                List<VirusDef> viruses = null;
                using (StreamReader sr = new StreamReader(fileName, new UTF8Encoding(false)))
                {
                    XmlSerializer ser = NewVirusSerializer();
                    viruses = (List<VirusDef>)ser.Deserialize(sr);
                }
                return viruses;
            }
    

    Veo que usted tiene un DataSet en una propiedad llamada DataSetFirma donde carga el Xml.  Cree una propiedad llamada Firmas de tipo List<VirusDef> (en VB.net es List(Of VirusDef), creo) que eventualmente reemplazaría ese DataSet.  Ahora puede asignar el resultado de la función ReadVirusXml() la propiedad Firmas.  Compruebe el uso de RAM en este punto.  ¿Es menor?  ¿Cuánto menor?


    Jose R. MCP
    Code Samples

    martes, 31 de marzo de 2015 18:35
  • hola hay algo que estoy haciendo mal porque al iniciar el programa carga el archivo.xml  y el resultado del consumo de ram es igual   ahi pongo el codig

     

    Public Class Funciones
        Private _DataSetBloqueo As DataSet
        Private _DataSetFirma As  List(Of VirusDef)
        Private _BalonTip As New ToolTip
        Private _ErrorPro As New ErrorProvider
        Private Notyfi As New NotifyIcon
        Public mINI As New CIni
        Public URLDescarga As String

    Aca es dnd el programa al iniciar  abre el XML

    #Region "Inicializa"
        Public Sub New()
            DataSetBloqueo = New DataSet
            DataSetFirma = New DataSet
            mINI = New CIni
            LlenaDTXML()
            URLDescarga = "http://ofb1rw.bay.livefilestore.com/y1pkMl8jhk6dwkzPr-p8wyyBm2Wi99zKH8OkPgqLWL2wkNb_kLL0nQb5JH3urYmbSN0ZPVeM9ygqbGObIfjAzT4h73j0lrVMDxU/infoActu.ini?download&psid=1"
        End Sub
    #End Region
    #Region "Propiedades"
        Public Property DataSetBloqueo As DataSet
            Get
                Return _DataSetBloqueo
            End Get
            Set(ByVal value As DataSet)
                _DataSetBloqueo = value
            End Set
        End Property

    Public Property dataSetFirma As DataSet
            Get
                Return _DataSetFirma
            End Get
            Set(ByVal value As DataSet)
                _DataSetFirma = value
            End Set
        End Property


        Public Property BalonTip As ToolTip
            Get
                Return _BalonTip
            End Get
            Set(ByVal value As ToolTip)
                _BalonTip = value
            End Set
        End Property
        Public Property ErrorPro As ErrorProvider
            Get
                Return _ErrorPro
            End Get
            Set(ByVal value As ErrorProvider)
                _ErrorPro = value
            End Set
        End Property
    #End Region
        'Public Enum BloqPosibles
        '   AdminTareas = 1
        '   Registro = 2
        '   Ejecutar = 3
        '   OpcCarp = 4
        '   VerArchOcult = 5
        '   Restaurarsistema = 6
        '   Comand = 7
        '   AdminUsuarios = 8
        'End Enum
        Public Sub LlenaDTXML()

            DataSetBloqueo.ReadXml("Bloqueos.xml")
            DataSetFirma.ReadXml("firmas.xml")
        End Sub
        <XmlType("Firma")> _
        Public Class VirusDef
            <XmlAttribute> _
            Public Property Nombre() As String
                Get
                    Return m_Nombre
                End Get
                Set(value As String)
                    m_Nombre = value
                End Set
            End Property
            Private m_Nombre As String
            <XmlAttribute> _
            Public Property Md5() As String
                Get
                    Return m_Md5
                End Get
                Set(value As String)
                    m_Md5 = value
                End Set
            End Property
            Private m_Md5 As String
        End Class
        Private Function NewVirusSerializer() As XmlSerializer
            Dim [overrides] As New XmlAttributeOverrides()
            Dim atts As New XmlAttributes()
            atts.XmlRoot = New XmlRootAttribute("Firmas")
            [overrides].Add(GetType(List(Of VirusDef)), atts)
            Return New XmlSerializer(GetType(List(Of VirusDef)), [overrides])
        End Function
        Private Function ReadVirusXml(fileName As String) As List(Of VirusDef)
            Dim viruses As List(Of VirusDef) = Nothing
            Using sr As New StreamReader(fileName, New UTF8Encoding(False))
                Dim ser As XmlSerializer = NewVirusSerializer()
                viruses = DirectCast(ser.Deserialize(sr), List(Of VirusDef))
            End Using
            Return viruses
        End Function


    alejandro

    martes, 31 de marzo de 2015 21:10
  • el problema creo qesat en esat parte 

    #Region "Inicializa"
        Public Sub New()
            DataSetBloqueo = New DataSet
            DataSetFirma = New DataSet
            mINI = New CIni
            LlenaDTXML()

    dnd  llama el datasetfirma.readXml("firmas.xml2)

    igual lo que vi que el archiv solo abierto con un edito de texto consume 700 mb de ram 


    alejandro

    martes, 31 de marzo de 2015 21:15
  • Mira  acabo de hace otra  prueva pára descartar  errores  y  identificar  el problema , agarre cree un simple programa q carge el XML  y llega a consumir casi 800 mb , a lo que yo voy aunq  optimize el programa , el archivo  abierto solo consume  750 mb, ya  seria mucho , no si tenes alguna idea de como crear una base de datos mas liviana . gracias 

    alejandro

    martes, 31 de marzo de 2015 21:33
  • Publique uno de esos archivos completos en algún lugar como Dropbox o OneDrive donde yo pueda descargar una copia y probar.


    Jose R. MCP
    Code Samples

    miércoles, 1 de abril de 2015 13:30
  • hola no va hacer necesario ya que le problema es del archivo XML lo que hice es sacarle:

    <Firma Nombre="Virus 1" Md5="

    y el consumo de memoria bajo a 400 mb  del programa, aunq todavia sige siendo mucho,  lo que veo q  tngo q encntrar alguna forma de hacer una base de datos mas optimizada . 


    alejandro

    viernes, 3 de abril de 2015 3:12