Trovare un array di bytes dentro un altro array di bytes?

di il
3 risposte

Trovare un array di bytes dentro un altro array di bytes?

Ciao a tutti ,
volevo provare a cercare meterpreter in ram (ovviamente), ovvero avendo l'array di bytes che costituisce meterpreter vorrei cercare nei processi per capire in quale processo si è iniettato (oppure no) ,in pratica si tratta di cercare un array di bytes dentro un altro array , avete qualche suggerimento per trovare un algoritmo efficiente? , avevo pensato di verificare l'eguaglianza cercando gli n caratteri di meterpreter dentro il singolo processo partendo dai primi n caratteri del processo e poi cercareo "spostandomi" di un byte per volta fino ad arrivare alla fine dei bytes del processo oppure quando trovo l'impronta cercata , temo però che sia un metodo un pò lento soprattutto nel caso di processi di decine o centinaia di MB , grazie per i vostri suggerimenti ,

3 Risposte

  • Re: Trovare un array di bytes dentro un altro array di bytes?

    Ma l'algoritmo dovrebbe estrarti i byte degli altri processi, o ti interessa solo la ricerca del pattern?

    Per la seconda, puoi trovare spunti in questo thread di SO.

    Ciao!
  • Re: Trovare un array di bytes dentro un altro array di bytes?

    Mi interessa la ricerca del pattern (cioè di meterpreter) ,
    grazie dello spunto ,
  • Re: Trovare un array di bytes dentro un altro array di bytes?

    Ciao, potresti cercare il primo byte utilizzando un'istruzione IndexOf sull'array di byte (che comunque è veloce), e se lo trovi, allora verifichi la corrispondenza dei rimanenti, così:

    public static void Main()
        {
            byte[] sequenza = { 1, 2, 3, 5 };
            byte[] contenitore = { 2, 6, 7, 1, 2, 3, 5, 9, 2, 1, 2, 3, 5 };
            
            int inizio = 0;
            int fine=contenitore.Length-sequenza.Length;
    
            while (inizio > -1 && inizio <= fine)
            {
                //cerca il primo byte della sequenza
                inizio = Array.IndexOf(contenitore, sequenza[0], inizio);
                if (inizio > -1 && inizio<=fine)
                {
                    //ha trovato il primo, allora confronta i rimanenti
                    if (Confronta(sequenza,contenitore,inizio))
                    {
                        Console.WriteLine("Sequenza trovata alla posizione: "+inizio.ToString());
                        break;
                    }                
                    inizio++;
                }
            }
        }
    
        public static bool Confronta(byte[] a, byte[] b, int trovato)
        {
            for (int i=1; i<a.Length; i++)
            {
                //confronta i byte dal secondo in poi
                if (a[i] != b[trovato+i])
                    return false;
            }        
            return true;
        }
        
Devi accedere o registrarti per scrivere nel forum
3 risposte