Crearea unui tip de fișier cunoscut personalizat pentru R-Studio. Determinarea unui tip de fișier prin semnătură Ce este o semnătură de fișier

Conceptul " Număr magic„în programare are trei semnificații:

  • Semnătura datelor
  • Selectat valori unice, care nu ar trebui să fie același cu alte valori (de exemplu UUID)
  • Practică proastă de programare.

Semnătura datelor

Număr magic, sau semnătură, - un număr întreg sau constantă text utilizată pentru a identifica în mod unic o resursă sau date. Un astfel de număr în sine nu are nicio semnificație și poate provoca confuzie dacă apare în codul programului fără contextul sau comentariul adecvat, în timp ce o încercare de a-l schimba cu altul, chiar unul apropiat ca valoare, poate duce la consecințe complet imprevizibile. Din acest motiv, astfel de numere au fost numite în mod ironic numere magice. În prezent, acest nume este ferm stabilit ca termen. De exemplu, orice clasă de limbaj Java compilată începe cu „numărul magic” hexazecimal 0xCAFEBABE. Al doilea exemplu cunoscut este oricare fisier executabil OS Microsoft Windows cu extensia .exe începe cu secvența de octeți 0x4D5A (care corespunde caracterelor ASCII MZ - inițialele lui Mark Zbikowski, unul dintre creatorii MS-DOS). Un exemplu mai puțin cunoscut este indicatorul neinițializat din Microsoft Visual C++ (din versiunea 2005 a Microsoft Visual Studio), care are adresa 0xDEADBEEF în modul de depanare.

În UNIX-like sisteme de operare Tipul fișierului este de obicei determinat de semnătura fișierului, indiferent de extensia numelui acestuia. Ele oferă un utilitar standard de fișier pentru a interpreta semnătura fișierului.

Practică proastă de programare

Denumite și „numere magice” este o practică proastă de programare atunci când apare o valoare numerică în textul sursă și nu este evident ce înseamnă. De exemplu, un fragment ca acesta, scris în Java, ar fi rău:

drawSprite(53, 320, 240);

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

Acum este clar: această linie afișează un sprite - încrucișarea vederii - în centrul ecranului. În majoritatea limbajelor de programare, toate valorile utilizate pentru astfel de constante vor fi calculate în timpul compilării și înlocuite în locurile în care sunt utilizate valorile. Prin urmare, o astfel de modificare a textului sursă nu degradează performanța programului.

În plus, numerele magice sunt o sursă potențială de erori într-un program:

  • Dacă același număr magic este folosit de mai multe ori într-un program (sau ar putea fi utilizat), atunci modificarea acestuia va necesita modificări pentru fiecare apariție (în loc de o singură modificare a valorii constantei numite). Dacă nu toate aparițiile sunt corectate, va apărea cel puțin o eroare.
  • În cel puțin una dintre apariții, numărul magic poate fi scris greșit inițial, iar acest lucru este destul de dificil de detectat.
  • Numărul magic poate depinde de un parametru implicit sau de un alt număr magic. Dacă aceste dependențe, neidentificate explicit, nu sunt satisfăcute, va apărea cel puțin o eroare.
  • Când se modifică aparițiile unui număr magic, este posibil să se schimbe din greșeală un alt număr magic care este independent, dar are aceeași valoare numerică.

Numere magice și multi-platformă

Uneori, numerele magice dăunează codului multiplatform. Cert este că în C, pe sistemele de operare pe 32 și 64 de biți, dimensiunea tipurilor char , short și long long este garantată, în timp ce dimensiunea int , long , size_t și ptrdiff_t se poate modifica (pentru primele două, în funcție de preferințele dezvoltatorilor compilatorului, pentru ultimele două - în funcție de capacitatea de biți a sistemului țintă). În codul vechi sau prost scris, pot exista „numere magice” care indică dimensiunea unui tip - atunci când treceți la mașini cu o capacitate diferită de biți, acestea pot duce la erori subtile.

De exemplu:

const size_t NUMBER_OF_ELEMENTS = 10 ; lungă [NUMBER_OF_ELEMENTS]; memset(a, 0, 10 * 4); // incorect - se presupune că lungimea este de 4 octeți, este folosit un număr magic de elemente memset(a, 0, NUMBER_OF_ELEMENTS * 4); // incorect - se presupune că lungimea este de 4 octeți memset(a, 0, NUMBER_OF_ELEMENTS * sizeof(long)); // nu este complet corect - duplicarea numelui tipului (dacă tipul se schimbă, va trebui să îl schimbați și aici) memset (a , 0 , NUMBER_OF_ELEMENTS * sizeof (a [ 0 ])); // corect, optim pentru matrice dinamice de dimensiune diferită de zero memset(a, 0, sizeof(a)); // corect, optim pentru matrice statice

Cifre care nu sunt magice

Nu toate numerele trebuie convertite în constante. De exemplu, codul pentru

Căutarea prin scanarea fișierelor de tipuri cunoscute (sau, după cum se spune adesea, căutarea fișierelor după semnătură) este una dintre cele mai eficiente utilizate în utilitarul de recuperare a datelor R-Studio. Utilizarea unei anumite semnături vă permite să restaurați fișiere de un anumit tip în cazurile în care informațiile despre structura directoarelor și numele fișierelor lipsesc parțial sau complet (deteriorate).

De obicei, tabelul de partiții de disc este utilizat pentru a determina locația fișierelor. Dacă comparați un disc cu o carte, tabelul de partiții va fi similar cu cuprinsul său. La scanare, R-Studio caută tipuri de fișiere cunoscute în tabelul de partiții ale discului folosind anumite semnături specificate. Acest lucru este posibil prin faptul că practic fiecare tip de fișier are o semnătură sau un model de date unic. Semnăturile fișierului se găsesc într-o locație specifică la începutul fișierului și în multe cazuri și la sfârșitul fișierului. La scanare, R-Studio potrivește datele găsite cu semnăturile unor tipuri de fișiere cunoscute, ceea ce permite identificarea acestora și recuperarea datelor.

Folosind tehnologia pentru scanarea tipurilor de fișiere cunoscute, R-Studio vă permite să recuperați date de pe discuri care au fost reformatate și ale căror tabele de partiții au fost suprascrise. În plus, dacă o partiție de disc este suprascrisă, deteriorată sau ștearsă, atunci scanarea tipurilor de fișiere cunoscute este singura opțiune.

Dar aproape totul are dezavantajele sale, iar tipurile de fișiere cunoscute utilizate în R-Studio nu fac excepție. Deci, atunci când scanați tipuri de fișiere cunoscute, R-Studio vă permite să recuperați numai fișiere nefragmentate, dar, așa cum am menționat deja, în majoritatea cazurilor aceasta este cea mai recentă metodă posibilă.

R-Studio include deja semnături ale celor mai comune tipuri de fișiere (vizualizare lista plina fișierele de tipuri cunoscute pot fi găsite în secțiunea R-Studio Online Help.)

Dacă este necesar, utilizatorul poate adăuga noi tipuri de fișiere la R-Studio. De exemplu, dacă trebuie să găsiți fișiere de tip unic sau cele dezvoltate după ultima dată de lansare a R-Studio, puteți adăuga propriile semnături la fișierele de tipuri cunoscute. Acest proces va fi discutat în continuare.

Fișiere personalizate de tipuri cunoscute
Semnăturile de fișiere personalizate ale tipurilor de fișiere cunoscute sunt stocate în fișier XML este specificat în caseta de dialog Setări. Adăugarea unei semnături constă din două părți:

  1. Determinarea semnăturii dosarului aflată la începutul dosarului și, dacă este prezentă, la sfârșitul dosarului.
  2. Generați un fișier XML care conține o semnătură de fișier și alte informații despre tipul fișierului.

Toate acestea se pot face folosind R-Studio. În același timp, nu trebuie să fii un expert în domeniul compunerii (editării) documentelor XML sau în domeniul editării hexazecimale - în acest ghid (articol), care se adresează utilizatorului însuși nivel de intrare, toate etapele acestui proces vor fi discutate în detaliu.

Exemplu: Adăugarea unei semnături pentru un fișier MP4 (XDCam-EX Codec)
Să ne uităm la adăugarea unei semnături de fișier folosind exemplul unui fișier .MP4 creat folosind Sony XDCAM-EX. Îl puteți folosi, de exemplu, în cazul deteriorării cardului SD pentru fișiere pe care încă nu ați reușit să le salvați pe hard diskul computerului.

Prima etapă: determinarea semnăturii fișierului
Pentru a determina semnătura fișierului, luați în considerare exemple de fișiere de același format.

Să fie acestea patru fișiere video de la Sony XDCAM-EX:
ZRV-3364_01.MP4
ZRV-3365_01.MP4
ZRV-3366_01.MP4
ZRV-3367_01.MP4

Pentru ușurință în considerare, lăsați-le să fie fișiere mici. Fișierele mai mari sunt mai dificil de vizualizat în hexazecimal.

1. Deschideți fișierele în R-Studio. Pentru a face acest lucru, faceți clic dreapta pe fiecare fișier și selectați Vizualizare/Editare din meniul contextual.

2. Să comparăm fișierele. Vom căuta același model găsit în toate cele patru fișiere. El va apărea semnătura fișierului. De obicei, semnăturile fișierului se găsesc la începutul fișierului, dar uneori la sfârșit.

3. Definiți semnătura fișierului la începutul fișierului. În exemplul nostru, este situat chiar la începutul fișierului. Rețineți că acest lucru nu se întâmplă întotdeauna - adesea semnătura fișierului este la începutul fișierului, dar nu la prima linie (offset).

Din imaginile de mai jos, se pare că conținutul tuturor celor patru fișiere este diferit, dar toate încep cu aceeași semnătură de fișier.


Click pe imagine pentru a o mari


Click pe imagine pentru a o mari


Click pe imagine pentru a o mari


Click pe imagine pentru a o mari

Zona evidențiată din imagini este o semnătură de fișier de acest tip fișiere. Este prezentat atât în ​​format text, cât și în format hexazecimal.

Sub formă de text, semnătura fișierului arată astfel:
....ftypmp42....mp42........gratuit

Punctele (“.”) indică caractere care nu pot fi reprezentate sub formă de text. Prin urmare, este, de asemenea, necesar să furnizați forma hexazecimală a semnăturii fișierului:
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. În același mod, definim semnătura fișierului, dar chiar la sfârșitul fișierului. Poate fi o semnătură de fișier diferită, o lungime diferită.

Imaginile de mai jos evidențiază semnătura fișierului la sfârșitul fișierului:


Click pe imagine pentru a o mari


Click pe imagine pentru a o mari


Click pe imagine pentru a o mari


Click pe imagine pentru a o mari

Vă rugăm să rețineți că datele dinaintea zonei selectate (semnătura fișierului) sunt aceleași în toate cele patru fișiere. Acestea sunt informații tehnice care nu reprezintă o semnătură de fișier, dar indică faptul că toate cele patru fotografii (fișiere) au fost realizate folosind aceeași cameră cu aceiași parametri. De obicei, este posibil să se distingă modelele de potrivire cu informații tehnice dintr-o semnătură de fișier. În exemplul nostru, în ultima linie înainte de începerea semnăturii fișierului, vedem textul „RecordingMode type=”normal”’, care indică clar că acesta este un fel de parametru de fișier și nu o semnătură. Acordați întotdeauna o atenție deosebită acestei linii pentru a nu include în mod greșit informații tehnice parte a semnăturii dosarului.

În cazul nostru, semnătura fișierului este următorul text:
...
Să vă reamintim că punctele indică caractere care nu pot fi reprezentate sub formă de text.

În hexazecimal, semnătura fișierului arată astfel:
3N 2F 4E 6F 6E 52 65 61 6N 54 69 6A 65 4A 65 74 61 3E 0D 0A 00
Vă rugăm să rețineți: semnătura nu va fi întotdeauna la sfârșitul dosarului.

A doua etapă: Crearea unui fișier XML care descrie un tip de fișier cunoscut
Acum, după ce ați definit semnătura fișierului, puteți crea un fișier XML și puteți include tipul de fișier corespunzător în R-Studio. Acest lucru se poate face în două moduri:

2.1 Utilizarea încorporate editor grafic semnaturi fisiere:
Selectați elementul Setări din meniul Instrumente, în caseta de dialog Setări care se deschide, faceți clic pe fila Tipuri de fișiere cunoscute și apoi faceți clic pe butonul Editați tipurile de fișiere ale utilizatorului.

Click pe imagine pentru a o mari

Faceți clic pe butonul Creare tip de fișier din caseta de dialog Editați tipurile de fișiere ale utilizatorului.
Setați următoarele opțiuni:

  • Id - un identificator digital unic. Acest număr vor fi alese aleatoriu; Singurul lucru este că nu ar trebui să se potrivească cu identificatorul digital al oricărui alt tip de fișier.
  • Descriere grup - grupul în care fișierele găsite vor fi localizate în R-Studio. Puteți seta oricare grup nou, sau alegeți unul dintre cele care există deja. Pentru noi acesta va fi grupul „Multimedia Video (Multimedia: Video)”.
  • Descriere - scurta descriere tip fișier. În exemplul nostru, puteți utiliza, de exemplu, „Sony cam video, XDCam-EX”.
  • Extensie - extensie a fișierelor de acest tip. În cazul nostru - mp4.

Parametrul Features este opțional, în cazul nostru nu este nevoie să-l folosim.

Click pe imagine pentru a o mari

Apoi, trebuie să introduceți semnătura fișierului de început și de sfârșit. Pentru a face acest lucru, selectați Începeți și apoi meniul contextual comanda Adăugare semnătură.

Click pe imagine pentru a o mari

Apoi faceți dublu clic pe câmp<пустая сигнатура> () și introduceți textul corespunzător.

Click pe imagine pentru a o mari

Apoi creați semnătura finală a fișierului. Asigurați-vă că introduceți 21 în coloana De la.

Click pe imagine pentru a o mari

Ați creat cu succes propria semnătură pentru tipurile de fișiere cunoscute.

Acum trebuie să-l salvezi. Există două moduri: îl puteți salva în fișierul implicit specificat în fila Principală a casetei de dialog Setări făcând clic pe butonul Salvare. Sau faceți clic pe butonul Salvare ca... și salvați semnătura într-un alt fișier.

2.2 Crearea manuală a unui fișier XML care descrie un tip de fișier cunoscut:
Pentru a crea acest fișier Să folosim XML versiunea 1.0 și codificarea UTF-8. Nu disperați dacă nu știți ce este - deschideți oricare editor de text(de exemplu, Notepad.exe) și introduceți următorul text pe prima linie:

În continuare vom crea o etichetă XML care definește tipul fișierului (FileType). Luând în considerare atributele XML descrise anterior, eticheta va arăta astfel:

Să-l introducem imediat după

În continuare, definim semnătura fișierului (tag ). Semnătura inițială (la începutul fișierului) va fi în interiorul etichetei fara nici un atribut. Folosim tipul text al semnăturii, dar în același timp înlocuind caracterele hexazecimale care nu pot fi reprezentate sub formă de text. Înainte de fiecare caracter hexazecimal inserăm „\x” Astfel eticheta cu o semnătură de fișier va arăta astfel:

Dacă este prezentă, trebuie să definiți și semnătura finală (la sfârșitul fișierului). Aceasta folosește aceeași etichetă, dar cu un element „de la” și un atribut „sfârșit”. Va arata asa:

Rețineți că semnătura finală a fișierului nu conținea caractere non-text, dar conținea bare oblice și paranteze triunghiulare. Pentru a evita confuzia și erorile în sintaxa XML, vom înlocui caracterele „/”, „ din semnătură<" и ">„valorile lor hexazecimale.

La sfârșit, după semnăturile fișierului, trebuie să existe etichete de închidere FileType și FileTypeList:

Deci întregul fișier ar trebui să arate astfel:


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

Rețineți: sintaxa XML ține cont de majuscule și minuscule, deci eticheta corectă ar fi , dar nu .

Să salvăm fișierul în format text cu extensia .xml. De exemplu: SonyCam.xml.

Am creat cu succes propria noastră semnătură pentru tipurile de fișiere cunoscute. Acest exemplu este suficient pentru a înțelege principiile de bază ale creării unui tip de fișier personalizat. Utilizatorii mai experimentați pot folosi XML versiunea 2.0. Puteți citi mai multe despre acest lucru în secțiunea Ajutor online R-Studio.

Pasul 3: Verificarea și adăugarea unui fișier care descrie un tip de fișier cunoscut
Următorul pas este să adăugați (încărcați) fișierul dvs. XML în R-Studio. În acest caz, va fi verificat automat.

Să încărcăm fișierul XML creat în etapa anterioară în R-Studio. Pentru a face acest lucru, selectați elementul Setări din meniul Instrumente. În zona Tipuri de fișiere ale utilizatorului din fila Principală a casetei de dialog Setări, adăugați fișierul XML creat de noi (SonyCam.xml). Faceți clic pe butonul Aplicați.

Click pe imagine pentru a o mari

2. Răspundeți Da la cererea de descărcare a unui nou tip de fișier.

Click pe imagine pentru a o mari

3. Pentru a verifica dacă tipul de fișier a fost încărcat cu succes, faceți clic pe fila Tipuri de fișiere cunoscute din caseta de dialog Setări. Rețineți că am adăugat tipul de fișier în grupul Multimedia Video (Multimedia: Video). După ce am extins acest grup (dosar), ar trebui să vedem un element cu descrierea pe care am specificat-o la crearea fișierului XML: Sony cam video, XDCam-EX (.mp4).

Click pe imagine pentru a o mari


Click pe imagine pentru a o mari

Dacă există erori în sintaxa fișierului, veți vedea un mesaj corespunzător:

Click pe imagine pentru a o mari

În acest caz, verificați din nou fișierul XML pentru erori. Rețineți: sintaxa XML ține cont de majuscule și minuscule și fiecare etichetă trebuie să aibă o etichetă de închidere la sfârșit.

Pasul 4: Testarea fișierului care descrie un tip de fișier cunoscut
Pentru a verifica corectitudinea tipului de fișier personalizat pe care l-am creat, să încercăm să găsim fișierele noastre .mp4 pe o unitate flash USB amovibilă.

1. În Windows Vista sau Windows 7, efectuați o formatare completă (nu rapidă) a discului sau utilizați un utilitar de curățare a spațiului pe disc (de exemplu, R-Wipe & Clean) pentru îndepărtarea completă toate datele disponibile pe disc. Lăsa disc USB formatat în FAT32 (dimensiunea fișierelor căutate nu depășește 2 GB).

2. Să-l copiem fișiere de testare pe disc și reporniți computerul, astfel încât conținutul memoriei cache să fie salvat pe disc. De asemenea, puteți dezactiva unitate externăși apoi conectați-l din nou.

3. În sistemul de operare, unitatea va fi definită ca, de exemplu, unitatea logică F:\.

4. Să lansăm R-Studio. Selectați unitatea noastră (F:\) și faceți clic pe butonul Scanare

Click pe imagine pentru a o mari

5. În caseta de dialog Scanare, în zona (Sistem de fișiere), faceți clic pe butonul Modificare... și debifați toate casetele. În acest fel, vom dezactiva căutarea sistemelor de fișiere și a fișierelor folosind tabelul de partiții.
Click pe imagine pentru a o mari

6. Bifați caseta de selectare Căutare suplimentară pentru tipuri de fișiere cunoscute. Acest lucru va permite R-Studio să caute tipuri de fișiere cunoscute atunci când scanează.

7. Pentru a începe scanarea, faceți clic pe butonul Scanare.

8. Să așteptăm până când R-Studio scanează discul. Fila Informații scanare va afișa progresul (progresul) scanării.


Click pe imagine pentru a o mari

9. După finalizarea scanării, selectați elementul Fișiere găsite suplimentare și faceți dublu clic pe el.


Click pe imagine pentru a o mari

10. Fișierele noastre de testare vor fi localizate în folderul Sony cam video, XDCam-EX (sau într-un folder cu alt nume corespunzător descrierii tipului de fișier specificat în a doua etapă).


Click pe imagine pentru a o mari

Vedeți că numele fișierelor, datele și locațiile (dosarele) nu au fost restaurate deoarece aceasta informatie stocate în sistemul de fișiere. Prin urmare, R-Studio va afișa automat fiecare fișier cu un nume nou.

Cu toate acestea, este clar că conținutul fișierelor nu este deteriorat. Pentru a verifica acest lucru, să le deschidem în programul corespunzător, de exemplu VLC media player.


Click pe imagine pentru a o mari

Concluzie
Capacitatea R-Studio de a scana după tipuri de fișiere cunoscute vă permite să recuperați date chiar și de pe un disc ale cărui sisteme de fișiere au fost fie suprascrise. Puteți căuta fișiere destul de eficient folosind semnăturile acestora, ceea ce este util mai ales dacă cunoașteți exact tipul de fișiere care sunt restaurate, ca în exemplul nostru. Capacitatea de a crea tipuri de fișiere personalizate vă permite să adăugați orice fișier care are o anumită semnătură de fișier la lista de tipuri de fișiere cunoscute.

Mulți au auzit de fișiere precum rarjpeg. Acesta este un tip special de fișier, care este o imagine jpeg și o arhivă rar lipite strâns împreună. Este un container excelent pentru a ascunde faptul de a transmite informații. Puteți crea un rarjpeg folosind următoarele comenzi:

UNIX: pisica imagine1.jpg arhiva.rar > imagine2.jpg
WINDOWS: copie /b imagine1.jpg+arhivă.rar imagine2.jpg

Sau dacă aveți un editor hexadecimal.

Desigur, pentru a ascunde faptul de a transmite informații, puteți folosi nu numai formatul JPEG, ci și multe altele. Fiecare format are propriile sale caracteristici, datorită cărora poate fi sau nu potrivit pentru rolul de container. Voi descrie cum puteți găsi fișiere lipite în cele mai populare formate sau vă voi indica faptul de a lipi.

Metodele de detectare a fișierelor îmbinate pot fi împărțite în trei grupuri:

  1. Metodă de verificare a zonei după markerul EOF. Multe formate de fișiere populare au așa-numitul marcator de sfârșit de fișier, care este responsabil pentru afișarea datelor dorite. De exemplu, vizualizatorii de fotografii citesc toți octeții până la acest marcator, dar zona de după acesta este ignorată. Această metodă este ideală pentru următoarele formate: JPEG, PNG, GIF, ZIP, RAR, PDF.
  2. Metoda de verificare a dimensiunii fișierului. Structura unor formate (containere audio și video) vă permite să calculați dimensiunea reală a fișierului și să o comparați cu dimensiunea originală. Formate: AVI, WAV, MP4, MOV.
  3. Metodă de verificare a fișierelor CFB. CFB sau Compound File Binary Format este un format de document dezvoltat de Microsoft, care este un container cu propriul sistem de fișiere. Această metodă se bazează pe detectarea anomaliilor dintr-un fișier.

Există viață după încheierea unui dosar?

JPEG

Pentru a găsi răspunsul la această întrebare, este necesar să vă aprofundați în specificațiile formatului, care este „strămoșul” fișierelor îmbinate și să înțelegeți structura acestuia. Orice JPEG începe cu semnătura 0xFF 0xD8.

După această semnătură există informații de serviciu, opțional o pictogramă de imagine și, în final, imaginea comprimată în sine. În acest format, sfârșitul imaginii este marcat cu o semnătură de doi octeți 0xFF 0xD9.

PNG

Primii opt octeți ai fișierului PNG sunt ocupați de următoarea semnătură: 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A. Semnătură de sfârșit care încheie fluxul de date: 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82.

RAR

Semnătură comună pentru toate arhivele rar: 0x52 0x61 0x72 0x21 (Rar!). După aceasta, vin informații despre versiunea de arhivă și alte date conexe. S-a determinat experimental că arhiva se termină cu semnătura 0x0A, 0x25, 0x25, 0x45, 0x4F, 0x46.

Tabel de formate și semnăturile acestora:
Algoritmul pentru verificarea lipirii în aceste formate este extrem de simplu:

  1. Găsiți semnătura inițială;
  2. Găsiți semnătura finală;
  3. Dacă nu există date după semnătura finală, fișierul dvs. este curat și nu conține atașamente! În caz contrar, este necesar să se caute alte formate după semnătura finală.

GIF și PDF

Un document PDF poate avea mai mult de un marcator EOF, de exemplu din cauza generării incorecte a documentului. Numărul de semnături finale dintr-un fișier GIF este egal cu numărul de cadre din acesta. Pe baza caracteristicilor acestor formate, este posibilă îmbunătățirea algoritmului de verificare a prezenței fișierelor atașate.
  1. Punctul 1 se repetă de la algoritmul anterior.
  2. Punctul 2 se repetă de la algoritmul anterior.
  3. Când găsiți semnătura finală, amintiți-vă locația acesteia și căutați mai departe;
  4. Dacă ajungeți la ultimul marker EOF în acest fel, fișierul este curat.
  5. Dacă fișierul nu se termină cu o semnătură de final, goto este locația ultimei semnături de final găsite.
O diferență mare între dimensiunea fișierului și poziția după ultima semnătură de final indică prezența unui atașament lipicios. Diferența poate fi mai mare de zece octeți, deși pot fi setate alte valori.

ZIP

Particularitatea arhivelor ZIP este prezența a trei semnături diferite: Structura arhivei este următoarea:
Antetul fișierului local 1
Datele fișierului 1
Descriptor de date 1
Antetul fișierului local 2
Datele fișierului 2
Descriptor de date 2
...
Antetul fișierului local
Date dosar n
Descriptor de date n
Antetul de decriptare a arhivei
Arhivați înregistrarea de date suplimentare
Directorul central
Cel mai interesant este directorul central, care conține metadate despre fișierele din arhivă. Directorul central începe întotdeauna cu semnătura 0x50 0x4b 0x01 0x02 și se termină cu semnătura 0x50 0x4b 0x05 0x06, urmată de 18 octeți de metadate. Interesant este că arhivele goale constau doar din semnătura finală și 18 zero octeți. După 18 octeți apare zona de comentarii de arhivă, care este un container ideal pentru ascunderea fișierului.

Pentru a verifica o arhivă ZIP, trebuie să găsiți semnătura finală a directorului central, să omiteți 18 octeți și să căutați semnături de formate cunoscute în zona de comentarii. Marime mare Comentariul indică și faptul de lipire.

Mărimea contează

AVI

Structura unui fișier AVI este următoarea: fiecare fișier începe cu o semnătură RIFF (0x52 0x49 0x46 0x46). Pe octetul 8 există o semnătură AVI care specifică formatul (0x41 0x56 0x49 0x20). Blocul de la offset 4, format din 4 octeți, conține dimensiunea inițială a blocului de date (ordinea octetilor - little endian). Pentru a afla numărul blocului care conține următoarea dimensiune, trebuie să adăugați dimensiunea antetului (8 octeți) și dimensiunea obținută în blocul de 4-8 octeți. Aceasta calculează dimensiunea totală a fișierului. Este acceptabil ca dimensiunea calculată să fie mai mică decât dimensiunea reală a fișierului. După dimensiunea calculată, fișierul va conține doar zero octeți (necesar pentru a alinia limita de 1 Kb).

Exemplu de calcul al mărimii:


WAV

La fel ca AVI, un fișier WAV începe cu o semnătură RIFF, totuși, acest fișier are o semnătură de la octetul 8 - WAVE (0x57 0x41 0x56 0x45). Dimensiunea fișierului este calculată în același mod ca și AVI. Mărimea reală trebuie să se potrivească complet cu cea calculată.

MP4

MP4 sau MPEG-4 este un format de container media folosit pentru a stoca fluxuri video și audio, oferind și stocarea de subtitrări și imagini.
La offset de 4 octeți există semnături: tip fișier ftyp (66 74 79 70) (QuickTime Container File Type) și subtip fișier mmp4 (6D 6D 70 34). Pentru recunoaștere fișiere ascunse, ne interesează capacitatea de a calcula dimensiunea fișierului.

Să ne uităm la un exemplu. Dimensiunea primului bloc este la offset zero și este de 28 (00 00 00 1C, ordinea octetilor Big Endian); indică, de asemenea, offset-ul în care se află dimensiunea celui de-al doilea bloc de date. La offset 28 găsim următoarea dimensiune a blocului egală cu 8 (00 00 00 08). Pentru a găsi următoarea dimensiune a blocului, trebuie să adăugați dimensiunile blocurilor anterioare găsite. Astfel, se calculează dimensiunea fișierului:

MOV

Acest format utilizat pe scară largă este și un container MPEG-4. MOV folosește un algoritm de comprimare a datelor proprietar, are o structură similară cu MP4 și este folosit în aceleași scopuri - pentru stocarea datelor audio și video, precum și a materialelor conexe.
Ca și MP4, orice fișier mov are o semnătură ftyp de 4 octeți la offset 4, totuși, următoarea semnătură are valoarea qt__ (71 74 20 20). Regula pentru calcularea dimensiunii fișierului nu s-a schimbat: începând de la începutul fișierului, calculăm dimensiunea blocului următor și o adunăm.

Metoda de verificare a acestui grup de formate pentru prezența fișierelor „lipicioase” este de a calcula dimensiunea conform regulilor specificate mai sus și de a o compara cu dimensiunea fișierului verificat. Dacă dimensiunea actuală a fișierului este mult mai mică decât cea calculată, atunci acest lucru indică faptul de lipire. La verificarea fișierelor AVI, se acceptă că dimensiunea calculată poate fi mai mică decât dimensiunea fișierului din cauza prezenței zerourilor adăugate pentru a alinia chenarul. În acest caz, este necesar să verificați zerouri după dimensiunea fișierului calculată.

Verificarea formatului binar al fișierului compus

Acest format de fișier, dezvoltat de Microsoft, este cunoscut și ca OLE (Object Linking and Embedding) sau COM (Component Object Model). Fișierele DOC, XLS, PPT aparțin grupului de formate CFB.

Un fișier CFB constă dintr-un antet de 512 de octeți și sectoare de lungime egală care stochează fluxuri de date sau informații despre servicii. Fiecare sector are propriul său număr nenegativ, cu excepția numerelor speciale: „-1” - numerotează sectorul liber, „-2” - numerotează sectorul care închide lanțul. Toate lanțurile de sectoare sunt definite în tabelul FAT.

Să presupunem că un atacator a modificat un anumit fișier .doc și a lipit un alt fișier la sfârșitul acestuia. Sunt cateva în diverse moduri detectează-l sau indică o anomalie în document.

Dimensiune anormală a fișierului

După cum am menționat mai sus, orice fișier CFB constă dintr-un antet și sectoare de lungime egală. Pentru a afla dimensiunea sectorului, trebuie să citiți un număr de doi octeți la offset 30 de la începutul fișierului și să ridicați 2 la puterea acestui număr. Acest număr trebuie să fie egal fie cu 9 (0x0009), fie cu 12 (0x000C), dimensiunea sectorului de fișier este de 512 sau 4096 de octeți. După ce ați găsit sectorul, trebuie să verificați următoarea egalitate:

(FileSize - 512) mod SectorSize = 0

Dacă această egalitate nu este satisfăcută, atunci puteți sublinia faptul că lipiți fișierele. Cu toate acestea, această metodă are un dezavantaj semnificativ. Dacă un atacator știe dimensiunea sectorului, atunci trebuie doar să-și lipească fișierul și alți n octeți, astfel încât dimensiunea datelor lipite să fie un multiplu al mărimii sectorului.

Tip de sector necunoscut

Dacă atacatorul știe despre o metodă de a ocoli verificarea anterioară, atunci aceasta metoda poate detecta prezența sectoarelor cu tipuri nedefinite.

Să definim egalitatea:

FileSize = 512 + CountReal * SectorSize, unde FileSize este dimensiunea fișierului, SectorSize este dimensiunea sectorului, CountReal este numărul de sectoare.

De asemenea, definim următoarele variabile:

  1. CountFat – numărul de sectoare FAT. Situat la offset 44 de la începutul fișierului (4 octeți);
  2. CountMiniFAT – numărul de sectoare MiniFAT. Situat la offset 64 de la începutul fișierului (4 octeți);
  3. CountDIFAT – numărul de sectoare DIFAT. Situat la offset 72 de la începutul fișierului (4 octeți);
  4. CountDE – numărul de sectoare de intrare în director. Pentru a găsi această variabilă, trebuie să găsiți primul sector DE, care se află la offset 48. Apoi este necesar să obțineți o reprezentare completă a DE din FAT și să numărați numărul de sectoare DE;
  5. CountStreams – numărul de sectoare cu fluxuri de date;
  6. CountFree – numărul de sectoare libere;
  7. CountClassified – numărul de sectoare cu un anumit tip;
CountClassified = CountFAT + CountMiniFAT + CountDIFAT + CountDE + CountStreams + CountFree

Evident, dacă CountClassified și CountReal sunt inegale, putem concluziona că fișierele pot fi îmbinate.

Șeful meu mi-a dat o sarcină destul de interesantă. În scurt timp, scrieți un analizor de fișiere executabile care ar putea găsi corpuri de viruși pe baza semnăturilor și să determine pachetul/criptorul utilizat. Prototipul finit a apărut în câteva ore.

Cuvântul autorului

Analiza semnăturii

Căutarea unui obiect rău intenționat folosind semnături este ceva ce poate face orice antivirus. În general, o semnătură este o descriere oficială a anumitor caracteristici prin care se poate determina că fișierul scanat este un virus și un virus bine definit.

Există diverse tehnici aici. O alternativă este utilizarea unei semnături formată din N octeți ai unui obiect rău intenționat. În acest caz, nu puteți face o comparație stupidă, ci o comparație folosind o mască (cum ar fi căutarea octeților EB ?? ?? CD 13). Sau setați condiții suplimentare precum „un astfel de octeți trebuie să fie la punctul de intrare în program” și așa mai departe. Semnătura malware-ului este o problemă specială.

În același mod, sunt descrise câteva semne prin care se poate determina că fișierul executabil este împachetat cu unul sau altul criptor sau packer (de exemplu, banalul ASPack). Dacă ați citit cu atenție revista noastră, atunci cu siguranță ați auzit despre un astfel de instrument precum PEiD, care este capabil să identifice cei mai des utilizați pachete, criptografii și compilatori (baza de date are un număr mare de semnături) pentru fișierul PE transferat către acesta. . Din păcate, noi versiuni ale programului nu au fost lansate de mult timp, iar recent a apărut un mesaj pe site-ul oficial că proiectul nu va mai avea o dezvoltare ulterioară. Păcat, pentru că capabilitățile PEiD (în special având în vedere sistemul de pluginuri) ar putea foarte bine să-mi fie de folos. După o scurtă analiză, a devenit clar că aceasta nu era o opțiune. Dar după ce am căutat prin bloguri în limba engleză, am găsit rapid ceea ce mi se potrivea. Proiectul YARA (code.google.com/p/yara-project).

Ce este YARA?

De la bun început, am fost convins că undeva pe Internet exista deja o dezvoltare open source care să-și asume sarcina de a determina corespondența dintre o anumită semnătură și fișierul examinat. Dacă aș putea găsi un astfel de proiect, atunci ar putea fi ușor pus pe șinele unei aplicații web, să adaug acolo diferite semnături și să obțin ceea ce mi se cere. Planul a început să pară și mai realist când am citit descrierea proiectului YARA.

Dezvoltatorii înșiși îl poziționează ca un instrument pentru a ajuta cercetătorii de programe malware să identifice și să clasifice mostrele rău intenționate. Cercetatorul poate crea descrieri pentru tipuri diferite malware care utilizează text sau modele binare care descriu caracteristicile oficializate ale programelor malware. Așa se obțin semnăturile. De fapt, fiecare descriere constă dintr-un set de linii și o expresie logică, pe baza cărora se determină logica de declanșare a analizorului.

Dacă sunt îndeplinite condițiile uneia dintre reguli pentru dosarul examinat, se determină în consecință (de exemplu, un vierme cutare sau cutare). Un exemplu simplu de regulă pentru a înțelege despre ce vorbim:

regula silent_banker: bancher
{
meta:
description = "Acesta este doar un exemplu"
thread_level = 3
in_the_wild = adevărat
siruri de caractere:
$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"
condiție:
$a sau $b sau $c
}

În această regulă îi spunem lui YARA că orice fișier care conține cel puțin unul dintre șirurile eșantion descrise în variabilele $a, $b, $c ar trebui să fie clasificat ca troian silent_banker. Și aceasta este o regulă foarte simplă. În realitate, regulile pot fi mult mai complexe (vom vorbi despre asta mai jos).
Chiar și lista proiectelor care îl folosesc vorbește despre autoritatea proiectului YARA și aceasta este:

  • VirusTotal Malware Intelligence Services (vt-mis.com);
  • jsunpack-n (jsunpack.jeek.org);
  • Vă urmărim site-ul web (wewatchyourwebsite.com).

Tot codul este scris în Python, iar utilizatorului i se oferă atât modulul în sine pentru a fi utilizat în dezvoltarea lor, cât și pur și simplu un fișier executabil pentru a utiliza YARA ca aplicație autonomă. Ca parte a muncii mele, am ales prima opțiune, dar pentru simplitate în acest articol vom folosi pur și simplu analizorul ca aplicație de consolă.

După câteva săpături, mi-am dat seama rapid cum să scriu reguli pentru YARA, precum și cum să atașez semnături de viruși din programul gratuit și pachetele de la PEiD. Dar vom începe cu instalarea.

Instalare

După cum am spus deja, proiectul este scris în Python, deci poate fi instalat cu ușurință pe Linux, Windows și Mac. La început, puteți doar să luați binarul. Dacă apelăm aplicația în consolă, vom obține regulile de lansare.

$yara
utilizare: yara ... ... FIȘIER | PID

Adică, formatul pentru apelarea programului este următorul: mai întâi există numele programului, apoi o listă de opțiuni, după care este indicat fișierul cu regulile, iar la sfârșit - numele fișierului fiind examinat (sau directorul care conține fișierele) sau identificatorul procesului. Acum aș dori să explic într-un mod bun cum sunt întocmite aceste reguli, dar nu vreau să vă împovărez imediat cu o teorie uscată. Prin urmare, vom face lucrurile diferit și vom împrumuta semnăturile altor persoane, astfel încât YARA să poată îndeplini una dintre sarcinile pe care le-am stabilit - o detectare cu drepturi depline a virușilor prin semnături.

Propriul tău antivirus

Cea mai importantă întrebare: de unde să obțineți baza de date cu semnături ale virușilor cunoscuți? Companiile de antivirus partajează în mod activ astfel de baze de date între ele (unele mai generos, altele mai puțin). Sincer să fiu, la început chiar m-am îndoit că undeva pe internet cineva ar posta în mod deschis astfel de lucruri. Dar, după cum sa dovedit, există oameni buni. O bază de date adecvată din popularul antivirus ClamAV este disponibilă tuturor (clamav.net/lang/en). În secțiunea „Ultima versiune stabilă” puteți găsi un link către ultima versiune produs antivirus, precum și linkuri pentru descărcarea bazelor de date cu viruși ClamAV. Vom fi interesați în primul rând de fișierele main.cvd (db.local.clamav.net/main.cvd) și daily.cvd (db.local.clamav.net/daily.cvd).

Prima conține baza de date principală de semnături, a doua conține cea mai completă bază de date acest moment bază cu diverse completări. Daily.cvd, care conține peste 100.000 de afișări de malware, este suficient în acest scop. Cu toate acestea, baza de date ClamAV nu este o bază de date YARA, așa că trebuie să o convertim în formatul dorit. Dar cum? La urma urmei, încă nu știm nimic despre formatul ClamAV sau despre formatul Yara. Această problemă a fost deja rezolvată înaintea noastră prin pregătirea unui mic script care convertește baza de date de semnături viruși ClamAV într-un set de reguli YARA. Scriptul se numește clamav_to_yara.py și este scris de Matthew Richard (bit.ly/ij5HVs). Descărcați scriptul și convertiți bazele de date:

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

Ca urmare, în fișierul clamav.yara vom primi o bază de date de semnături care va fi imediat gata de utilizare. Să încercăm acum combinația dintre YARA și baza de date ClamAV în acțiune. Scanarea unui folder folosind o semnătură se realizează cu o singură comandă:

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

Opțiunea -r specifică că scanarea trebuie efectuată recursiv în toate subfolderele din folderul curent. Dacă au existat corpuri de virus în folderul /pentest/msf3/data (cel puțin cele care se află în baza de date ClamAV), atunci YARA va raporta imediat acest lucru. În principiu, acesta este un scanner de semnături gata făcut. Pentru o mai mare comoditate, am scris un script simplu care a verificat actualizările bazei de date ClamAV, a descărcat noi semnături și le-a convertit în formatul YARA. Dar acestea sunt deja detalii. O parte a sarcinii este finalizată, acum puteți începe să elaborați reguli pentru identificarea packerilor/criptorilor. Dar ca să fac asta a trebuit să mă ocup puțin de ei.

Joacă după reguli

Deci, o regulă este mecanismul principal al unui program care vă permite să atribuiți un anumit fișier unei anumite categorii. Regulile sunt descrise într-un fișier (sau fișiere) separat și în aparență sunt foarte asemănătoare cu construcția struct() din limbajul C/C++.

guvernează BadBoy
{
siruri de caractere:
$a = "win.exe"
$b = "http://foo.com/badfi le1.exe"
$c = "http://bar.com/badfi le2.exe"
condiție:
$a și ($b sau $c)
}

În principiu, nu este nimic complicat în scrierea regulilor. În acest articol, am atins doar punctele principale, iar detaliile le veți găsi în manual. Deocamdată, cele mai importante zece puncte:

1. Fiecare regulă începe cu regula de cuvinte cheie, urmată de identificatorul regulii. Identificatorii pot avea aceleași nume ca și variabilele din C/C++, adică pot consta din litere și cifre, iar primul caracter nu poate fi un număr. Lungime maxima nume de identificare - 128 de caractere.

2. De obicei, regulile constau din două secțiuni: o secțiune de definiție (șiruri) și o secțiune de condiție (condiție). Secțiunea de șiruri specifică date pe baza cărora secțiunea de condiții va decide dacă un anumit fișier îndeplinește anumite condiții.

3. Fiecare linie din secțiunea șiruri de caractere are propriul său identificator, care începe cu semnul $ - în general, ca o declarație de variabilă în PHP. YARA acceptă șiruri obișnuite închise în ghilimele duble("") și șiruri hexazecimale incluse în bretele(()), precum și expresii regulate:

$my_text_string = "text aici"
$my_hex_string = ( E2 34 A1 C8 23 FB )

4. Secțiunea de condiții conține toată logica regulii. Această secțiune trebuie să conțină o expresie booleană care determină când un fișier sau un proces se potrivește cu regula. De obicei, această secțiune se referă la liniile declarate anterior. Iar identificatorul șirului este tratat ca o variabilă booleană care returnează adevărat dacă șirul a fost găsit în fișierul sau memoria procesului și fals în caz contrar. Regula de mai sus specifică faptul că fișierele și procesele care conțin șirul win.exe și una dintre cele două adrese URL ar trebui clasificate ca BadBoy (după numele regulii).

5. Șirurile hexazecimale permit trei constructe care le fac mai flexibile: wildcards, salturi și alternative. Substituțiile sunt locuri dintr-un șir care sunt necunoscute și pot fi înlocuite cu orice valoare. Ele sunt indicate prin simbolul „?”:

$hex_string = ( E2 34 ?? C8 A? FB )

Această abordare este foarte convenabilă atunci când se specifică șiruri a căror lungime este cunoscută, dar conținutul poate varia. Dacă o parte a unui șir poate avea lungimi diferite, este convenabil să folosiți intervale:

$hex_string = ( F4 23 62 B4 )

Această intrare înseamnă că în mijlocul liniei pot exista de la 4 până la 6 octeți diferiți. De asemenea, puteți implementa o alegere alternativă:

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

Aceasta înseamnă că în locul celui de-al treilea octet poate fi 62 B4 sau 56, o astfel de intrare corespunde liniilor F42362B445 sau F4235645.

6. Pentru a verifica dacă un șir dat se află la un anumit decalaj într-un spațiu de adresă de fișier sau proces, se folosește operatorul at:

$a la 100 și $b la 200

Dacă șirul poate fi într-un anumit interval de adrese, se folosește operatorul in:

$a în (0..100) și $b în (100..fi lesize)

Uneori apar situații când trebuie să specificați că un fișier trebuie să conțină un anumit număr dintr-un anumit set. Acest lucru se face folosind operatorul of:

regula Exemplului1
{
siruri de caractere:
$foo1 = "fachin1"
$foo2 = "fachin2"
$foo3 = "fachin3"
condiție:
2 din ($foo1,$foo2,$foo3)
}

Regula de mai sus cere ca fișierul să conțină oricare două linii din set ($foo1,$foo2,$foo3). În loc să specificați un anumit număr de linii în fișier, puteți utiliza variabilele any (cel puțin o linie dintr-un anumit set) și all (toate liniile dintr-un anumit set).

7. Ei bine, ultima posibilitate interesantă care trebuie luată în considerare este aplicarea unei singure condiții pentru mai multe rânduri. Această caracteristică este foarte asemănătoare cu operatorul of, doar mai puternic este operatorul for..of:

pentru expresia string_set: (expresie_booleană)

Această intrare ar trebui să fie citită astfel: dintre șirurile specificate în setul șir_, cel puțin bucățile de expresie trebuie să satisfacă condiția boolean_expression. Sau, cu alte cuvinte: expresia_booleană este evaluată pentru fiecare șir din setul de șiruri, iar expresiile din acestea trebuie să returneze True. În continuare ne vom uita la această construcție folosind un exemplu specific.

Realizarea PEiD

Așadar, când totul a devenit mai mult sau mai puțin clar cu regulile, putem începe să implementăm un detector de ambalatori și criptori în proiectul nostru. La început, ca material sursă, am împrumutat semnăturile unor ambalatori cunoscuți de la același PEiD. În folderul de pluginuri există un fișier userdb.txt, care conține ceea ce avem nevoie. În baza mea de date erau 1850 de semnături.

Destul de multe, așa că pentru a le importa pe deplin, vă sfătuiesc să scrieți un fel de script. Formatul acestei baze de date este simplu - se folosește cel obișnuit fisier text, care stochează înregistrări precum:


semnatura = 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 = adevărat

Prima linie specifică numele packerului, care va fi afișat în PEiD, dar pentru noi va fi identificatorul regulii. A doua este semnătura în sine. Al treilea este indicatorul ep_only, care indică dacă se caută o linie dată numai la adresa punctului de intrare sau în întregul fișier.

Ei bine, să încercăm să creăm o regulă, să zicem, pentru ASPack? După cum se dovedește, nu este nimic complicat în acest sens. Mai întâi, să creăm un fișier pentru a stoca regulile și să-l numim, de exemplu, packers.yara. Apoi căutăm în baza de date PEiD toate semnăturile care includ ASPack în numele lor și le transferăm la regula:

regula ASPack
{
siruri de caractere:
$ = ( 60 E8 ?? ?? ?? ?? ?? 5D 81 ED ?? ?? (43 | 44) ?? B8 ?? ?? ?? (43 | 44) ?? 03 C5 )
$ = ( 60 EB ?? 5D EB ?? FF ?? ?? ?? ?? ?? ?? E9 )
[.. a tăia..]
$ = ( 60 E8 03 00 00 00 E9 EB 04 5D 45 55 C3 E8 01 )
condiție:
pentru oricare dintre ele: ($la punctul de intrare)
}

Toate înregistrările găsite au marcajul ep_only setat la adevărat, adică aceste linii trebuie să fie localizate la adresa punctului de intrare. Prin urmare, scriem următoarea condiție: „pentru oricare dintre ele: ($la punctul de intrare)”.

Astfel, prezența a cel puțin uneia dintre liniile date la adresa punctului de intrare va însemna că fișierul este împachetat cu ASPack. Vă rugăm să rețineți că în această regulă toate liniile sunt specificate pur și simplu folosind semnul $, fără un identificator. Acest lucru este posibil deoarece în secțiunea de stare nu accesăm niciunul anume, ci folosim întregul set.

Pentru a verifica funcționalitatea sistemului rezultat, rulați comanda în consolă:

$ yara -r packers.yara somefi le.exe

După ce am alimentat acolo câteva aplicații ambalate cu ASPack, am fost convins că totul a funcționat!

Prototip gata

YARA s-a dovedit a fi un instrument extrem de clar și transparent. Nu mi-a fost dificil să scriu un webadmin pentru el și să-l configurez să funcționeze ca un serviciu web. Cu puțină creativitate, rezultatele uscate ale analizorului sunt deja colorate în culori diferite, indicând gradul de pericol al malware-ului detectat. O mică actualizare a bazei de date și pentru mulți dintre criptori este disponibilă o scurtă descriere și uneori chiar instrucțiuni de despachetare. Prototipul a fost creat și funcționează perfect, iar șefii dansează de încântare!

Codul funcției (FC) din antetul telegramei identifică tipul de telegramă, cum ar fi Telegrama de solicitare (Solicitare sau Trimitere/Solicitare) și Telegrama de confirmare sau de răspuns (Cadru de confirmare, Cadru de răspuns). În plus, codul funcției conține funcția de transmisie reală și informațiile de control care împiedică pierderea și duplicarea mesajelor sau tipul stației cu stare FDL.

7 6 5 4 3 2 1 0 FC: Solicitare cod funcție
1 Solicitați Telegramă
X FCV = Bit alternativ activat
X href="http://profibus.felser.ch/en/funktionscode.htm#aufruffolgebit”>FCB = Bit alternant (din numărul de cadre)
1 0 (0x0) CV = Valoarea ceasului ()
1 alte Rezervat
0 0 (0x0) TE = Time Event (sincronizare ceas)
0 3 (0x3) SDA_LOW = Trimitere date confirmate - prioritate scăzută
0 4 (0x4) SDN_LOW = Trimitere date neconfirmate - prioritate scăzută
0 5 (0x5) SDA_HIGH = Trimitere date confirmate - prioritate mare
0 6 (0x6) SDN_HIGH = Trimitere date neconfirmate
0 7 (0x7) MSRD = Trimiteți date de solicitare cu răspuns multicast
0 9 (0x9) Solicitați starea FDL
0 12(0xC) SRD scăzut = Trimiteți și solicitați date
0 13(0xD) SRD ridicat = Trimiteți și solicitați date
0 14(0xE) Cerere Ident cu răspuns
0 15 (0xF) Solicitați starea LSAP cu răspuns 1)
0 alte Rezervat

1) această valoare se află în ultima versiune a standardului nu mai este definită, ci doar rezervată

7 6 5 4 3 2 1 0 FC: Răspuns codul funcției
0 Telegramă de răspuns
0 Rezervat
0 0 Sclav
0 1 Maestrul nu este pregătit
1 0 Maestrul gata, fără jeton
1 1 Maestrul gata, în token ring
0 (0x0) Bine
1 (0x1) UE = Eroare utilizator
2 (0x2) RR = Fără resurse
3 (0x3) RS = SAP nu este activat
8 (0x8) DL = Date scăzute (caz normal cu DP)
9 (0x9) NR = Nicio dată de răspuns gata
10(0xA) DH = Data High (diagnostic DP în așteptare)
12(0xC) RDL = Date neprimite și Date Low
13(0xD) RDH = Date neprimite și Data High
alte Rezervat

Bitul de numărare a cadrelor Bitul de numărare a cadrelor FCB (b5) previne duplicarea mesajului de către stația de confirmare sau de răspuns (răspuns) și orice pierdere de către stația apelantă (inițiator). Sunt excluse din aceasta cererile fără confirmare (SDN) și cererile de stare FDL, Ident și statut LSAP.

Pentru secvența de securitate, inițiatorul trebuie să poarte un FCB pentru fiecare răspuns. Când o telegramă de solicitare (Solicitare sau Trimitere/Solicitare) este trimisă unui respondent pentru prima dată sau dacă este retrimisă unui răspuns marcat în prezent ca neoperațional, FCB trebuie setat așa cum este definit în răspuns. Inițiatorul realizează acest lucru într-o telegramă de solicitare cu FCV=0 și FCB=1. Răspunsul trebuie să evalueze o telegramă de acest fel ca primul ciclu de mesaj și să stocheze FCB=1 împreună cu adresa inițiatorului (SA) (vezi tabelul următor). Acest ciclu de mesaj nu va fi repetat de către inițiator. În telegramele de solicitare ulterioare către același răspuns, inițiatorul trebuie să seteze FCV=1 și să schimbe FCB cu fiecare nouă telegramă de solicitare. Orice răspuns care primește o telegramă de solicitare adresată acestuia cu FCV=1 trebuie să evalueze FCB. Dacă FCB s-a schimbat în comparație cu ultima telegramă Solicitare de la același inițiator (același SA), aceasta este o confirmare validă că ciclul de mesaj anterior a fost încheiat corect. Dacă telegrama Solicitare provine de la un inițiator diferit (SA diferit), evaluarea FCB nu mai este necesară. În ambele cazuri, respondentul trebuie să salveze FCB cu sursa SA până la primirea unei noi telegrame adresate acestuia. În cazul unei telegrame de confirmare sau răspuns pierdute sau deteriorate, FCB-ul nu trebuie să fie schimbat de către inițiator în reîncercarea cererii: aceasta va indica faptul că ciclul de mesaj anterior a fost defect. Dacă respondentul primește o telegramă de solicitare cu FCV=1 și același FCB ca ultima telegramă de solicitare de la același inițiator (același SA), aceasta va indica o reîncercare a cererii. Răspunsul trebuie, la rândul său, să retransmită telegrama de confirmare sau de răspuns păstrată în pregătire. Până la confirmarea menționată mai sus sau primirea unei telegrame cu o adresă diferită (SA sau DA) care nu este confirmată (Trimite date fără confirmare, SDN), respondentul trebuie să rețină ultima telegramă de confirmare sau răspuns, pregătit pentru orice posibilă reîncercare a cererii. . În cazul telegramelor Request care nu sunt confirmate și cu Request FDL Status, Ident și LSAP Status, FCV=0 și FCB=0; evaluarea de către respondent nu mai este necesară.

b5 b4 Poziția biților
FCB FCV Condiție Sens Acțiune
0 0 DA = TS/127 Cerere fără confirmare
Solicitați starea FDL/Identitatea/Starea LSAP
Ștergeți ultima confirmare
0/1 0/1 DA#TS Solicitare către alt răspuns
1 0 DA = TS Prima cerere FCBM:= 1
SAM:=SA
Ștergeți ultima confirmare/răspuns
0/1 1 DA = TS
SA = SAM
FCB#FCBM
Cerere nouă Ștergeți ultima confirmare/răspuns
FCBM:=FCB
Țineți confirmarea/răspunsul pentru a fi pregătit pentru reîncercare
0/1 1 DA = TS
SA = SAM
FCB = FCBM
Reîncercați Solicitarea FCBM:=FCB
Repetați recunoașterea/răspunsul și continuați să fiți pregătiți
0/1 1 DA = TS
SA#SAM
Inițiator nou FCBM:=FCB
SAM:= SA Rețineți confirmarea/răspunsul pentru a fi pregătit pentru reîncercare

FCBM a stocat FCB în memorie SAM a stocat SA în memorie




Top