LA CAMPANA

C'è chi legge questa notizia prima di te.
Iscriviti per ricevere articoli freschi.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam

Molti potrebbero sentire parlare di file come rarjpeg "e. Questo è un tipo speciale di file, che è un'immagine jpeg e un archivio rar incollati insieme. È un contenitore eccellente per nascondere il fatto di trasferire informazioni. Puoi creare rarjpeg usando i seguenti comandi:

UNIX: cat image1.jpg archive.rar\u003e image2.jpg
FINESTRE: copia / b image1.jpg + archive.rar image2.jpg

O se hai un editor esadecimale.

Naturalmente, per nascondere il fatto del trasferimento di informazioni, è possibile utilizzare non solo il formato JPEG, ma anche molti altri. Ogni formato ha le sue caratteristiche, grazie alle quali può essere adatto o meno al ruolo del contenitore. Descriverò come è possibile trovare i file incollati nei formati più popolari o indicare il fatto dell'incollaggio.

I metodi per rilevare i file incollati possono essere divisi in tre gruppi:

  1. Metodo per controllare l'area dopo il marker EOF. Molti formati di file diffusi hanno il cosiddetto marker di fine file, che è responsabile della visualizzazione dei dati desiderati. Ad esempio, i visualizzatori di foto leggono tutti i byte fino a questo indicatore, tuttavia l'area dopo che rimane ignorata. Questo metodo è ideale per formati: JPEG, PNG, GIF, ZIP, RAR, PDF.
  2. Metodo per controllare le dimensioni del file. La struttura di alcuni formati (contenitori audio e video) consente di calcolare la dimensione effettiva del file e confrontarla con la dimensione originale. Formati: AVI, WAV, MP4, MOV.
  3. Metodo per il controllo dei file CFB. Formato binario CFB o Compound File: un formato di documento sviluppato da Microsoft, che è un contenitore con un proprio file system. Questo metodo si basa sul rilevamento di anomalie nel file.

C'è vita dopo la fine del file?

jpeg

Per trovare la risposta a questa domanda, è necessario approfondire le specifiche del formato, che è l '"antenato" dei file incollati e comprenderne la struttura. Qualsiasi JPEG inizia con una firma di 0xFF 0xD8.

Dopo questa firma sono le informazioni di servizio, facoltativamente l'icona dell'immagine e, infine, l'immagine compressa stessa. In questo formato, la fine dell'immagine è contrassegnata da una firma a doppio byte 0xFF 0xD9.

PNG

I primi otto byte del file PNG sono la seguente firma: 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A. La firma finale che termina il flusso di dati: 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82.

Rar

Firma comune per tutti gli archivi rar: 0x52 0x61 0x72 0x21 (Rar!). Successivamente vengono fornite informazioni sulla versione dell'archivio e altri dati correlati. È stato stabilito sperimentalmente che l'archivio termina con la firma 0x0A, 0x25, 0x25, 0x45, 0x4F, 0x46.

Tabella dei formati e delle loro firme:
L'algoritmo di controllo dell'incollaggio in questi formati è estremamente semplice:

  1. Trova la firma iniziale;
  2. Trova la firma definitiva;
  3. Se non ci sono dati dopo la firma finale, il file è pulito e non contiene allegati! Altrimenti, è necessario cercare altri formati dopo la firma finale.

GIF e PDF

Un documento PDF può avere più di un marcatore EOF, ad esempio, a causa della generazione errata del documento. Il numero di firme finali nel file GIF è uguale al numero di frame in esso. Sulla base delle funzionalità di questi formati, è possibile migliorare l'algoritmo per verificare la presenza di file incollati.
  1. Il punto 1 viene ripetuto dall'algoritmo precedente.
  2. Il punto 2 viene ripetuto dall'algoritmo precedente.
  3. Quando trovi la firma finale, ricorda la sua posizione e cerca ulteriormente;
  4. Se si raggiunge l'ultimo token EOF in questo modo, il file è pulito.
  5. Se il file non termina con la firma finale, goto è il luogo dell'ultima firma finale trovata.
La grande differenza tra la dimensione del file e la posizione dopo l'ultima firma finale indica la presenza di un allegato incollato. La differenza può essere superiore a dieci byte, sebbene sia possibile impostare altri valori.

cerniera lampo

La particolarità degli archivi ZIP è la presenza di tre diverse firme: La struttura dell'archivio è la seguente:
Intestazione file locale 1
Dati del file 1
Descrittore di dati 1
Intestazione file locale 2
Dati del file 2
Descrittore di dati 2
...
Intestazione file locale n
Dati file n
Descrittore di dati n
Intestazione di decrittazione dell'archivio
Archivia record di dati extra
Directory centrale
Più interessante è la directory centrale, che contiene metadati sui file nell'archivio. La directory centrale inizia sempre con la firma 0x50 0x4b 0x01 0x02 e termina con la firma 0x50 0x4b 0x05 0x06, seguita da 18 byte di metadati. È interessante notare che gli archivi vuoti sono costituiti solo da una firma finale e 18 byte zero. Dopo 18 byte, c'è un'area di commento dell'archivio, che è un contenitore ideale per nascondere un file.

Per controllare l'archivio ZIP, è necessario trovare la firma finale della directory centrale, saltare 18 byte e cercare firme di formati noti nell'area commenti. Le grandi dimensioni del commento indicano anche il fatto di incollare.

Le misure contano

avi

La struttura del file AVI è la seguente: ogni file inizia con una firma RIFF (0x52 0x49 0x46 0x46). Su 8 byte esiste una firma AVI che specifica il formato (0x41 0x56 0x49 0x20). Un blocco all'offset 4, composto da 4 byte, contiene la dimensione iniziale del blocco dati (ordine byte - little endian). Per scoprire il numero di blocco contenente la dimensione successiva, è necessario aggiungere la dimensione dell'intestazione (8 byte) e la dimensione ottenuta nel blocco 4-8 byte. Pertanto, viene calcolata l'intera dimensione del file. Si presume che la dimensione calcolata possa essere inferiore alla dimensione effettiva del file. Dopo la dimensione calcolata, il file conterrà solo zero byte (necessario per l'allineamento del bordo di 1 KB).

Esempio di calcolo delle dimensioni:


Wav

Come AVI, un file WAV inizia con una firma RIFF, tuttavia, questo file ha una firma di 8 byte - WAVE (0x57 0x41 0x56 0x45). La dimensione del file viene calcolata allo stesso modo dell'AVI. Le dimensioni effettive dovrebbero essere esattamente le stesse calcolate.

mp4

MP4 o MPEG-4 - un formato contenitore multimediale utilizzato per archiviare flussi video e audio, fornisce anche la memorizzazione di sottotitoli e immagini.
Con un offset di 4 byte, si trovano le firme: il tipo di file ftyp (66 74 79 70) (Tipo file contenitore QuickTime) e il sottotipo di file mmp4 (6D 6D 70 34). Per il riconoscimento file nascosti, siamo interessati alla possibilità di calcolare la dimensione del file.

Considera un esempio. La dimensione del primo blocco è a offset zero ed è 28 (00 00 00 1C, ordine byte Big Endian); indica anche l'offset in cui si trova la dimensione del secondo blocco di dati. Al 28 ° offset, troviamo la dimensione del blocco successiva pari a 8 (00 00 00 08). Per trovare la dimensione del blocco successiva, è necessario aggiungere le dimensioni dei blocchi precedenti trovati. Pertanto, viene calcolata la dimensione del file:

mov

Questo formato ampiamente utilizzato è anche un contenitore MPEG-4. MOV utilizza un algoritmo proprietario di compressione dei dati, ha una struttura simile a MP4 e viene utilizzato per gli stessi scopi: per archiviare dati audio e video, nonché materiali correlati.
Come MP4, qualsiasi file mov ha una firma ftyp a 4 byte a 4 offset, tuttavia la seguente firma ha un valore di qt__ (71 74 20 20). La regola per il calcolo della dimensione del file non è cambiata: a partire dall'inizio del file, calcola la dimensione del blocco successivo e aggiungilo.

Il metodo per verificare la presenza di file "incollati" in questo gruppo di formati consiste nel calcolare la dimensione in base alle regole sopra indicate e confrontarla con la dimensione del file verificato. Se la dimensione del file corrente è molto più piccola di quella calcolata, questo indica il fatto dell'incollaggio. Quando si controllano i file AVI, si presume che la dimensione calcolata possa essere inferiore alla dimensione del file a causa della presenza di zeri aggiunti per allineare il bordo. In questo caso, è necessario controllare gli zeri dopo la dimensione del file calcolata.

Verifica del formato binario del file composto

Questo formato di file, sviluppato da Microsoft, è anche noto come OLE (Object Linking and Embedding) o COM (Component Object Model). I file DOC, XLS, PPT appartengono al gruppo di formati CFB.

Un file CFB è costituito da un'intestazione da 512 byte e settori della stessa lunghezza che memorizzano flussi di dati o informazioni di servizio. Ogni settore ha il suo numero non negativo, l'eccezione sono i numeri speciali: “-1” - numera il settore libero, “-2” - numera il settore che chiude la catena. Tutte le catene di settori sono definite nella tabella FAT.

Supponiamo che un utente malintenzionato abbia modificato un determinato file doc e incollato un altro file alla fine. Ci sono alcuni diversi modi rilevarlo o indicare un'anomalia nel documento.

Dimensione del file anormale

Come accennato in precedenza, qualsiasi file CFB è costituito da un'intestazione e settori di uguale lunghezza. Per scoprire la dimensione di un settore, è necessario leggere un numero di due byte a 30 offset dall'inizio del file e aumentare 2 alla potenza di questo numero. Questo numero deve essere uguale a 9 (0x0009) o 12 (0x000C), rispettivamente, la dimensione del settore del file è 512 o 4096 byte. Dopo aver trovato il settore, è necessario verificare la seguente uguaglianza:

(FileSize - 512) mod SectorSize \u003d 0

Se questa uguaglianza non è soddisfatta, possiamo indicare il fatto di incollare i file. Tuttavia, questo metodo ha uno svantaggio significativo. Se l'autore dell'attacco conosce la dimensione del settore, deve solo incollare il suo file e altri n byte in modo che la dimensione dei dati incollati sia un multiplo della dimensione del settore.

Tipo di settore sconosciuto

Se un utente malintenzionato è a conoscenza di una soluzione alternativa per un controllo precedente, allora questo metodo può rilevare la presenza di settori con tipi non definiti.

Definisci l'uguaglianza:

FileSize \u003d 512 + CountReal * SectorSize, dove FileSize è la dimensione del file, SectorSize è la dimensione del settore, CountReal è il numero di settori.

Definiamo anche le seguenti variabili:

  1. CountFat: il numero di settori FAT. Si trova al 44 ° offset dall'inizio del file (4 byte);
  2. CountMiniFAT - il numero di settori MiniFAT. Si trova a 64 offset dall'inizio del file (4 byte);
  3. CountDIFAT: il numero di settori DIFAT. Si trova a 72 offset dall'inizio del file (4 byte);
  4. CountDE: il numero di settori di immissione directory. Per trovare questa variabile, è necessario trovare il primo settore DE, che si trova a 48 bias. Quindi è necessario ottenere una visione completa di DE dal FAT e calcolare il numero di settori DE;
  5. CountStreams: il numero di settori con flussi di dati;
  6. CountFree - il numero di settori liberi;
  7. CountClassified - il numero di settori con un tipo specifico;
CountClassified \u003d CountFAT + CountMiniFAT + CountDIFAT + CountDE + CountStreams + CountFree

Ovviamente, con la disuguaglianza di CountClassified e CountReal, possiamo concludere sul possibile incollaggio dei file.

Il codice funzione (FC) nell'intestazione del telegramma identifica il tipo di telegramma, come Telegramma richiesta (Richiesta o Invia / Richiesta) e Telegramma di conferma o Risposta (Riquadro di conferma, Riquadro di risposta). Inoltre, il codice funzione contiene l'effettiva funzione di trasmissione e le informazioni di controllo che impediscono la perdita e la duplicazione dei messaggi o il tipo di stazione con stato FDL.

7 6 5 4 3 2 1 0 FC: Richiesta codice funzione
1 Richiedi Telegramm
X FCV \u003d Bit alternato attivato
X href \u003d "http://profibus.felser.ch/en/funktionscode.htm#aufruffolgebit"\u003e FCB \u003d Bit alternato (dal conteggio dei frame)
1 0 (0x0) CV \u003d Clock Clock ()
1 altro Riservato
0 0 (0x0) TE \u003d Time Event (sincronizzazione dell'orologio)
0 3 (0x3) SDA_LOW \u003d Invia dati riconosciuti - bassa priorità
0 4 (0x4) SDN_LOW \u003d Invia dati non riconosciuti - priorità bassa
0 5 (0x5) SDA_HIGH \u003d Invia dati riconosciuti - priorità alta
0 6 (0x6) SDN_HIGH \u003d Invia dati non riconosciuti
0 7 (0x7) MSRD \u003d Invia dati richiesta con risposta multicast
0 9 (0x9) Richiedi lo stato FDL
0 12 (0xC) SRD basso \u003d Invia e richiedi dati
0 13 (0xP) SRD alto \u003d Invia e richiedi dati
0 14 (0xE) Richiedi Ident con risposta
0 15 (0xF) Richiedi lo stato LSAP con risposta 1)
0 altro Riservato

1) questo valore è nell'ultima versione dello standard non più definito ma riservato

7 6 5 4 3 2 1 0 FC: risposta codice funzione
0 Telegramma di risposta
0 Riservato
0 0 Schiavo
0 1 Master non pronto
1 0 Master pronto, senza token
1 1 Maestro pronto, in token ring
0 (0x0) Ok
1 (0x1) UE \u003d Errore utente
2 (0x2) RR \u003d Nessuna risorsa
3 (0x3) RS \u003d SAP non abilitato
8 (0x8) DL \u003d Data Low (caso normale con DP)
9 (0x9) NR \u003d Nessun dato di risposta pronto
10 (0xA) DH \u003d Data High (diagnosi DP in sospeso)
12 (0xC) RDL \u003d Dati non ricevuti e dati bassi
13 (0xP) RDH \u003d Dati non ricevuti e Dati alti
altro Riservato

Bit di conteggio dei frame Il bit di conteggio dei frame FCB (b5) impedisce la duplicazione dei messaggi da parte della stazione di riconoscimento o di risposta (risponditore) e qualsiasi perdita da parte della stazione di chiamata (iniziatore). Da ciò sono escluse le richieste senza riconoscimento (SDN) e le richieste Stato FDL, Ident e LSAP.

Per la sequenza di sicurezza, l'iniziatore deve portare un FCB per ciascun risponditore. Quando un telegramma di richiesta (Richiesta o Invia / Richiesta) viene inviato per la prima volta a un risponditore o se viene inviato nuovamente a un risponditore attualmente contrassegnato come non operativo, l'FCB deve essere impostato come definito nel risponditore. L'iniziatore ottiene questo in un telegramma di richiesta con FCV \u003d 0 e FCB \u003d 1. Il rispondente deve valutare un telegramma di questo tipo come primo ciclo di messaggi e memorizzare l'FCB \u003d 1 insieme all'indirizzo del promotore (SA) (vedere la tabella seguente). Questo ciclo di messaggi non verrà ripetuto dall'iniziatore. Nei successivi telegrammi di richiesta allo stesso risponditore, l'iniziatore deve impostare FCV \u003d 1 e cambiare l'FCB con ogni nuovo telegramma di richiesta. Ogni rispondente che riceve un telegramma di richiesta indirizzato ad esso con FCV \u003d 1 deve valutare l'FCB. Se l'FCB è cambiato rispetto all'ultimo telegramma di richiesta dallo stesso iniziatore (stesso SA), si tratta di una conferma valida che il precedente ciclo di messaggi è stato concluso correttamente. Se il telegramma di richiesta proviene da un iniziatore diverso (SA diverso), la valutazione dell'FCB non è più necessaria. In entrambi i casi, il soccorritore deve salvare l'FCB con la SA di origine fino alla ricezione di un nuovo telegramma indirizzato ad esso. Nel caso di un telegramma di conferma o risposta perso o alterato, l'FCB non deve essere modificato dall'iniziatore nel nuovo tentativo di richiesta: ciò indicherà che il precedente ciclo di messaggi era difettoso. Se il rispondente riceve un telegramma di richiesta con FCV \u003d 1 e lo stesso FCB dell'ultimo telegramma di richiesta dallo stesso iniziatore (stesso SA), questo indicherà un nuovo tentativo di richiesta. Il rispondente deve a sua volta ritrasmettere il telegramma di riconoscimento o di risposta tenuto pronto. Fino alla summenzionata conferma o ricezione di un telegramma con un indirizzo diverso (SA o DA) non riconosciuto (Invia dati senza riconoscimento, SDN), il rispondente deve tenere pronto l'ultimo telegramma di riconoscimento o risposta per qualsiasi possibile richiesta di ripetizione . Nel caso di Telegrammi di richiesta non riconosciuti e con Stato FDL richiesta, Ident e Stato LSAP, FCV \u003d 0 e FCB \u003d 0; la valutazione da parte del soccorritore non è più necessaria.

b5 b4 Posizione bit
FCB FCV Condizione Meaninging Azione
0 0 DA \u003d TS / 127 Richiesta senza conferma
Richiedi stato FDL / Ident / Stato LSAP
Elimina l'ultimo riconoscimento
0/1 0/1 DA # TS Richiesta a un altro soccorritore
1 0 DA \u003d TS Prima richiesta FCBM: \u003d 1
SAM: \u003d SA
Elimina l'ultimo riconoscimento / risposta
0/1 1 DA \u003d TS
SA \u003d SAM
FCB # FCBM
Nuova richiesta Elimina l'ultimo riconoscimento / risposta
FCBM: \u003d FCB
Tenere pronto il riconoscimento / risposta per riprovare
0/1 1 DA \u003d TS
SA \u003d SAM
FCB \u003d FCBM
Riprova richiesta FCBM: \u003d FCB
Ripeti il \u200b\u200briconoscimento / risposta e continua a essere pronto
0/1 1 DA \u003d TS
SA # SAM
Nuovo iniziatore FCBM: \u003d FCB
SAM: \u003d SA Hold riconoscimento / risposta pronto per il tentativo

FCBM ha archiviato FCB nella memoria SAM ha memorizzato SA nella memoria

Il concetto di " Numero magico»In programmazione ha tre significati:

  • Firma dei dati
  • Valori univoci evidenziati che non devono corrispondere ad altri valori (ad es. UUID)
  • Cattiva pratica di programmazione.

Firma dei dati

Numero magico, o firma, è un numero intero o una costante di testo utilizzata per identificare in modo univoco una risorsa o dati. Un tale numero di per sé non ha alcun senso e può causare stupore quando ci si incontra nel codice del programma senza il contesto o il commento appropriato, mentre si cerca di cambiarlo in un altro, anche se vicino al valore, può portare a conseguenze assolutamente imprevedibili. Per questo motivo, tali numeri erano ironicamente chiamati magia. Attualmente, questo nome è saldamente consolidato come termine. Ad esempio, qualsiasi classe Java compilata inizia con il numero magico esadecimale 0xCAFEBABE. Il secondo esempio ampiamente noto è qualsiasi eseguibile del sistema operativo. Microsoft Windows con l'estensione .exe inizia con una sequenza di byte 0x4D5A (che corrisponde ai caratteri ASCII di MZ - le iniziali di Mark Zbikowski, uno dei creatori di MS-DOS). Un esempio meno noto è il puntatore non inizializzato in Microsoft Visual C ++ (dal 2005 versione Microsoft Visual Studio), che in modalità debug ha l'indirizzo 0xDEADBEEF.

In stile unix sistemi operativi il tipo di file è solitamente determinato dalla firma del file, indipendentemente dall'estensione del suo nome. Per interpretare la firma del file, forniscono l'utilità di file standard.

Cattiva pratica di programmazione

Chiamato anche "numeri magici" è una cattiva pratica di programmazione quando si trova un valore numerico nel testo sorgente e non è ovvio che cosa significhi. Ad esempio, un tale frammento scritto in Java sarebbe cattivo:

drawSprite (53, 320, 240);

final int SCREEN_WIDTH \u003d 640; final int SCREEN_HEIGHT \u003d 480; final int SCREEN_X_CENTER \u003d SCREEN_WIDTH / 2; final int SCREEN_Y_CENTER \u003d SCREEN_HEIGHT / 2; final int SPRITE_CROSSHAIR \u003d 53; ... drawSprite (SPRITE_CROSSHAIR, SCREEN_X_CENTER, SCREEN_Y_CENTER);

Ora è chiaro: questa linea mostra uno sprite al centro dello schermo, il mirino della vista. Nella maggior parte dei linguaggi di programmazione, tutti i valori utilizzati per tali costanti verranno calcolati in fase di compilazione e sostituiti nel luogo di utilizzo dei valori. Pertanto, una tale modifica nel testo di origine non compromette le prestazioni del programma.

Inoltre, i numeri magici sono una potenziale fonte di errori del programma:

  • Se lo stesso numero magico viene utilizzato nel programma più di una volta (o può essere potenzialmente utilizzato), la sua modifica richiederà la modifica di ogni occorrenza (anziché la modifica del valore della costante denominata). Se non tutte le occorrenze vengono corrette, si verificherà almeno un errore.
  • In almeno una delle occorrenze, il numero magico può essere scritto in modo errato dall'inizio ed è abbastanza difficile da rilevare.
  • Il numero magico può dipendere da un parametro implicito o da un altro numero magico. Se queste dipendenze, non identificate in modo esplicito, non sono soddisfatte, si verificherà almeno un errore.
  • Quando si modificano le occorrenze di un numero magico, è possibile modificare erroneamente un altro numero magico, indipendente, ma con lo stesso valore numerico.

Numeri magici e multipiattaforma

A volte i numeri magici danneggiano il codice multipiattaforma. Il fatto è che nei sistemi operativi C, 32 e 64 bit garantiscono la dimensione dei tipi char, short e long long, mentre le dimensioni di int, long, size_t e ptrdiff_t possono variare (nelle prime due, a seconda delle preferenze degli sviluppatori del compilatore , negli ultimi due - a seconda della capacità del sistema di destinazione). Il codice vecchio o non qualificato può contenere "numeri magici" che indicano le dimensioni di un tipo: quando si passa a macchine con profondità di bit diverse, possono causare errori impercettibili.

Per esempio:

const size_t NUMBER_OF_ELEMENTS \u003d 10; lungo a [NUMBER_OF_ELEMENTS]; memset (a, 0, 10 * 4); // errato: implica che la lunghezza è di 4 byte, viene utilizzato il numero magico di elementi memset (a, 0, NUMBER_OF_ELEMENTS * 4); // sbagliato - implica che la lunghezza è di 4 byte memset (a, 0, NUMBER_OF_ELEMENTS * sizeof (long)); // non del tutto giusto - duplicazione del nome del tipo (se il tipo cambia, dovrai cambiare anche qui) memset (a, 0, NUMBER_OF_ELEMENTS * dimensioneof (a [0])); // corretto, ottimale per array dinamici di dimensioni diverse da zero memset (a, 0, sizeof (a)); // corretto, ottimale per array statici

Numeri che non sono magici

Non tutti i numeri devono essere trasferiti a costanti. Ad esempio, il codice per

La ricerca di file di tipo noto durante la scansione (o, come si dice spesso, la ricerca di file mediante firma) è una delle più efficaci utilizzate nell'utilità di ripristino dati R-Studio. L'uso della firma specificata consente di ripristinare file di un certo tipo nel caso in cui mancassero parzialmente o completamente informazioni (danneggiate) sulla struttura della directory e sui nomi dei file.

In genere, viene utilizzata una tabella delle partizioni del disco per determinare la posizione dei file. Se si confronta un disco con un libro, la tabella delle partizioni sarà simile al suo indice. Durante la scansione, R-Studio cerca i file di tipi noti nella tabella delle partizioni del disco per determinate firme specificate. Ciò è reso possibile dal fatto che quasi ogni tipo di file ha una firma o un modello di dati univoci. Le firme dei file si trovano in una posizione specifica all'inizio di un file e, in molti casi, anche alla fine di un file. Durante la scansione, R-Studio confronta i dati trovati con firme di file di tipo noto, che consente di identificarli e di ripristinarne i dati.

Utilizzando la tecnologia di scansione di file di tipo noto, R-Studio consente di recuperare i dati dai dischi che sono stati riformattati, nonché dalle tabelle delle partizioni che sono state sovrascritte. Inoltre, se una partizione del disco viene sovrascritta, danneggiata o eliminata, la scansione di file di tipo noto è l'unica possibile.

Ma quasi sempre e in tutto ci sono svantaggi e i file di tipi noti usati in R-Studio non fanno eccezione. Pertanto, durante la scansione di file di tipo noto, R-Studio consente di ripristinare solo file non frammentati, ma, come già accennato, nella maggior parte dei casi si tratta dell'ultimo dei metodi possibili.

La struttura di R-Studio include già le firme dei tipi di file più comuni (per un elenco completo dei tipi di file noti, consultare la sezione Guida in linea di R-Studio.)

Se necessario, l'utente può aggiungere nuovi tipi di file alla composizione di R-Studio. Ad esempio, se è necessario trovare file di qualsiasi tipo univoco o sviluppati dopo la data dell'ultima versione di R-Studio, è possibile aggiungere le proprie firme ai file di tipi noti. Successivamente, verrà considerato questo processo.

Tipi di file personalizzati
Le firme di file personalizzate di tipi di file noti sono archiviate in File XMLe specificato nella finestra di dialogo Impostazioni. L'aggiunta di una firma è composta da due parti:

  1. La definizione della firma del file si trova all'inizio del file e se è presente alla fine del file.
  2. Creare un file XML contenente una firma del file e altre informazioni sul tipo di file.

Tutto ciò può essere fatto usando R-Studio. Allo stesso tempo, non è necessario essere un esperto nel campo della compilazione (modifica) di documenti XML o nel campo della modifica esadecimale - in questo manuale (articolo), rivolto a un utente di livello base, tutte le fasi di questo processo saranno esaminate in dettaglio.

Esempio: aggiunta di una firma per un file MP4 (XDCam-EX Codec)
Prendere in considerazione l'aggiunta di una firma del file utilizzando il file .MP4 di esempio creato utilizzando Sony XDCAM-EX. Può essere utilizzato, ad esempio, in caso di danni alla scheda SD per i quali non si è ancora riusciti a salvare sul disco rigido del computer.

Fase uno: definizione di una firma file
Per determinare la firma del file, prendere in considerazione esempi di file dello stesso formato.

Consenti a questi quattro file video di Sony XDCAM-EX:
ZRV-3364_01.MP4
ZRV-3365_01.MP4
ZRV-3366_01.MP4
ZRV-3367_01.MP4

Per comodità, lascia che siano piccoli file. I file più grandi sono più difficili da visualizzare in esadecimali.

1. Apri i file in R-Studio. Per fare ciò, fare clic con il tasto destro su ciascun file e selezionare la voce Visualizza / Modifica nel menu contestuale.

2. Confronta i file. Cercheremo lo stesso modello, presente in tutti e quattro i file. Lui sarà firma del file. In genere, le firme dei file sono all'inizio di un file, ma a volte alla fine.

3. Definire la firma del file all'inizio del file. Nel nostro esempio, è all'inizio del file. Si noti che ciò non sempre accade: spesso la firma del file si trova all'inizio del file, ma non alla prima riga (offset).

Dalle immagini sottostanti segue che i contenuti di tutti e quattro i file sono diversi, ma iniziano tutti con la stessa firma del file.


Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla

L'area selezionata sulle immagini è la firma del file di questo tipo di file. È presentato sia in testo che in forma esadecimale.

In forma di testo, la firma del file è la seguente:
.... ftypmp42 .... mp42 ........ gratuito

Punti (“.”) Indicano simboli che non possono essere rappresentati in forma di testo. Pertanto, è necessario fornire anche la forma esadecimale della firma del file:
00 00 00 18 66 74 79 6D 70 34 32 00 00 00 00 6D 70 34 32 00 00 00 00 00 00 00 00 00 08 66 72 65 65

4. Allo stesso modo definiamo una firma del file, ma alla fine del file. Potrebbe essere una firma di file diversa, una lunghezza diversa.

Nelle immagini seguenti, la firma del file è evidenziata alla fine del file:


Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla

Si noti che i dati davanti all'area selezionata (firma del file) in tutti e quattro i file sono gli stessi. Si tratta di informazioni tecniche, che non sono una firma di file, ma suggeriscono che tutte e quattro le immagini (file) sono state scattate utilizzando una fotocamera con gli stessi parametri. Di solito è possibile distinguere i motivi corrispondenti con le informazioni tecniche dalla firma di un file. Nel nostro esempio, nell'ultima riga prima dell'inizio della firma del file, vediamo il testo "RecordingMode type \u003d" normal "", che indica chiaramente che si tratta di una sorta di parametro del file, non di una firma. Prestare sempre particolare attenzione a questa riga in modo da non includere erroneamente informazioni tecniche nella firma del file.

Nel nostro caso, la firma del file è il seguente testo:
...
Ricordiamo che i punti indicano simboli che non possono essere rappresentati in forma di testo.

In forma esadecimale, la firma del file è la seguente:
3N 2F 4E 6F 6E 52 65 61 6N 54 69 6A 65 4A 65 74 61 3E 0D 0A 00
Nota: la firma non sarà sempre alla fine del file.

Secondo passaggio: creazione di un file XML che descrive un tipo di file famoso
Ora, dopo aver determinato la firma del file, è possibile creare un file XML e includere il tipo di file corrispondente in R-Studio. Esistono due modi per farlo:

2.1 Utilizzo dell'editor grafico delle firme dei file incorporato:
Seleziona la voce Impostazioni nel menu Strumenti, nella finestra di dialogo Impostazioni che si apre, fai clic sulla scheda Tipi di file noti e quindi fai clic sul pulsante Modifica tipi di file dell'utente.

Clicca sull'immagine per ingrandirla

Fare clic sul pulsante Crea tipo di file nella finestra di dialogo Modifica tipi di file dell'utente.
Imposta le seguenti opzioni:

  • Id è un identificatore digitale univoco. Questo numero verrà scelto a caso; l'unica cosa è che non dovrebbe coincidere con l'identificatore digitale di nessun altro tipo di file.
  • Descrizione del gruppo: il gruppo in cui si troveranno i file trovati in R-Studio. Puoi impostare uno dei due nuovo gruppoo scegli uno di quelli già esistenti. Avremo questo gruppo "Multimedia Video (Multimedia: Video)".
  • Descrizione: una breve descrizione del tipo di file. Nel nostro esempio, è possibile utilizzare, ad esempio, "Videocamera Sony, XDCam-EX".
  • Estensione: estensione di questo tipo. Nel nostro caso, mp4.

Il parametro Properties è facoltativo; nel nostro caso, non è necessario utilizzarlo.

Clicca sull'immagine per ingrandirla

Successivamente, è necessario inserire la firma del file iniziale e finale. Per fare ciò, selezionare Inizia e quindi dal menu contestuale, fare clic su Aggiungi firma.

Clicca sull'immagine per ingrandirla

Quindi fare doppio clic sul campo<пустая сигнатура> () e inserire il testo appropriato.

Clicca sull'immagine per ingrandirla

Quindi creare la firma del file finale. Ricorda di inserire 21 nel campo della colonna Da.

Clicca sull'immagine per ingrandirla

Hai creato correttamente la firma del tuo file di un tipo noto.

Ora devi salvarlo. Esistono due modi: è possibile salvarlo nel file predefinito specificato nella scheda Principale della finestra di dialogo Impostazioni facendo clic sul pulsante Salva. Oppure fai clic sul pulsante Salva con nome ... (Salva con nome ...) e salva la firma in qualche altro file.

2.2. Creazione di un file XML che descrive manualmente il tipo di file noto:
Per la creazione questa vita Useremo la versione XML 1.0 e la codifica UTF-8. Non disperare se non sai di cosa si tratta - apri qualsiasi editor di testo (ad esempio Notepad.exe) e inserisci il seguente testo nella prima riga:

Successivamente creeremo un tag XML che definisce il tipo di file (FileType). Dati gli attributi XML descritti in precedenza, il tag sarà simile al seguente:

Inseriscilo subito dopo

Quindi, definire la firma del file (tag ) La firma iniziale (all'inizio del file) sarà all'interno del tag senza alcun attributo. Usiamo il tipo di testo della firma, ma allo stesso tempo sostituiamo i caratteri esadecimali che non possono essere rappresentati in forma di testo. Prima di ogni carattere esadecimale, inserisci "\\ x" Pertanto, il tag con una firma del file sarà simile al seguente:

Se disponibile, è necessario anche definire la firma finale (alla fine del file). Lo stesso tag viene utilizzato per questo, ma con l'elemento "from" e l'attributo "end". Sarà simile a questo:

Ricordiamo che non c'erano caratteri non testuali nella firma del file finale, ma c'erano barre e parentesi triangolari. Per evitare confusione ed errori nella sintassi XML, sostituiremo i caratteri "/", "nella firma<" и ">"i loro valori esadecimali.

Alla fine, dopo le firme dei file, devono essere presenti i tag di chiusura FileType e FileTypeList:

Quindi l'intero file dovrebbe apparire così:


\\ x00 \\ x00 \\ x00 \\ x18ftypmp42 \\ x00 \\ x00 \\ x00 \\ x00mp42 \\ x00 \\ x00 \\ x00 \\ x00 \\ x00 \\ x00 \\ x00 \\ x08free
\\ x3C \\ x2FNonRealTimeMeta \\ x3E \\ x0D \\ x0A \\ x00

Ricorda: la sintassi XML fa distinzione tra maiuscole e minuscole, quindi il tag sarà valido , ma no .

Salvare il file in formato testo con l'estensione .xml. Ad esempio: SonyCam.xml.

Abbiamo creato con successo la nostra firma di file di tipo noto. Questo esempio abbastanza sufficiente per comprendere i principi di base della creazione di un tipo di file personalizzato. Gli utenti più esperti possono utilizzare XML versione 2.0. Puoi leggere ulteriori informazioni al riguardo nella sezione Guida in linea di R-Studio.

Passaggio 3: verificare e aggiungere un file descrivendo un tipo di file noto
Il prossimo passo è aggiungere (caricare) il tuo file XML a R-Studio. In questo caso, verrà controllato automaticamente.

Carichiamo in R-Studio il file XML creato nel passaggio precedente. Per fare ciò, seleziona la voce Impostazioni nel menu Strumenti. Nell'area Tipi di file dell'utente della scheda Principale della finestra di dialogo Impostazioni, aggiungi il file XML che abbiamo creato (SonyCam.xml). Fai clic sul pulsante Applica.

Clicca sull'immagine per ingrandirla

2. Rispondi Sì alla richiesta di scaricare un nuovo tipo di file.

Clicca sull'immagine per ingrandirla

3. Per verificare che il tipo di file sia stato caricato correttamente, fare clic sulla scheda Tipi di file noti della finestra di dialogo Impostazioni. Ricordiamo che abbiamo aggiunto il tipo di file al gruppo Multimedia Video. Avendo aperto questo gruppo (cartella), dovremmo vedere un elemento con la descrizione che impostiamo durante la creazione del file XML: Sony cam video, XDCam-EX (.mp4).

Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla

Se ci sono errori nella sintassi del file, verrà visualizzato il messaggio corrispondente:

Clicca sull'immagine per ingrandirla

In questo caso, controlla di nuovo che il tuo file XML non presenti errori. Ricorda: la sintassi XML fa distinzione tra maiuscole e minuscole e deve esserci un tag end per ogni tag alla fine.

Passaggio 4: test del file Descrivere il tipo di file noto
Per verificare la correttezza del tipo di file personalizzato che abbiamo creato, proveremo a trovare i nostri file .mp4 su un'unità flash USB rimovibile.

1. Sotto SO Windows Vista o Windows 7, eseguiremo la formattazione del disco completa (non veloce) o utilizzeremo l'utilità di pulizia dello spazio su disco (ad esempio, R-Wipe & Clean) per rimozione completa tutti i dati disponibili sul disco. Lascia che l'unità USB sia formattata in FAT32 (la dimensione dei file desiderati non supera i 2 GB).

2. Copiare i file di prova sul disco e riavviare il computer in modo che i contenuti della memoria cache vengano salvati sul disco. È inoltre possibile scollegare l'unità esterna e ricollegarla.

3. Nel sistema operativo, l'unità verrà definita come, ad esempio, l'unità logica F: \\.

4. Avviare R-Studio. Seleziona il nostro disco (F: \\) e fai clic sul pulsante Scansione.

Clicca sull'immagine per ingrandirla

5. Nella finestra di dialogo Scansione, nell'area (File system), fare clic sul pulsante Cambia ... e deselezionare tutte le caselle di controllo. Pertanto, disabiliteremo la ricerca di file system e file utilizzando la tabella delle partizioni.
Clicca sull'immagine per ingrandirla

6. Selezionare la casella di controllo Ricerca extra per tipi di file noti. Ciò consentirà a R-Studio di cercare file di tipo noto durante la scansione.

7. Per iniziare la scansione, fare clic sul pulsante Scansione.

8. Aspettiamo che R-Studio esegua la scansione del disco. La scheda Informazioni sulla scansione mostrerà l'avanzamento della scansione (avanzamento).


Clicca sull'immagine per ingrandirla

9. Al termine della scansione, selezionare l'elemento File trovati extra e fare doppio clic su di esso.


Clicca sull'immagine per ingrandirla

10. I nostri file di test si trovano nella cartella video cam Sony, nella cartella XDCam-EX (o in una cartella con un nome diverso corrispondente alla descrizione del tipo di file specificato nel Secondo Stadio).


Clicca sull'immagine per ingrandirla

Puoi vedere che i nomi dei file, le date e la posizione (cartelle) non sono stati ripristinati, poiché queste informazioni sono memorizzate nel file system. Pertanto, in R-Studio automaticamente, ogni file verrà visualizzato con un nuovo nome.

Tuttavia, si può vedere che il contenuto dei file non è danneggiato. Per verificarlo, aprili nel programma appropriato, ad esempio VLC media player.


Clicca sull'immagine per ingrandirla

Conclusione
La capacità di R-Studio di cercare file di tipo noto durante la scansione consente di recuperare i dati anche da un disco i cui file system vengono sovrascritti o sovrascritti. Puoi cercare abbastanza efficacemente i file usando le loro firme, il che è particolarmente utile se sai esattamente quale tipo di file recuperare, come, ad esempio, nel nostro esempio. La possibilità di creare tipi di file personalizzati consente di aggiungere qualsiasi file con una firma di file specifica all'elenco di tipi di file noti.

Le autorità mi hanno assegnato un compito piuttosto interessante. In breve tempo, scrivere un analizzatore di file eseguibile in grado di rilevare corpi di virus mediante firme e determinare quale packer / cryptor utilizzare. Il prototipo finito è apparso in un paio d'ore.

Parola dell'autore

Analisi della firma

La ricerca di un oggetto dannoso tramite firma è ciò che può fare qualsiasi antivirus. Nel caso generale, una firma è una descrizione formalizzata di alcuni segni con cui si può determinare che il file scansionato è un virus e che il virus è ben definito.

Esistono varie tecniche. In alternativa, utilizzare una firma composta da N byte dell'oggetto dannoso. In questo caso, è possibile non fare un confronto stupido, ma un confronto con una maschera (come cercare byte EB ?? ?? CD 13). Oppure imposta condizioni aggiuntive come "tali e tali byte dovrebbero trovarsi nel punto di ingresso del programma" e così via. La firma dei Malvari è particolare.

Allo stesso modo, vengono descritte alcune funzionalità in base alle quali si può determinare che il file eseguibile è compresso da uno o l'altro criptatore o packer (ad esempio, banale ASPack). Se leggi attentamente la nostra rivista, allora hai sicuramente sentito parlare di uno strumento come PEiD, che è in grado di determinare i packer, i criptatori e i compilatori più comunemente usati (c'è un gran numero di firme nel database) per il file PE trasferito su di esso. Purtroppo, le nuove versioni del programma non sono state rilasciate per molto tempo e recentemente sul sito ufficiale è apparso un messaggio che il progetto non avrà ulteriori sviluppi. È un peccato, perché le capacità di PEiD (soprattutto considerando il sistema di plug-in) potrebbero rivelarsi utili per me. Dopo una breve analisi, è diventato chiaro che questa non era un'opzione. Ma frugando nei blog in lingua inglese, ho rapidamente trovato quello che mi andava bene. Progetto YARA (code.google.com/p/yara-project).

Che cos'è YARA?

Fin dall'inizio, ero convinto che da qualche parte sul Web c'erano già degli sviluppi aperti che avrebbero assunto il compito di determinare la corrispondenza tra una certa firma e il file in studio. Se potessi trovare un tale progetto, allora potrebbe facilmente essere messo sui binari di un'applicazione Web, aggiungere lì diverse firme e ottenere ciò che mi era richiesto. Il piano ha iniziato a sembrare ancora più reale quando ho letto la descrizione del progetto YARA.

Gli stessi sviluppatori lo posizionano come uno strumento per aiutare i ricercatori di malware nell'identificazione e nella classificazione di campioni dannosi. Il ricercatore può creare descrizioni per vari tipi di malware usando modelli di testo o binari che descrivono i segni formalizzati di malvari. In questo modo si ottengono le firme. In effetti, ogni descrizione è costituita da un insieme di linee e da un'espressione logica, sulla base della quale viene determinata la logica di risposta dell'analizzatore.

Se le condizioni di una delle regole sono soddisfatte per il file in esame, viene determinato di conseguenza (ad esempio, tale e tale worm). Un semplice esempio di una regola per capire cosa è in gioco:

regola silent_banker: banchiere
{
meta:
description \u003d "Questo è solo un esempio"
thread_level \u003d 3
in_the_wild \u003d true
stringhe:
$ a \u003d (6A 40 68 00 30 00 00 6A 14 8D 91)
$ b \u003d (8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9)
$ c \u003d "UVODFRYSIHLNWPEJXQZAKCBGMT"
condizione:
$ a o $ b o $ c
}

In questa regola, diciamo a YARA che qualsiasi file che contiene almeno una delle stringhe di esempio descritte nelle variabili $ a, $ b, $ c deve essere classificato come Trojan silent_banker. E questa è una regola molto semplice. In effetti, le regole possono essere molto più complicate (ne parleremo di seguito).
Anche l'elenco dei progetti che lo utilizzano parla dell'autorità del progetto YARA, e questo:

  • VirusTotal Malware Intelligence Services (vt-mis.com);
  • jsunpack-n (jsunpack.jeek.org);
  • Guardiamo il tuo sito Web (wewatchyourwebsite.com).

Tutto il codice è scritto in Python e all'utente viene offerto sia il modulo stesso per l'uso nel suo sviluppo, sia solo un file eseguibile per utilizzare YARA come applicazione autonoma. Come parte del mio lavoro, ho scelto la prima opzione, ma per semplicità nell'articolo useremo l'analizzatore semplicemente come un'applicazione console.

Dopo aver scavato un po ', ho rapidamente capito come scrivere le regole per YARA, e anche come rovinare le firme dei virus dagli avers e dai packer gratuiti di PEiD. Ma inizieremo con l'installazione.

Installazione

Come ho detto, il progetto è scritto in Python, quindi può essere facilmente installato su Linux, Windows e Mac. All'inizio, puoi semplicemente prendere il binario. Se chiami l'applicazione nella console, otteniamo le regole per l'avvio.

$ yara
utilizzo: yara ... ... FILE | PID

Cioè, il formato per chiamare il programma è il seguente: prima viene il nome del programma, quindi un elenco di opzioni, dopo di che viene indicato il file con le regole, e alla fine - il nome del file in esame (o la directory contenente i file) o l'identificatore del processo. Ora vorrei spiegare bene come vengono elaborate queste stesse regole, ma non voglio caricarti immediatamente con una teoria secca. Pertanto, agiremo diversamente e prenderemo in prestito le firme di altre persone in modo che YARA possa svolgere uno dei nostri compiti: una definizione completa di virus mediante firme.

Proprio antivirus

La domanda più importante: dove ottenere il database delle firme dei virus noti? Le aziende antivirus condividono attivamente tali database (alcuni più generosamente, altri meno). Ad essere sincero, all'inizio dubitavo persino che da qualche parte sul web qualcuno diffondesse apertamente simili cose. Ma, come si è scoperto, ci sono persone gentili. Un database adatto dal popolare antivirus ClamAV è disponibile per tutti (clamav.net/lang/en). Nella sezione "Ultima versione stabile" è possibile trovare un collegamento all'ultima versione del prodotto antivirus, nonché collegamenti per scaricare i database dei virus ClamAV. Saremo interessati principalmente ai file main.cvd (db.local.clamav.net/main.cvd) e daily.cvd (db.local.clamav.net/daily.cvd).

Il primo contiene il database delle firme principale, il secondo - il database più completo al momento con varie aggiunte. A tal fine, daily.cvd è sufficiente, in cui vengono raccolti più di 100.000 cast di Malvari. Tuttavia, il database ClamAV non è un database YARA, quindi è necessario convertirlo nel formato desiderato. Ma come? Dopotutto, non sappiamo ancora nulla sul formato ClamAV, né sul formato Yara. Abbiamo già risolto questo problema preparando un piccolo script che converte il database delle firme dei virus ClamAV nel set di regole YARA. Lo script si chiama clamav_to_ yara.py ed è scritto da Matthew Richard (bit.ly/ij5HVs). Scarica lo script e converti i database:

$ python clamav_to_yara.py -f daily.cvd -o clamav.yara

Di conseguenza, nel file clamav.yara otteniamo un database di firme che sarà immediatamente pronto per l'uso. Proviamo una combinazione di base YARA e ClamAV in azione. La scansione di una cartella utilizzando una firma viene eseguita da un singolo comando:

$ yara -r clamav.yara / pentest / msf3 / data

L'opzione -r indica che la scansione deve essere eseguita in modo ricorsivo su tutte le sottocartelle della cartella corrente. Se nella cartella / pentest / msf3 / data erano presenti corpi virali (almeno quelli presenti nel database ClamAV), YARA lo segnalerà immediatamente. In linea di principio, questo è uno scanner per firme già pronto. Per maggiore comodità, ho scritto un semplice script che controllava gli aggiornamenti del database ClamAV, caricava nuove firme e le convertiva in formato YARA. Ma questi sono i dettagli. Una parte dell'attività è stata completata, ora puoi iniziare a elaborare regole per determinare packer / cryptor. Ma per questo ho dovuto affrontarli un po '.

Gioco secondo le regole

Pertanto, la regola è il meccanismo principale del programma che consente di attribuire un determinato file a una categoria. Le regole sono descritte in file separato (o file) e nel loro aspetto sono molto simili al costrutto struct () di C / C ++.

regola badboy
{
stringhe:
$ a \u003d "win.exe"
$ b \u003d "http://foo.com/badfi le1.exe"
$ c \u003d "http://bar.com/badfi le2.exe"
condizione:
$ a e ($ b o $ c)
}

In linea di principio, non c'è nulla di complicato nello scrivere le regole. Nel quadro di questo articolo, ho toccato solo i punti principali e troverai i dettagli nel manuale. Finora, i dieci punti più importanti:

1. Ogni regola inizia con parola chiave regola seguita dall'identificatore della regola. Gli identificatori possono avere gli stessi nomi delle variabili in C / C ++, ovvero sono composti da lettere e numeri e il primo carattere non può essere un numero. La lunghezza massima del nome dell'identificatore è di 128 caratteri.

2. In genere, le regole sono composte da due sezioni: una sezione di definizioni (stringhe) e una sezione di condizione (condizione). La sezione stringhe imposta i dati in base ai quali verrà presa la decisione nella sezione condizione se il file specificato soddisfa determinate condizioni.

3. Ogni riga nella sezione stringhe ha il suo identificatore, che inizia con il segno $ - in generale, come una dichiarazione variabile in php. YARA supporta stringhe tra virgolette regolari ("") e stringhe esadecimali racchiuse in bretelle (()) nonché espressioni regolari:

$ my_text_string \u003d "testo qui"
$ my_hex_string \u003d (E2 34 A1 C8 23 FB)

4. La sezione condizione contiene tutta la logica della regola. Questa sezione dovrebbe contenere espressione logica, che determina in quale caso il file o il processo soddisfa la regola. In genere, questa sezione fa riferimento alle righe precedentemente dichiarate. E l'identificatore di riga viene considerato come una variabile logica che restituisce true se la riga è stata trovata nel file o nella memoria del processo e false in caso contrario. La regola precedente determina che i file e i processi contenenti la stringa win.exe e uno dei due URL devono essere classificati come BadBoy (in base al nome della regola).

5. Le stringhe esadecimali consentono di utilizzare tre costrutti che li rendono più flessibili: caratteri jolly, salti e alternative. Le sostituzioni sono luoghi in una stringa sconosciuti e qualsiasi valore può essere al loro posto. Sono indicati dal simbolo "?":

$ hex_string \u003d (E2 34 ?? C8 A? FB)

Questo approccio è molto utile quando si definiscono stringhe la cui lunghezza è nota e il contenuto può variare. Se parte della stringa può avere lunghezze diverse, è conveniente utilizzare intervalli:

$ hex_string \u003d (F4 23 62 B4)

Questa voce indica che al centro della riga possono essere presenti da 4 a 6 byte diversi. Puoi anche implementare una scelta alternativa:

$ hex_string \u003d (F4 23 (62 B4 | 56) 45)

Ciò significa che al posto del terzo byte possono esserci 62 B4 o 56, tale record corrisponde alla linea F42362B445 o F4235645.

6. Per verificare che la stringa specificata si trovi in \u200b\u200bcorrispondenza di un offset specifico nel file o nello spazio degli indirizzi del processo, viene utilizzato l'operatore at:

$ a 100 e $ b a 200

Se la stringa può rientrare in un determinato intervallo di indirizzi, viene utilizzato l'operatore in:

$ a in (0..100) e $ b in (100..fi lesize)

A volte si verificano situazioni in cui è necessario indicare che un file deve contenere un determinato numero da un determinato set. Questo viene fatto usando l'operatore of:

regola OfExample1
{
stringhe:
$ foo1 \u003d "dummy1"
$ foo2 \u003d "dummy2"
$ foo3 \u003d "dummy3"
condizione:
2 di ($ foo1, $ foo2, $ foo3)
}

La regola sopra richiede che il file contenga due righe dal set ($ foo1, $ foo2, $ foo3). Invece di specificare un numero specifico di righe in un file, è possibile utilizzare le variabili qualsiasi (almeno una riga di un determinato set) e tutte (tutte le righe di un determinato set).

7. Bene, l'ultima interessante opportunità da considerare è applicare una condizione a molte righe. Questa funzione è molto simile a quella dell'operatore, solo più potente è l'operatore for..of:

per espressione di string_set: (boolean_expression)

Questo record deve essere letto in questo modo: delle righe specificate in string_ set, almeno i pezzi di espressione devono soddisfare la condizione boolean_expression. Oppure, in altre parole: l'espressione boolean_expression viene valutata per ogni stringa da string_set e l'espressione da esse deve restituire True. Inoltre considereremo questa costruzione su un esempio concreto.

Fare PEiD

Quindi, quando tutto diventa più o meno chiaro con le regole, possiamo iniziare a implementare il rilevatore di packer e cryptor nel nostro progetto. Inizialmente, ho preso in prestito le firme di noti imballatori dallo stesso PEiD del materiale di base. La cartella dei plugin contiene il file userdb.txt, che contiene ciò di cui abbiamo bisogno. C'erano 1850 firme nel mio database.

Molto, quindi per importarli completamente, ti consiglio di scrivere una specie di sceneggiatura. Il formato di questo database è semplice: usa il solito file di testodove sono archiviati i record del modulo:


firma \u003d 50 E8 ?? ?? ?? ?? 58 25 ?? F0 FF FF 8B C8 83 C1 60 51 83 C0 40 83 EA 06 52 FF 20 9D C3
ep_only \u003d true

La prima riga imposta il nome del packer, che verrà visualizzato in PEiD, per noi sarà l'identificatore della regola. Il secondo è la firma stessa. Il terzo è il flag ep_only, che indica se cercare una determinata stringa solo in base all'indirizzo del punto di ingresso o all'intero file.

Bene, proviamo a creare una regola, diciamo, per ASPack? Come si è scoperto, questo non è niente di complicato. Innanzitutto, crea un file per archiviare le regole e chiamalo, ad esempio packers.yara. Quindi cerchiamo nel database PEiD tutte le firme nel nome di cui appare ASPack e le trasferiamo alla regola:

regola ASPack
{
stringhe:
$ \u003d (60 E8 ?? ?? ?? ?? 5D 81 ED ?? ?? (43 | 44) ?? B8 ?? ?? (43 | 44) ?? 03 C5)
$ \u003d (60 EB ?? 5D EB ?? FF ?? ?? ?? ?? ?? ?? E9)
[.. ritagliare ..]
$ \u003d (60 E8 03 00 00 00 E9 EB 04 5D 45 55 C3 E8 01)
condizione:
per ciascuno di essi: ($ al punto di entrata)
}

Per tutti i record trovati, il flag ep_only è impostato su true, ovvero queste righe devono trovarsi all'indirizzo del punto di ingresso. Pertanto, scriviamo la seguente condizione: "per ognuno di essi: ($ al punto di entrata)".

Pertanto, la presenza di almeno una delle righe specificate all'indirizzo del punto di ingresso implica che il file è compresso da ASPack. Si noti inoltre che in questa regola tutte le righe sono specificate semplicemente usando il segno $, senza un identificatore. Questo è possibile, poiché nella sezione delle condizioni non ci riferiamo a quelli specifici, ma utilizziamo l'intero set.

Per verificare lo stato del sistema risultante, basta eseguire il comando nella console:

$ yara -r packers.yara somefi le.exe

Dopo aver fornito lì un paio di applicazioni impacchettate da ASPack, mi sono assicurato che tutto funzionasse!

Prototipo pronto

YARA si è rivelato uno strumento estremamente comprensibile e trasparente. Non è stato difficile per me scrivere un amministratore web e configurarlo come servizio web. Un po 'di creatività e i risultati asciutti dell'analizzatore sono già dipinti in diversi colori, indicando il grado di pericolo del malware rilevato. È disponibile un piccolo aggiornamento del database e, per molti dei cryptor, una breve descrizione e talvolta persino un'istruzione di decompressione. Il prototipo è stato creato e funziona perfettamente e le autorità ballano con gioia!

LA CAMPANA

C'è chi legge questa notizia prima di te.
Iscriviti per ricevere articoli freschi.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam