Creazione di un tipo di file noto personalizzato per R-Studio. Determinare il tipo di file tramite firma Che cos'è una firma di file

Il concetto di " numero magico" nella programmazione ha tre significati:

  • Firma dei dati
  • Dedicato valori unici, che non deve essere uguale ad altri valori (ad esempio 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 significato e può provocare sconcerto se si presenta nel codice del programma senza il contesto o il commento appropriato, mentre un tentativo di cambiarlo in un altro, anche di valore vicino, può portare a conseguenze assolutamente imprevedibili. Per questo motivo tali numeri sono stati ironicamente chiamati numeri magici. Attualmente questo nome è saldamente radicato come termine. Ad esempio, qualsiasi classe di linguaggio Java compilata inizia con il "numero magico" esadecimale 0xCAFEBABE . Il secondo esempio ampiamente noto è qualsiasi file eseguibile sistema operativo Microsoft Windows con l'estensione .exe inizia con la sequenza di byte 0x4D5A (che corrisponde ai caratteri ASCII MZ - le iniziali di Mark Zbikowski, uno dei creatori di MS-DOS). Un esempio meno noto è il puntatore non inizializzato in Microsoft Visual C++ (a partire dalla versione 2005 di Microsoft Visual Studio), che è 0xDEADBEEF in modalità debug.

In stile UNIX sistemi operativi il tipo di file è solitamente determinato dalla firma del file, indipendentemente dall'estensione del suo nome. Forniscono un'utilità di file standard per interpretare la firma di un file.

Cattiva pratica di programmazione

Inoltre, i “numeri magici” sono una cattiva pratica di programmazione quando nel testo di origine è presente un valore numerico e non è ovvio cosa significhi. Ad esempio, uno snippet come questo, scritto in Java, sarebbe dannoso:

drawSprite(53, 320, 240);

finale int LARGHEZZA_SCREEN = 640; finale int SCREEN_HEIGHT = 480; final int SCREEN_X_CENTER = SCREEN_WIDTH / 2; final int SCHERMO_Y_CENTRO = SCHERMO_ALTEZZA / 2; finale int SPRITE_CROSSHAIR = 53; ... drawSprite(SPRITE_CROSSHAIR, SCREEN_X_CENTER, SCREEN_Y_CENTER);

Ora è chiaro: questa linea mostra uno sprite al centro dello schermo: il mirino del mirino. Nella maggior parte dei linguaggi di programmazione, tutti i valori utilizzati per tali costanti verranno calcolati in fase di compilazione e sostituiti nei punti in cui vengono utilizzati i valori. Pertanto, tale modifica nel testo di partenza non pregiudica le prestazioni del programma.

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

  • Se lo stesso numero magico viene utilizzato più di una volta in un programma (o potrebbe essere potenzialmente utilizzato), per modificarlo sarà necessario modificare ogni occorrenza (invece di modificare semplicemente il valore della costante denominata). Se non tutte le occorrenze vengono corrette, si verificherà almeno un errore.
  • In almeno uno dei casi, inizialmente il numero magico potrebbe essere scritto in modo errato e ciò è piuttosto difficile da rilevare.
  • Il numero magico può dipendere da un parametro implicito o da un altro numero magico. Se queste dipendenze, non identificate esplicitamente, non vengono 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 punto è che in C nei sistemi operativi a 32 e 64 bit la dimensione dei tipi char , short e long long è garantita, mentre la dimensione di int , long , size_t e ptrdiff_t può cambiare (per i primi due - a seconda del preferenze degli sviluppatori del compilatore), per gli ultimi due - a seconda della profondità di bit del sistema di destinazione). Nel codice vecchio o scritto male, potrebbero esserci "numeri magici" che indicano la dimensione di un tipo: quando si passa a macchine con bit diversi, possono portare a sottili errori.

Per esempio:

const dimensione_t NUMERO_DI_ELEMENTI = 10; lungo un [NUMBER_OF_ELEMENTI]; memset(a, 0, 10 * 4); // sbagliato: si presuppone che long sia 4 byte, viene utilizzato il numero magico di elementi memset(a, 0, NUMERO_DI_ELEMENTI * 4); // sbagliato: si presuppone che lungo sia 4 byte memset(a, 0, NUMERO_DI_ELEMENTI * dimensionedi (lungo)); // non del tutto corretto - duplicazione del nome del tipo (se il tipo cambia, dovrai cambiarlo anche qui) memset (a, 0, NUMERO_DI_ELEMENTI * sizeof (a [0])); // corretto, ottimale per array dinamici di dimensione diversa da zero memset(a, 0, dimensione(a)); // corretto, ottimale per array statici

Numeri che non sono magici

Non tutti i numeri devono essere convertiti in costanti. Ad esempio, il codice per

La ricerca durante la scansione di file di tipo noto (o, come spesso si dice, la ricerca di file in base alle firme) è una delle più efficaci utilizzate nell'utilità di recupero dati R-Studio. L'utilizzo di una determinata firma consente di ripristinare file di un certo tipo nel caso in cui le informazioni sulla struttura delle directory e sui nomi dei file siano parzialmente o completamente mancanti (danneggiate).

Di solito, la tabella delle partizioni del disco viene utilizzata per determinare la posizione dei file. Se confrontiamo un disco con un libro, la tabella delle partizioni sarà simile al suo sommario. Durante la scansione, R-Studio cerca file di tipi conosciuti nella tabella delle partizioni del disco in base a determinate firme predefinite. Ciò è possibile perché praticamente 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 del file e in molti casi anche alla fine del file. Durante la scansione, R-Studio abbina i dati trovati con le firme di file di tipi noti, consentendone l'identificazione e il ripristino dei dati.

Utilizzando la tecnologia di scansione di file di tipi conosciuti, R-Studio consente di recuperare dati da dischi che sono stati riformattati, nonché le cui tabelle di partizione sono state sovrascritte. Inoltre, se una partizione del disco viene sovrascritta, danneggiata o eliminata, la scansione dei tipi di file conosciuti è l'unica opzione possibile.

Ma quasi tutto ha i suoi svantaggi e i file dei tipi noti utilizzati in R-Studio non fanno eccezione. Pertanto, durante la scansione di file di tipo noto, R-Studio consente di recuperare solo file non frammentati ma, come già accennato, nella maggior parte dei casi questo è l'ultimo metodo possibile.

R-Studio include già le firme per i tipi di file più comuni (view lista completa tipi di file conosciuti, consultare la Guida in linea di R-Studio.)

Se necessario, l'utente può aggiungere nuovi tipi di file a R-Studio. Ad esempio, se è necessario trovare file di tipo univoco o sviluppati dopo la data dell'ultima versione di R-Studio, è possibile aggiungere le proprie firme ai file di tipi conosciuti. Questo processo verrà discusso in seguito.

File utente di tipi noti
Le firme degli utenti per i file di tipi noti vengono archiviate in FileXML e specificato nella finestra di dialogo Opzioni. L'aggiunta di una firma è composta da due parti:

  1. Determinazione della firma del file posta all'inizio del file e, se presente, alla fine del file.
  2. Creazione di un file XML contenente la firma del file e altre informazioni sul tipo di file.

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

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

Primo passo: determinare la firma del file
Per determinare la firma del file, considera esempi di file dello stesso formato.

Lascia che questi siano 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à di considerazione, lasciamo che questi siano file di piccole dimensioni. I file più grandi sono più difficili da visualizzare in formato esadecimale.

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

2. Confronta i file. Cercheremo lo stesso modello trovato in tutti e quattro i file. Lui sarà firma del file. Di norma, le firme dei file si trovano all'inizio del file, ma a volte alla fine.

3. Definire la firma del file all'inizio del file. Nel nostro esempio, si trova all'inizio del file. Tieni presente che non è sempre così: spesso la firma del file è all'inizio del file, ma non alla prima riga (offset).

Dalle immagini sottostanti, sembra che i contenuti di tutti e quattro i file siano 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 è una firma di file di questo tipo File. È presentato sia in formato testo che in forma esadecimale.

In formato testo la firma del file ha la seguente forma:
....ftypmp42....mp42........gratuito

I punti (“.”) indicano caratteri che non possono essere rappresentati come testo. Pertanto è necessario riportare 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 08 66 72 65 65

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

Le immagini seguenti evidenziano la firma del file 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 prima della selezione (firma del file) sono gli stessi in tutti e quattro i file. Si tratta di informazioni tecniche, che non rappresentano una firma del file, ma indicano che tutte e quattro le immagini (file) sono state scattate utilizzando la stessa fotocamera con gli stessi parametri. Di solito è possibile distinguere i modelli di corrispondenza con le informazioni tecniche dalla firma del file. Nel nostro esempio, nell'ultima riga prima dell'inizio della firma del file, vediamo il testo "RecordingMode type="normal"", che indica chiaramente che si tratta di una sorta di parametro del file e non di una firma. Prestare sempre molta attenzione a questa riga per non includerla erroneamente informazioni tecniche nella firma del file.

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

In esadecimale, la firma del file è:
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: creare un file XML che descriva il tipo di file noto
Ora, dopo aver definito la firma del file, è possibile creare un file XML e includere il tipo di file corrispondente in R-Studio. Questo può essere fatto in due modi:

2.1 Utilizzo del built-in redattore grafico firme dei file:
Seleziona Impostazioni dal menu Strumenti, nella finestra di dialogo Impostazioni che si apre, fai clic sulla scheda Tipi di file conosciuti, 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. Numero dato sarà scelto arbitrariamente; l'unica cosa è che non deve corrispondere all'ID numerico di nessun altro tipo di file.
  • Descrizione gruppo: il gruppo in cui verranno posizionati i file trovati in R-Studio. Puoi impostarli entrambi nuovo gruppo, oppure scegline uno tra quelli già esistenti. Per noi sarà un gruppo “Video multimediale (Multimedia: Video)”.
  • Descrizione- breve descrizione tipo di file. Nel nostro esempio è possibile utilizzare ad esempio "Sony cam video, XDCam-EX".
  • Estensione: estensione del file di questo tipo. Nel nostro caso - mp4.

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

Clicca sull'immagine per ingrandirla

Successivamente, è necessario inserire la firma iniziale e finale del file. Per fare ciò, seleziona Inizio (Begin) e poi dentro menù contestuale il comando Aggiungi firma.

Clicca sull'immagine per ingrandirla

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

Clicca sull'immagine per ingrandirla

Quindi crea la firma del file finale. Non dimenticare di inserire 21 nel campo della colonna Da.

Clicca sull'immagine per ingrandirla

Hai creato con successo la tua firma di file di un tipo noto.

Ora dobbiamo salvarlo. Esistono due modi: puoi 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... e salva la firma in un altro file.

2.2 Creazione manuale di un file XML che descrive un tipo di file noto:
Per creare dato file Usiamo XML versione 1.0 e la codifica UTF-8. Non disperare se non sai di cosa si tratta: aprine semplicemente uno qualsiasi editor di testo(ad esempio Notepad.exe) e nella prima riga inserire il seguente testo:

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

Inseriscilo subito dopo

Successivamente, definiamo la firma del file (tag ). La firma iniziale (all'inizio del file) sarà all'interno del tag senza alcun attributo. Utilizziamo la forma testuale della firma, sostituendola però allo stesso tempo con caratteri esadecimali che non possono essere rappresentati in forma testuale. Prima di ogni carattere esadecimale, inserire "\x" Quindi il tag con una firma del file sarebbe simile a questo:

Se presente è necessario definire anche la firma finale (alla fine del file). A questo scopo viene utilizzato lo stesso tag, ma con l'elemento "from" e l'attributo "end". Apparirà così:

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

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

Quindi l'intero file dovrebbe assomigliare a questo:


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

Ricorda: la sintassi XML fa distinzione tra maiuscole e minuscole, quindi lo è il tag corretto , ma no .

Salviamo il file in formato testo con estensione .xml. Ad esempio: SonyCam.xml.

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

Fase 3: controllo e aggiunta di un file che descrive un tipo di file noto
Il passaggio successivo consiste nell'aggiungere (caricare) il file XML in R-Studio. Verrà quindi controllato automaticamente.

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

Clicca sull'immagine per ingrandirla

2. Rispondere Sì (Sì) alla richiesta di caricare 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 conosciuti della finestra di dialogo Impostazioni. Ricordiamo che abbiamo aggiunto il tipo di file al gruppo Video multimediale (Multimedia: Video). Espandendo questo gruppo (cartella), dovremmo vedere un elemento con la descrizione che abbiamo specificato durante la creazione del file XML: Sony cam video, XDCam-EX (.mp4).

Clicca sull'immagine per ingrandirla


Clicca sull'immagine per ingrandirla

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

Clicca sull'immagine per ingrandirla

In questo caso, controlla nuovamente la presenza di errori nel file XML. Ricorda, la sintassi XML fa distinzione tra maiuscole e minuscole e ogni tag deve avere un tag di chiusura alla fine.

Fase 4: test del file che descrive il tipo di file noto
Per verificare se il tipo di file personalizzato che abbiamo creato è corretto, proviamo a trovare i nostri file .mp4 su un'unità flash USB rimovibile.

1. In Windows Vista o Windows 7, eseguire una formattazione completa (non rapida) del disco o utilizzare un'utilità di pulizia dello spazio su disco (ad esempio, R-Wipe & Clean) per rimozione completa tutti i dati sul disco. Permettere Disco USB formattato in FAT32 (la dimensione dei file richiesti non supera i 2 GB).

2. Ricopia file di prova su disco e riavviare il computer in modo che il contenuto della memoria cache venga salvato su disco. Puoi anche disattivare unità esterna e poi collegarlo di nuovo.

3. Nell'OS l'unità verrà definita ad es. come unità logica F:\.

4. Eseguire R-Studio. Seleziona la nostra unità (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. In questo modo disabiliteremo la ricerca di file system e file utilizzando la tabella delle partizioni.
Clicca sull'immagine per ingrandirla

6. Selezionare la casella Ricerca aggiuntiva per tipi di file conosciuti. Ciò consentirà a R-Studio di eseguire la scansione dei tipi di file conosciuti.

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

8. Attendere mentre R-Studio esegue la scansione del disco. La scheda Informazioni sulla scansione visualizzerà l'avanzamento della scansione.


Clicca sull'immagine per ingrandirla

9. Una volta completata la scansione, selezionare la voce File extra trovati e fare doppio clic su di essa.


Clicca sull'immagine per ingrandirla

10. I nostri file di test si troveranno nella cartella Sony Cam Video, XDCam-EX (o in una cartella con un altro nome che corrisponda alla descrizione del tipo di file specificata nel secondo passaggio).


Clicca sull'immagine per ingrandirla

Puoi vedere che i nomi dei file, le date e le posizioni (cartelle) non sono stati ripristinati perché questa informazione memorizzati nel file system. Pertanto, R-Studio visualizzerà automaticamente ciascun file con un nuovo nome.

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


Clicca sull'immagine per ingrandirla

Conclusione
La capacità di R-Studio di cercare file di tipi conosciuti consente di recuperare i dati anche da un disco i cui file system sono stati sovrascritti. Puoi cercare i file in modo abbastanza efficiente utilizzando le loro firme, il che è particolarmente utile se conosci esattamente il tipo di file da 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 dei tipi di file conosciuti.

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

UNIX: gatto immagine1.jpg archivio.rar > immagine2.jpg
FINESTRE: copia /b immagine1.jpg+archivio.rar immagine2.jpg

O se hai un editor esadecimale.

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

I metodi per rilevare le lime incollate possono essere divisi in tre gruppi:

  1. Metodo per controllare l'area dopo il segnalino EOF. Molti formati di file popolari dispongono di un cosiddetto indicatore 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 successiva rimane ignorata. Questo metodo è ideale per i formati: JPEG, PNG, GIF, ZIP, RAR, PDF.
  2. Metodo per controllare la dimensione 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 controllare i file CFB. CFB o Compound File Binary Format è un formato di documento sviluppato da Microsoft, che è un contenitore con un proprio file system. Questo metodo si basa sul rilevamento di anomalie in un file.

C'è vita dopo la fine del file?

JPEG

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

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

PNG

I primi otto byte di un file PNG sono occupati dalla 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.

RARO

Firma comune per tutti gli archivi rar: 0x52 0x61 0x72 0x21 (Rar!). Dopo arrivano le informazioni sulla versione dell'archivio e altri dati correlati. Empiricamente si è riscontrato che l'archivio termina con la firma 0x0A, 0x25, 0x25, 0x45, 0x4F, 0x46.

Tabella dei formati e delle relative firme:
L'algoritmo per il controllo dell'incollaggio in questi formati è estremamente semplice:

  1. Trova la firma iniziale;
  2. Trova la firma finale;
  3. Se non ci sono dati dopo la firma finale, il tuo 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 indicatore EOF, ad esempio a causa di una generazione errata del documento. Il numero di segnature finali in un file GIF è uguale al numero di fotogrammi in esso contenuti. In base alle caratteristiche di questi formati è possibile migliorare l'algoritmo per il controllo dei file allegati.
  1. L'elemento 1 viene ripetuto dall'algoritmo precedente.
  2. L'elemento 2 viene ripetuto dall'algoritmo precedente.
  3. Quando trovi la firma finale, ricorda la sua posizione e cerca ulteriormente;
  4. Se l'ultimo marcatore EOF viene raggiunto in questo modo, il file è pulito.
  5. Se il file non termina con la firma finale, vai a è la posizione dell'ultima firma finale trovata.
Una grande differenza tra la dimensione del file e la posizione dopo l'ultima firma finale indica la presenza di un allegato permanente. La differenza può essere superiore a dieci byte, sebbene sia possibile impostare altri valori.

cerniera lampo

Caratteristica degli archivi ZIP è la presenza di tre diverse firme: La struttura dell'archivio è la seguente:
Intestazione file locale 1
Dati dell'archivio 1
Descrittore dei dati 1
Intestazione file locale 2
Dati dell'archivio 2
Descrittore dei dati 2
...
Intestazione file locale n
Dati del File n
Descrittore dei dati n
Intestazione di decrittografia dell'archivio
Archivia record di dati aggiuntivi
Elenco centrale
La cosa più interessante è la directory centrale, che contiene i 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 consistono solo della firma finale e di 18 byte nulli. Dopo 18 byte c'è l'area commenti dell'archivio, che è il contenitore perfetto per nascondere un file.

Per controllare un archivio ZIP è necessario trovare la firma finale della directory centrale, saltare 18 byte e cercare le firme dei formati conosciuti nell'area dei commenti. Grande taglia Il commento testimonia anche il fatto dell'incollaggio.

La dimensione conta

AVI

La struttura di un file AVI è la seguente: ogni file inizia con una firma RIFF (0x52 0x49 0x46 0x46). Sul byte 8 c'è una firma AVI che specifica il formato (0x41 0x56 0x49 0x20). Il blocco all'offset 4, composto da 4 byte, contiene la dimensione iniziale del blocco dati (l'ordine dei byte è little endian). Per scoprire il numero del blocco contenente la dimensione successiva, è necessario aggiungere la dimensione dell'intestazione (8 byte) e la dimensione ottenuta nel blocco di 4-8 byte. Questo calcola la dimensione totale del file. È possibile che la dimensione calcolata sia inferiore alla dimensione effettiva del file. Dopo la dimensione calcolata, il file conterrà solo zero byte (necessari per allineare il limite di 1Kb).

Esempio di calcolo delle dimensioni:


WAV

Come l'AVI, un file WAV inizia con la 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. La dimensione effettiva deve corrispondere esattamente alla dimensione calcolata.

MP4

MP4 o MPEG-4 è un formato contenitore multimediale utilizzato per archiviare flussi video e audio e prevede anche l'archiviazione di sottotitoli e immagini.
All'offset 4 byte sono le firme: tipo di file ftyp (66 74 79 70) (tipo di file contenitore QuickTime) e sottotipo di file mmp4 (6D 6D 70 34). Per il riconoscimento file nascosti, ci interessa la possibilità di calcolare la dimensione del file.

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

MOV

Questo formato ampiamente utilizzato è anche un contenitore MPEG-4. MOV utilizza un algoritmo di compressione dati proprietario, ha una struttura simile a MP4 e viene utilizzato per lo stesso scopo: archiviare dati audio e video, nonché materiali correlati.
Come MP4, qualsiasi file mov ha una firma ftyp da 4 byte all'offset 4, tuttavia, la firma successiva ha il valore qt__ (71 74 20 20). La regola per calcolare la dimensione del file non è cambiata: partendo dall'inizio del file, calcoliamo la dimensione del blocco successivo e la sommiamo.

Il metodo per verificare la presenza di file "allegati" in questo gruppo di formati consiste nel calcolare la dimensione secondo le regole di cui sopra e confrontarla con la dimensione del file da controllare. Se la dimensione del file corrente è molto inferiore a quella calcolata, ciò indica il fatto della fusione. Quando si controllano i file AVI, è consentito che la dimensione calcolata possa essere inferiore alla dimensione del file a causa della presenza di zeri aggiunti per l'allineamento dei bordi. In tal caso, è necessario verificare la presenza di zeri dopo la dimensione del file calcolata.

Controlla il formato binario del file composto

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

Il file CFB è costituito da un'intestazione da 512 byte e da settori della stessa lunghezza che memorizzano flussi di dati o informazioni sul servizio. Ogni settore ha il proprio numero non negativo, ad eccezione dei 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 abbia incollato un altro file alla sua fine. Ci sono alcuni vari modi rilevarlo o segnalare un'anomalia nel documento.

Dimensioni del file anomale

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

(FileSize - 512) mod SectorSize = 0

Se questa uguaglianza non è soddisfatta, puoi indicare il fatto di unire i file. Tuttavia, questo metodo presenta uno svantaggio significativo. Se l'aggressore conosce la dimensione del settore, gli basta attaccare 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 l'aggressore conosce un metodo per aggirare il controllo precedente, allora questo metodo può rilevare la presenza di settori con tipi non definiti.

Definiamo l'uguaglianza:

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

Definiamo inoltre le seguenti variabili:

  1. CountFat: il numero di settori FAT. Situato all'offset 44 dall'inizio del file (4 byte);
  2. CountMiniFAT: il numero di settori MiniFAT. Situato all'offset 64 dall'inizio del file (4 byte);
  3. CountDIFAT - numero di settori DIFAT. Situato all'offset 72 dall'inizio del file (4 byte);
  4. CountDE è il numero di settori di voci di directory. Per trovare questa variabile, è necessario trovare il primo settore DE, che si trova al 48esimo offset. Quindi è necessario ottenere la rappresentazione completa di DE da FAT e contare il numero di settori DE;
  5. CountStreams: numero di settori con flussi di dati;
  6. CountFree: il numero di settori liberi;
  7. CountClassified: il numero di settori con un determinato tipo;
CountClassified = CountFAT + CountMiniFAT + CountDIFAT + CountDE + CountStreams + CountFree

È ovvio che se CountClassified e CountReal non sono uguali, possiamo concludere che i file potrebbero essere uniti.

Il capo mi ha assegnato un compito piuttosto interessante. In breve tempo, scrivere un analizzatore di file eseguibili in grado di trovare i corpi dei virus in base alle firme e determinare il packer/crittografo utilizzato. Il prototipo finito è apparso in un paio d'ore.

Parola d'autore

analisi della firma

Cercare un oggetto dannoso tramite firme è ciò che può fare qualsiasi antivirus. In generale, una firma è una descrizione formalizzata di alcuni segni mediante i quali è possibile determinare che il file sottoposto a scansione è un virus e il virus è abbastanza specifico.

Ci sono vari metodi qui. In alternativa, utilizzare una firma composta da N byte di un oggetto dannoso. In questo caso è possibile fare non un confronto stupido, ma un confronto tramite qualche maschera (come cercare i byte EB ?? ?? CD 13). Oppure imposta condizioni aggiuntive come "tali byte devono trovarsi nel punto di ingresso del programma" e così via. La firma di Malvari è una particolarità.

Allo stesso modo, vengono descritti alcuni segni dai quali è possibile determinare che il file eseguibile è compresso con l'uno o l'altro crittografo o packer (ad esempio il banale ASPack). Se leggi attentamente la nostra rivista, hai sicuramente sentito parlare di uno strumento come PEiD, che è in grado di determinare i packer, i crittografi e i compilatori più comunemente utilizzati (ci sono un gran numero di firme nel database) per il file PE trasferito su Esso. Purtroppo, le nuove versioni del programma non vengono rilasciate da molto tempo e recentemente sul sito ufficiale è apparso un messaggio che il progetto non si svilupperà ulteriormente. È un peccato perché le funzionalità di PEiD (soprattutto considerando il sistema di plugin) potrebbero tornarmi molto utili. Dopo una breve analisi, è diventato chiaro che questa non era un’opzione. Ma dopo aver frugato nei blog in lingua inglese, ho trovato rapidamente quello che faceva per me. Progetto YARA (code.google.com/p/yara-project).

Cos'è YARA?

Fin dall'inizio ero convinto che da qualche parte sul Web fossero già aperti sviluppi che avrebbero avuto il compito di accertare la corrispondenza tra una qualche firma e il file indagato. Se potessi trovare un progetto del genere, potrebbe essere facilmente inserito nei binari di un'applicazione web, aggiungere lì diverse firme e ottenere ciò che mi veniva richiesto. Il piano ha cominciato a sembrarmi 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 a identificare e classificare campioni dannosi. Il ricercatore può creare descrizioni per tipo diverso malware che utilizza testo o modelli binari che descrivono le caratteristiche formalizzate del malware. Ecco come si ottengono le firme. Ogni descrizione, infatti, è costituita da un insieme di righe e da qualche espressione logica, in base alla quale viene determinata la logica di funzionamento dell'analizzatore.

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

regola silent_banker: banchiere
{
meta:
description = "Questo è solo un esempio"
livello_thread = 3
in_the_wild = vero
stringhe:
$a = (6A 40 68 00 30 00 00 6A 14 8D 91)
$b = (8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9)
$c = "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 dovrebbe essere classificato come trojan silent_banker. E questa è una regola molto semplice. In effetti, le ruote possono essere molto più complicate (ne parleremo più avanti).
Anche l'elenco dei progetti che lo utilizzano parla già dell'autorità del progetto YARA, e questo:

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

Tutto il codice è scritto in Python e all'utente viene offerto sia il modulo stesso da utilizzare nei propri sviluppi, 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 utilizzeremo l'analizzatore semplicemente come applicazione console.

Dopo un po' di ricerche, ho capito rapidamente come scrivere le regole per YARA, nonché come allegare le firme dei virus da un aver gratuito e packer da PEiD ad esso. Ma cominciamo 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 chiamiamo l'applicazione nella console, otterremo l'esecuzione delle regole.

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

Cioè, il formato della chiamata del programma è il seguente: prima viene il nome del programma, poi l'elenco delle 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'ID del processo. Adesso sarebbe carino spiegarvi come vengono stilate proprio queste regole, ma non voglio caricarvi subito di un’arida teoria. Pertanto, agiremo diversamente e prenderemo in prestito le firme di altre persone in modo che YARA possa eseguire uno dei compiti che abbiamo impostato: un rilevamento completo dei virus tramite firme.

Il tuo antivirus

La domanda più importante: dove trovare il database delle firme dei virus conosciuti? Le società antivirus condividono attivamente tra loro tali database (alcune più generosamente, altre meno). Ad essere sincero, all'inizio dubitavo persino che da qualche parte sul Web qualcuno pubblicasse apertamente cose del genere. Ma, come si è scoperto, ci sono brave persone. Una base adatta del popolare antivirus ClamAV è disponibile per tutti (clamav.net/lang/en). Nella sezione "Ultima versione stabile", puoi trovare un collegamento a ultima versione 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 principale delle firme, il secondo il più completo questo momento base con varie aggiunte. A questo scopo è sufficiente daily.cvd, che contiene oltre 100.000 cast di malware. Tuttavia, la base ClamAV non è una base YARA, quindi dobbiamo convertirla nel formato corretto. Ma come? Dopotutto, non sappiamo ancora nulla né del formato ClamAV né del formato Yara. Questo problema è già stato risolto prima di noi preparando un piccolo script che converte il database delle firme antivirali ClamAV in un 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, otterremo una firma base nel file clamav.yara, che sarà immediatamente pronta per l'uso. Ora proviamo la combinazione di YARA e ClamAV base in azione. La scansione di una cartella utilizzando una firma viene eseguita con un singolo comando:

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

L'opzione -r specifica che la scansione deve essere eseguita in modo ricorsivo attraverso tutte le sottocartelle della cartella corrente. Se ci fossero corpi di virus nella cartella /pentest/msf3/data (almeno quelli nel database ClamAV), YARA lo segnalerà immediatamente. In linea di principio, questo è uno scanner di firma già pronto. Per maggiore comodità, ho scritto un semplice script che controllava gli aggiornamenti del database ClamAV, caricava nuove firme e le convertiva nel formato YARA. Ma questi sono dettagli. Una parte del compito è terminata, ora possiamo iniziare a scrivere le regole per definire packer/cryptor. Ma per questo era necessario occuparsene un po'.

Gioco secondo le regole

Quindi, la regola è il meccanismo principale del programma che ti consente di assegnare un determinato file a qualsiasi categoria. Le regole sono descritte in uno o più file separati e hanno un aspetto molto simile al costrutto struct() del linguaggio C/C++.

governa il cattivo ragazzo
{
stringhe:
$a = "win.exe"
$b = "http://foo.com/badfile1.exe"
$c = "http://bar.com/badfile2.exe"
condizione:
$a e ($b o $c)
}

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

1. Ogni regola inizia con la parola chiave della regola seguita dall'identificatore della regola. Gli identificatori possono avere gli stessi nomi delle variabili in C/C++, ovvero possono essere costituiti da lettere e cifre e il primo carattere non può essere una cifra. Lunghezza massima nome identificativo: 128 caratteri.

2. In genere, le regole sono costituite da due sezioni: una sezione delle definizioni (stringhe) e una sezione delle condizioni. La sezione stringhe contiene dati in base ai quali nella sezione condizioni si deciderà se il file indicato soddisfa determinate condizioni.

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

$my_text_string = "testo qui"
$mia_stringa_esadecimale = ( E2 34 A1 C8 23 FB )

4. La sezione delle condizioni contiene tutta la logica della regola. Questa sezione deve contenere un'espressione booleana che determina quando il file o il processo corrisponde alla regola. In genere, questa sezione fa riferimento a stringhe dichiarate in precedenza. E l'ID della riga viene trattato come una variabile booleana che restituisce true se la riga è stata trovata nel file o nella memoria del processo e false in caso contrario. La regola precedente specifica che file e processi contenenti la stringa win.exe e uno dei due URL devono essere classificati come BadBoy (secondo il nome della regola).

5. Le stringhe esadecimali consentono tre costrutti che le rendono più flessibili: caratteri jolly, salti e alternative. Le sostituzioni sono posti in una stringa che sono sconosciuti e possono avere qualsiasi valore. Sono contrassegnati dal simbolo "?":

$stringa_esadecimale = ( MI2 34 ?? DO8 LA? FA )

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

$stringa_esadecimale = ( F4 23 62 B4 )

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

$stringa_esadecimale = ( F4 23 (62 B4 | 56) 45 )

Ciò significa che al posto del terzo byte possono esserci 62 B4 oppure 56, tale voce corrisponde alle righe F42362B445 o F4235645.

6. Per verificare che una determinata stringa si trovi a un determinato offset in uno spazio di indirizzi di file o processo, utilizzare l'istruzione at:

$a 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..dimensione file)

A volte ci sono situazioni in cui è necessario indicare che il file deve contenere un certo numero da un determinato set. Questo viene fatto utilizzando l'operatore of:

regola dell'esempio1
{
stringhe:
$pippo1 = "manichino1"
$pippo2 = "manichino2"
$foo3 = "manichino3"
condizione:
2 di ($foo1,$foo2,$foo3)
}

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

7. Ebbene, l'ultima possibilità interessante da considerare è applicare una condizione a più righe. Questa funzionalità è molto simile all'operatore of, solo che è più potente l'operatore for..of:

per l'espressione di string_set: (boolean_expression)

Questa voce dovrebbe essere letta in questo modo: delle stringhe specificate in string_set, almeno le parti dell'espressione devono soddisfare la condizione boolean_expression. Oppure, in altre parole: boolean_expression viene valutato per ogni stringa di string_set e l'espressione da essi deve restituire True. Successivamente, considereremo questa costruzione su un esempio specifico.

Realizzare PEiD

Quindi, quando tutto sarà diventato più o meno chiaro con le regole, potremo iniziare a implementare il rilevatore di packer e cryptor nel nostro progetto. Come materiale di partenza, ho inizialmente preso in prestito le firme di noti imballatori dello stesso PEiD. La cartella plugins contiene il file userdb.txt, che contiene ciò di cui abbiamo bisogno. Nel mio database c'erano 1850 firme.

Molti, quindi per importarli completamente, ti consiglio di scrivere una sorta di script. Il formato di questa base è semplice: il solito file di testo, che memorizza i record del modulo:


firma = 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=vero

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

Bene, proviamo a creare una regola, diciamo, per ASPack? Come si è scoperto, non c'è nulla di complicato in questo. Per prima cosa creiamo un file per memorizzare le regole e chiamiamolo, ad esempio, packers.yara. Quindi cerchiamo nel database PEiD tutte le firme con ASPack nel nome e le trasferiamo alla regola:

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

Tutte le voci trovate hanno il flag ep_only impostato su true, ovvero queste righe devono trovarsi nell'indirizzo del punto di ingresso. Quindi scriviamo la seguente condizione: "per ognuno di essi: ($ al punto di ingresso)".

Pertanto, la presenza di almeno una delle stringhe indicate nell'indirizzo del punto di ingresso significherà che il file è compresso con ASPack. Si noti inoltre che in questa regola tutte le stringhe vengono specificate semplicemente con il segno $, senza identificatore. Ciò è possibile poiché nella sezione relativa alle condizioni non ci riferiamo a nessuno di essi in particolare, ma utilizziamo l'intero set.

Per verificare l'operatività del sistema ricevuto, è sufficiente eseguire il comando nella console:

$ yara -r packers.yara somefi le.exe

Dopo aver inserito lì un paio di applicazioni piene di ASPack, mi sono assicurato che tutto funzionasse!

Prototipo finito

YARA si è rivelato uno strumento estremamente chiaro e trasparente. Non è stato difficile per me scrivere un webadmin e configurarlo come servizio web. Con un po' di creatività i risultati secchi dell'analizzatore vengono già colorati in diversi colori, indicando il grado di pericolosità del malware rilevato. Un piccolo aggiornamento del database e per molti dei crittografi è disponibile una breve descrizione e talvolta anche le istruzioni per il disimballaggio. Il prototipo è stato realizzato e funziona perfettamente, e le autorità ballano di gioia!

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

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

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

7 6 5 4 3 2 1 0 FC: risposta al codice funzione
0 telegramma di risposta
0 Riservato
0 0 schiavo
0 1 Maestro non pronto
1 0 Maestro pronto, senza gettone
1 1 Maestro pronto, nel gettone
0 (0x0) OK
1 (0x1) UE = Errore utente
2 (0x2) RR = Nessuna risorsa
3 (0x3) RS = SAP non abilitato
8 (0x8) DL = Dati bassi (caso normale con DP)
9 (0x9) NR = Nessun dato di risposta pronto
10(0xA) DH = Data High (diagnosi DP in sospeso)
12(0xC) RDL = Dati non ricevuti e Dati bassi
13(0xD) RDH = Dati non ricevuti e Dati alti
altro Riservato

Bit di conteggio dei frame Il bit di conteggio dei frame FCB (b5) impedisce la duplicazione del messaggio da parte della stazione di riconoscimento o di risposta (risponditore) e qualsiasi perdita da parte della stazione chiamante (iniziatore). Sono escluse da ciò le richieste senza riconoscimento (SDN) e le richieste FDL Status, Ident e LSAP Status.

Per la sequenza di sicurezza, l'iniziatore deve portare con sé un FCB per ciascun risponditore. Quando un telegramma di richiesta (Richiesta o Invia/Richiesta) viene inviato a un risponditore per la prima volta 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 ciò in un telegramma Request con FCV=0 e FCB=1. Il risponditore deve valutare un telegramma di questo tipo come primo ciclo di messaggi e memorizzare l'FCB=1 insieme all'indirizzo dell'iniziatore (SA) (vedi tabella seguente). Questo ciclo di messaggi non verrà ripetuto dall'iniziatore. Nei successivi telegrammi Request allo stesso risponditore, l'iniziatore deve impostare FCV=1 e modificare l'FCB con ogni nuovo telegramma Request. Ogni risponditore che riceve un telegramma Request indirizzato a lui con FCV=1 deve valutare l'FCB. Se l'FCB è cambiato rispetto all'ultimo telegramma Request dello stesso iniziatore (stesso SA), ciò è una valida conferma che il ciclo di messaggi precedente si è concluso correttamente. Se il telegramma Request proviene da un diverso iniziatore (diverso SA), la valutazione dell'FCB non è più necessaria. In entrambi i casi il ricevente deve salvare l'FCB con l'SA sorgente fino al ricevimento di un nuovo telegramma a lui indirizzato. In caso di telegramma di conferma o di risposta perso o compromesso, l'FCB non deve essere modificato dall'iniziatore nel nuovo tentativo di richiesta: ciò indicherà che il ciclo di messaggio precedente era errato. Se il risponditore riceve un telegramma Request con FCV=1 e lo stesso FCB dell'ultimo telegramma Request dallo stesso iniziatore (stesso SA), ciò indicherà un nuovo tentativo di richiesta. Il risponditore deve a sua volta ritrasmettere il telegramma di conferma o di risposta tenuto pronto. Fino alla suddetta conferma o ricezione di un telegramma con indirizzo diverso (SA o DA) che non viene riconosciuto (Send Data with No Acknowledge, SDN) il risponditore deve tenere pronto l'ultimo telegramma di conferma o di risposta per ogni eventuale nuovo tentativo di richiesta . In caso di telegrammi Request non confermati e con Request FDL Status, Ident e LSAP Status, FCV=0 e FCB=0; la valutazione da parte del risponditore non è più necessaria.

b5 b4 posizione della punta
FCB FCV Condizione Senso Azione
0 0 DA=TS/127 Richiesta senza conferma
Richiedi stato FDL/Ident/Stato LSAP
Elimina l'ultima conferma
0/1 0/1 DA#TS Richiesta a un altro risponditore
1 0 DA=TS Prima richiesta FCBM:= 1
SAM:=SA
Elimina l'ultima conferma/risposta
0/1 1 DA=TS
SA=SAM
FCB#FCBM
Nuova richiesta Elimina l'ultima conferma/risposta
FCBM:=FCB
Mantieni il riconoscimento/risposta pronto per un nuovo tentativo
0/1 1 DA=TS
SA=SAM
FCB=FCBM
Richiesta di nuovo tentativo FCBM:=FCB
Ripetere il riconoscimento/risposta e continuare a mantenersi pronti
0/1 1 DA=TS
SA#SAM
Nuovo iniziatore FCBM:=FCB
SAM:= SA Mantiene la conferma/risposta pronta per un nuovo tentativo

FCBM ha memorizzato FCB in memoria SAM ha memorizzato SA in memoria




Superiore