Vytvořte vlastní známý typ souboru pro R-Studio. Metody detekce „slepených“ souborů Špatná programovací praxe

Funkční kód (FC) v záhlaví telegramu identifikuje typ telegramu, jako je například telegram požadavku (požadavek nebo odeslání / požadavek) a telegram potvrzení nebo odpověď (rámeček potvrzení, rámec odpovědi). Kód funkce navíc obsahuje aktuální přenosovou funkci a řídicí informace, které zabraňují ztrátě a duplikaci zpráv nebo typu stanice se stavem FDL.

7 6 5 4 3 2 1 0 FC: Požadavek na funkční kód
1 Požádat o telegram
X FCV = střídavý bit zapnutý
X href = "http://profibus.felser.ch/en/funktionscode.htm#aufruffolgebit"> FCB = Alternativní bit (z počtu snímků)
1 0 (0x0) CV = hodnota hodin ()
1 jiný Rezervováno
0 0 (0x0) TE = časová událost (synchronizace hodin)
0 3 (0x3) SDA_LOW = Odeslání dat potvrzeno - nízká priorita
0 4 (0x4) SDN_LOW = Odesílání dat není potvrzeno - nízká priorita
0 5 (0x5) SDA_HIGH = Odeslání dat potvrzeno - vysoká priorita
0 6 (0x6) SDN_HIGH = Odeslání dat není potvrzeno
0 7 (0x7) MSRD = Odeslat data požadavku s odpovědí vícesměrového vysílání
0 9 (0x9) Vyžádejte si stav FDL
0 12 (0xC) SRD low = Odeslat a požadovat data
0 13 (0xD) SRD high = Odeslat a požadovat data
0 14 (0xE) Vyžádejte si identitu s odpovědí
0 15 (0xF) Vyžádat stav LSAP s odpovědí 1)
0 jiný Rezervováno

1) tato hodnota je v poslední verzi standardu již nedefinována, ale pouze vyhrazena

7 6 5 4 3 2 1 0 FC: Reakce na funkční kód
0 Odpovědní telegram
0 Rezervováno
0 0 Otrok
0 1 Mistr není připraven
1 0 Master připraven, bez tokenu
1 1 Master připraven, v token ring
0 (0x0) OK
1 (0x1) UE = chyba uživatele
2 (0x2) RR = žádné zdroje
3 (0x3) RS = SAP není povolen
8 (0x8) DL = Data Low (normální případ s DP)
9 (0x9) NR = nejsou připravena žádná data odezvy
10 (0xA) DH = Data High (DP diagnóza čeká)
12 (0xC) RDL = Data nepřijata a Data nízká
13 (0xD) RDH = Data nepřijata a Data vysoká
jiný Rezervováno

Bit počtu bitů Bit bitů počtu snímků FCB (b5) zabraňuje duplikaci zpráv potvrzující nebo reagující stanicí (respondér) a jakékoli ztrátě volající stanice (iniciátor). Z toho jsou vyloučeny požadavky bez potvrzení (SDN) a požadavky na stav FDL, Ident a LSAP.

Pro sekvenci zabezpečení musí iniciátor nést FCB pro každého respondenta. Když je telegram požadavku (Žádost nebo Odeslat / Žádost) odeslán respondérovi poprvé, nebo pokud je znovu odeslán respondentovi aktuálně označenému jako nefunkční, FCB musí být nastaveno tak, jak je definováno v odpovídajícím zařízení. Iniciátor toho dosáhne v telegramu požadavku s FCV = 0 a FCB = 1. Odpovědník musí vyhodnotit telegram tohoto druhu jako první cyklus zpráv a uložit FCB = 1 společně s adresou iniciátora (SA) (viz následující tabulka). Tento cyklus zpráv nebude iniciátor opakovat. V následujících telegramech požadavku na stejného respondenta musí iniciátor nastavit FCV = 1 a změnit FCB s každým novým telegramem požadavku. Každý respondent, který obdrží telegram žádosti adresovaný s FCV = 1, musí vyhodnotit FCB. Pokud se FCB změnilo ve srovnání s posledním telegramem požadavku od stejného iniciátora (stejného SA), je to platné potvrzení, že předchozí cyklus zpráv byl správně uzavřen. Pokud telegram požadavku pochází od jiného iniciátora (jiného SA), hodnocení FCB již není nutné. V obou případech musí respondér uložit FCB se zdrojovým SA, dokud neobdrží nový telegram, který je mu adresován. V případě ztraceného nebo poškozeného potvrzovacího nebo odpovědního telegramu nesmí být FCB iniciátorem změněno při opakovaném požadavku: bude to znamenat, že předchozí cyklus zpráv byl chybný. Pokud respondér obdrží telegram požadavku s FCV = 1 a stejný FCB jako poslední telegram požadavku od stejného iniciátora (stejného SA), bude to znamenat opakování požadavku. Odpovědník musí následně znovu odeslat potvrzovací nebo odpovědní telegram připravený. Až do výše uvedeného potvrzení nebo přijetí telegramu s jinou adresou (SA nebo DA), který není potvrzen (Odeslat data bez potvrzení, SDN), musí odpovídač držet připravený telegram s posledním potvrzením nebo odpovědí pro případný opakovaný požadavek ... V případě telegramů požadavku, které nejsou potvrzeny a se statusem požadavku FDL, identity a stavu LSAP, FCV = 0 a FCB = 0; hodnocení respondérem již není nutné.

b5 b4 Bitová pozice
FCB FCV Stav Význam Akce
0 0 DA = TS / 127 Žádost bez potvrzení
Vyžádejte si stav FDL / stav identity / LSAP
Smazat poslední potvrzení
0/1 0/1 DA # TS Požádejte jiného respondenta
1 0 DA = TS První žádost FCBM: = 1
SAM: = SA
Smazat poslední potvrzení / odpověď
0/1 1 DA = TS
SA = SAM
FCB # FCBM
Nová žádost Smazat poslední potvrzení / odpověď
FCBM: = FCB
Podržte potvrzení / odpověď v připravenosti na opakování
0/1 1 DA = TS
SA = SAM
FCB = FCBM
Opakovat žádost FCBM: = FCB
Opakujte potvrzení / odpověď a zůstaňte připraveni
0/1 1 DA = TS
SA # SAM
Nový iniciátor FCBM: = FCB
SAM: = SA Pozdržení potvrzení / reakce připraveno na opakování

FCBM uložil FCB do paměti SAM uložil SA do paměti

Skenování vyhledávání souborů známých typů (nebo, jak se často říká, hledání souborů podle podpisů) je jedním z nejúčinnějších nástrojů používaných v nástroji pro obnovu dat R-Studio. Použití určeného podpisu vám umožňuje obnovit soubory určitého typu v případě, že informace o struktuře adresářů a názvech souborů částečně nebo úplně chybí (jsou poškozeny).

K vyhledání souborů se obvykle používá tabulka diskových oddílů. Pokud porovnáte disk s knihou, bude tabulka oddílů podobná obsahu. Při skenování R-Studio vyhledává soubory známých typů v tabulce oddílů disku pomocí určitých zadaných podpisů. To je možné, protože prakticky každý typ souboru má jedinečný podpis nebo datový vzor. Podpisy souborů se nacházejí na konkrétním místě na začátku souboru a v mnoha případech také na konci souboru. Při skenování R-Studio porovnává nalezená data s podpisy souborů známých typů, což umožňuje jejich identifikaci a obnovu dat.

Pomocí technologie skenování souborů známých typů vám R-Studio umožňuje obnovit data z disků, které byly přeformátovány a jejichž přepisovací tabulky byly přepsány. Pokud je diskový oddíl přepsán, poškozen nebo odstraněn, pak je skenování souborů známých typů jediným možným.

Ale téměř vždy a vše má své nevýhody a soubory známých typů používané v R-Studio nejsou výjimkou. Při skenování souborů známých typů vám tedy R-Studio umožňuje obnovit pouze nefragmentované soubory, ale jak již bylo řečeno, ve většině případů je to poslední možná metoda.

R-Studio již obsahuje podpisy pro nejběžnější typy souborů (úplný seznam známých typů souborů najdete v části online nápovědy R-Studio.)

V případě potřeby může uživatel do R-Studio přidat nové typy souborů. Pokud například potřebujete najít soubory nějakého jedinečného typu nebo soubory vytvořené po posledním vydání R-Studio, můžete do seznamu známých typů souborů přidat vlastní podpisy. Tento proces bude projednán dále.

Vlastní soubory známých typů
Vlastní podpisy pro soubory známých typů jsou uloženy v souboru XML uvedeném v dialogovém okně Předvolby. Přidání podpisu má dvě části:

  1. Určení podpisu souboru umístěného na začátku souboru a, je -li přítomen, na konci souboru.
  2. Vytvoření souboru XML obsahujícího podpis souboru a další informace o typu souboru.

To vše lze provést pomocí R-Studio. Současně nemusíte být odborníkem v oblasti skládání (editace) XML dokumentů ani v oblasti hexadecimální úpravy - v této příručce (článku), orientované na uživatele samotné vstupní úrovně, všechny fáze tohoto procesu bude podrobně diskutováno.

Příklad: Přidání podpisu pro soubor MP4 (kodek XDCam-EX)
Podívejme se na přidání podpisu souboru na příkladu souboru .MP4 vytvořeného pomocí Sony XDCAM-EX. Lze jej použít například v případě poškozené karty SD, pro kterou se vám ještě nepodařilo uložit na pevný disk počítače.

První krok: Určení podpisu souboru
Chcete -li určit podpis souboru, zvažte příklady souborů stejného formátu.

Řekněme, že se jedná o čtyři video soubory od Sony XDCAM-EX:
ZRV-3364_01.MP4
ZRV-3365_01.MP4
ZRV-3366_01.MP4
ZRV-3367_01.MP4

Pro pohodlí ať jsou to malé soubory. Větší soubory se obtížněji zobrazují v hexadecimální formě.

1. Otevřeme soubory v R-Studio. Chcete-li to provést, klepněte pravým tlačítkem na každý soubor a v místní nabídce vyberte příkaz Zobrazit / upravit.

2. Porovnejme soubory. Budeme hledat stejný vzor nalezený ve všech čtyřech souborech. On bude podpis souboru... Podpisy souborů se obvykle nacházejí na začátku souboru, ale někdy na konci.

3. Definujme podpis souboru na začátku souboru. V našem případě se nachází na úplném začátku souboru. Upozorňujeme, že tomu tak není vždy - podpis souboru je často na začátku souboru, ale ne na prvním řádku (offset).

Níže uvedené obrázky ukazují, že obsah všech čtyř souborů je odlišný, ale všechny začínají stejným podpisem souboru.


Kliknutím na obrázek jej zvětšíte


Kliknutím na obrázek jej zvětšíte


Kliknutím na obrázek jej zvětšíte


Kliknutím na obrázek jej zvětšíte

Zvýrazněná oblast na obrázcích je podpis souboru tohoto typu souboru. Je prezentován v textové i hexadecimální formě.

V textové podobě vypadá podpis souboru takto:
.... ftypmp42 .... mp42 ........ zdarma

Tečky („.“) Označují znaky, které nelze v textu znázornit. Proto je také nutné přinést hexadecimální formu podpisu souboru:
00 00 00 18 66 74 79 6D 70 34 32 00 00 00 00 00 6D 70 34 32 00 00 00 00 00 00 00 00 08 66 72 65 65

4. Definujme podpis souboru stejným způsobem, ale na úplném konci souboru. Může to být jiný podpis souboru jiné délky.

Na obrázcích níže je zvýrazněn podpis souboru na konci souboru:


Kliknutím na obrázek jej zvětšíte


Kliknutím na obrázek jej zvětšíte


Kliknutím na obrázek jej zvětšíte


Kliknutím na obrázek jej zvětšíte

Všimněte si toho, že data před výběrem (podpis souboru) jsou stejná ve všech čtyřech souborech. Toto jsou technické informace, které nejsou podpisem souboru, ale naznačují, že všechny čtyři snímky (soubory) byly pořízeny stejnou kamerou se stejnými parametry. Obvykle je možné rozlišovat mezi odpovídajícími šablonami technických informací a podpisy souborů. V našem příkladu v posledním řádku před začátkem podpisu souboru vidíme text „RecordingMode type =“ normal ”‘, který jasně ukazuje, že se jedná o nějaký druh parametru souboru, nikoli o podpis. Vždy věnujte tomuto řádku zvláštní pozornost, abyste se vyhnuli omylu vložení technických informací do podpisu souboru.

V našem případě je podpisem souboru následující text:
...
Připomeňme, že tečky označují symboly, které nelze v textové podobě znázornit.

V šestnáctkové soustavě vypadá podpis souboru takto:
3N 2F 4E 6F 6E 52 65 61 6N 54 69 6A 65 4A 65 74 61 3E 0D 0A 00
Upozornění: podpis nebude vždy na konci souboru.

Druhá fáze: Generování souboru XML popisujícího známý typ souboru
Nyní, když jste definovali podpis souboru, můžete vytvořit soubor XML a zahrnout příslušný typ souboru do R-Studio. To lze provést dvěma způsoby:

2.1 Použití vestavěného grafického editoru podpisů souborů:
Vyberte položku Nastavení z nabídky Nástroje, v dialogovém okně Nastavení, které se otevře, klikněte na kartu Známé typy souborů a poté klikněte na tlačítko Upravit typy souborů uživatele.

Kliknutím na obrázek jej zvětšíte

V dialogovém okně Upravit typy souborů uživatele klikněte na tlačítko Vytvořit typ souboru.
Nastavte následující parametry:

  • Id je jedinečný digitální identifikátor. Toto číslo bude vybráno náhodně; Jediná věc je, že se nesmí shodovat s digitálním ID žádného jiného typu souboru.
  • Popis skupiny - skupina, která bude obsahovat nalezené soubory v R -Studio. Můžete buď nastavit novou skupinu, nebo vybrat jednu z těch, které již existují. Budeme mít tuto skupinu „Multimedia Video“.
  • Popis - krátký popis typu souboru. V našem příkladu můžete použít například „Sony cam video, XDCam-EX“.
  • Extension - přípona tohoto typu souborů. V našem případě mp4.

Parametr Funkce je volitelný, v našem případě jej nepotřebujeme použít.

Kliknutím na obrázek jej zvětšíte

Dále musíte zadat počáteční a konečný podpis souboru. Chcete -li to provést, vyberte Začít a poté z kontextové nabídky příkaz Přidat podpis.

Kliknutím na obrázek jej zvětšíte

Poté dvakrát klikněte na pole<пустая сигнатура> () a zadejte příslušný text.

Kliknutím na obrázek jej zvětšíte

Poté vytvořte konečný podpis souboru. Nezapomeňte zadat 21 do sloupce Od.

Kliknutím na obrázek jej zvětšíte

Úspěšně jste vytvořili svůj vlastní podpis pro známý typ souboru.

Nyní to musíte uložit. Existují dva způsoby: Můžete jej buď uložit do výchozího souboru uvedeného na kartě Hlavní v dialogovém okně Nastavení kliknutím na tlačítko Uložit. Nebo klikněte na tlačítko Uložit jako ... a uložte podpis do jiného souboru.

2.2 Ruční vytvoření souboru XML popisujícího známý typ souboru:
K vytvoření tohoto souboru použijeme kódování XML verze 1.0 a UTF-8. Pokud nevíte, co to je, nezoufejte - jednoduše otevřete libovolný textový editor (například Notepad.exe) a na první řádek zadejte následující text:

Dále vytvoříme značku XML, která definuje typ souboru (FileType). Vzhledem k dříve popsaným atributům XML bude značka vypadat takto:

Pojďme to vložit hned poté

Dále definujeme podpis souboru (tag ). Počáteční podpis (na začátku souboru) bude uvnitř značky bez jakýchkoli atributů. Používáme textovou formu podpisu, ale zároveň nahrazujeme hexadecimální znaky, které nelze v textové podobě reprezentovat. Před každý hexadecimální znak vložte „\ x“. Tímto způsobem značka s podpisem souboru by vypadalo takto:

Je -li k dispozici, musíte také definovat konečný podpis (na konci souboru). K tomu se používá stejný tag, ale s prvkem „od“ a atributem „konec“. Bude to vypadat takto:

Připomeňme, že v konečném podpisu souboru nebyly žádné netextové znaky, ale byly tam lomítka a trojúhelníkové závorky. Abychom se vyhnuli nejasnostem a chybám v syntaxi XML, nahradíme znaky „/“, „<" и ">„jejich hexadecimální hodnoty.

Na konci, po podpisech souborů, musí být zavírací značky FileType a FileTypeList:

Celý soubor by tedy měl vypadat takto:


\ x00 \ x00 \ x00 \ x18ftypmp42 \ x00 \ x00 \ x00 \ x00mp42 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x08 zdarma
\ x3C \ x2FNonRealTimeMeta \ x3E \ x0D \ x0A \ x00

Pamatujte: Syntaxe XML rozlišuje velká a malá písmena, takže správný tag je , ale ne .

Uložme soubor v textovém formátu s příponou .xml. Například: SonyCam.xml.

Úspěšně jsme vytvořili vlastní podpis pro soubory známého typu. Tento příklad je dostačující pro pochopení základních principů vytváření vlastního typu souboru. Pokročilejší uživatelé mohou použít XML verze 2.0. Více si o tom můžete přečíst v sekci online nápovědy R-Studio.

Fáze 3: Kontrola a přidání souboru popisujícího známý typ souboru
Dalším krokem je přidání (nahrání) vašeho souboru XML do R-Studio. Současně bude automaticky zkontrolován.

Načteme soubor XML vytvořený v předchozím kroku do R-Studio. Chcete -li to provést, vyberte položku Nastavení v nabídce Nástroje. Do oblasti Typy souborů uživatele na kartě Hlavní v dialogovém okně Nastavení přidejte soubor XML, který jsme vytvořili (SonyCam.xml). Klikněte na tlačítko Použít.

Kliknutím na obrázek jej zvětšíte

2. Na žádost o nahrání nového typu souboru odpovězte Ano.

Kliknutím na obrázek jej zvětšíte

3. Chcete -li ověřit, že byl typ souboru úspěšně načten, klikněte na kartu Známé typy souborů v dialogovém okně Nastavení. Připomeňme, že jsme přidali typ souboru do skupiny Multimedia Video. Při rozšiřování této skupiny (složky) bychom měli vidět prvek s popisem, který jsme zadali při vytváření souboru XML: Sony cam video, XDCam-EX (.mp4).

Kliknutím na obrázek jej zvětšíte


Kliknutím na obrázek jej zvětšíte

Pokud jsou v syntaxi souboru nějaké chyby, zobrazí se odpovídající zpráva:

Kliknutím na obrázek jej zvětšíte

V takovém případě znovu zkontrolujte, zda váš soubor XML neobsahuje chyby. Pamatujte: Syntaxe XML rozlišuje velká a malá písmena a na konci každého tagu musí být koncová značka.

Fáze 4: Testování souboru popisujícího známý typ souboru
Chcete -li zkontrolovat správnost námi vytvořeného typu vlastního souboru, zkusme najít naše soubory .mp4 na vyměnitelné jednotce USB flash.

1. V systému Windows Vista nebo Windows 7 provedeme kompletní (ne rychlý) formát disku nebo použijeme čistič místa na disku (například R-Wipe & Clean) k úplnému odstranění všech dat na disku. Nechejte USB disk naformátovat na FAT32 (velikost prohledávaných souborů nepřesahuje 2 GB).

2. Zkopírujeme testovací soubory na disk a restartujeme počítač, aby se obsah mezipaměti uložil na disk. Můžete také odpojit externí disk a poté jej znovu zapojit.

3. V operačním systému bude jednotka identifikována například jako logická jednotka F: \.

4. Spusťte R-Studio. Vyberte naši jednotku (F: \) a klikněte na tlačítko Skenovat

Kliknutím na obrázek jej zvětšíte

5. V dialogovém okně Skenování v oblasti (Systém souborů) klikněte na tlačítko Změnit ... a zrušte zaškrtnutí všech políček. Zakážeme tedy vyhledávání souborových systémů a souborů pomocí tabulky oddílů.
Kliknutím na obrázek jej zvětšíte

6. Zaškrtněte políčko Extra hledat známé typy souborů. To R-Studio umožní při skenování vyhledávat soubory známých typů.

7. Stisknutím tlačítka Skenovat zahájíte skenování.

8. Počkejme, než R-Studio naskenuje disk. Na kartě Informace o skenování se zobrazí průběh skenování (průběh).


Kliknutím na obrázek jej zvětšíte

9. Po dokončení skenování vyberte položku Extra Found Files a dvakrát na ni klikněte.


Kliknutím na obrázek jej zvětšíte

10. Naše testovací soubory budou umístěny ve videokameře Sony cam, XDCam-EX (nebo ve složce s jiným názvem odpovídajícím popisu typu souboru nastaveného ve druhém kroku).


Kliknutím na obrázek jej zvětšíte

Můžete vidět, že názvy souborů, data a umístění (složky) nebyly obnoveny, protože tyto informace jsou uloženy v systému souborů. R-Studio proto automaticky zobrazí každý soubor s novým názvem.

Můžete však vidět, že obsah souborů není poškozen. Abychom se o tom přesvědčili, otevřeme je v příslušném programu, například v přehrávači médií VLC.


Kliknutím na obrázek jej zvětšíte

Závěr
Schopnost R-Studio vyhledávat při skenování soubory známých typů vám umožňuje obnovit data i z disku, jehož systémy souborů jsou buď nebo přepsány. Soubory můžete prohledávat poměrně efektivně pomocí jejich podpisů, což je užitečné zejména v případě, že přesně znáte typ obnovovaných souborů, jako například v našem příkladu. Možnost vytvářet vlastní typy souborů vám umožňuje přidat jakýkoli soubor, který má konkrétní podpis souboru, do seznamu známých typů souborů.

Koncept " Kouzelné číslo»Má tři významy v programování:

  • Podpis dat
  • Přidělené jedinečné hodnoty, které nesmí být stejné jako jiné hodnoty (např. UUID)
  • Špatná programovací praxe.

Podpis dat

Kouzelné číslo, nebo podpis, je celočíselná nebo textová konstanta používaná k jedinečné identifikaci zdroje nebo dat. Takové číslo samo o sobě nemá žádný význam a může způsobit zmatek, pokud se vyskytuje v programovém kódu bez příslušného kontextu nebo komentáře, zatímco pokus o jeho změnu na jiný, dokonce blízký hodnotou, může vést k naprosto nepředvídatelným důsledkům. Z tohoto důvodu byla taková čísla ironicky nazývána magie. V současné době je tento název pevně zakotven jako termín. Například jakákoli kompilovaná třída jazyka Java začíná šestnáctkovým magickým číslem 0xCAFEBABE. Druhým známým příkladem je, že jakýkoli spustitelný soubor Microsoft Windows s příponou .exe začíná bajtovou sekvencí 0x4D5A (což odpovídá znakům ASCII MZ-iniciály Marka Zbikowského, jednoho z tvůrců systému MS-DOS). Méně známým příkladem je neinicializovaný ukazatel v Microsoft Visual C ++ (počínaje verzí Microsoft Visual Studio 2005), který v režimu ladění má adresu 0xDEADBEEF.

V operačních systémech podobných UNIX je typ souboru obvykle určen podpisem souboru bez ohledu na příponu jeho názvu. Poskytují standardní nástroj pro interpretaci podpisu souboru.

Špatná programovací praxe

Také se nazývá „magická čísla“, což je špatný programovací postup, když se ve zdrojovém kódu objeví číselná hodnota a není jasné, co to znamená. Například takový úryvek napsaný v Javě by byl špatný:

drawSprite (53, 320, 240);

konečná int SCREEN_WIDTH = 640; konečná 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);

Nyní je to jasné: tento řádek zobrazuje sprite ve středu obrazovky - zaměřovací kříž zraku. Ve většině programovacích jazyků budou všechny hodnoty použité pro takové konstanty vypočítány v době kompilace a nahrazeny v místech, kde jsou hodnoty použity. Taková změna zdrojového textu tedy nesníží výkon programu.

Magická čísla jsou navíc potenciálním zdrojem chyb programu:

  • Pokud je v programu použito stejné magické číslo vícekrát (nebo může být potenciálně použito), pak jeho změna bude vyžadovat opravy každého výskytu (namísto jedné úpravy hodnoty pojmenované konstanty). Pokud nejsou všechny výskyty opraveny, dojde alespoň k jedné chybě.
  • Přinejmenším v jednom z výskytů mohlo být magické číslo původně napsáno špatně, a to je docela obtížné zjistit.
  • Magické číslo může záviset na implicitním parametru nebo jiném magickém čísle. Pokud tyto závislosti, které nejsou výslovně přiděleny, nejsou splněny, dojde alespoň k jedné chybě.
  • Při úpravě výskytů jednoho magického čísla je možné omylem změnit jiné magické číslo, které je nezávislé, ale má stejnou číselnou hodnotu.

Kouzelná čísla a různé platformy

Někdy magická čísla škodí kódu napříč platformami. Faktem je, že v C v 32- a 64bitových operačních systémech je zaručena velikost typů char, short a long long, zatímco velikost int, long, size_t a ptrdiff_t se může lišit (v prvních dvou v závislosti na preference vývojářů kompilátoru pro poslední dva - v závislosti na bitové kapacitě cílového systému). Starý nebo nekvalifikovaný kód může obsahovat „magická čísla“ znamenající velikost nějakého typu - při přechodu na stroje s jinou bitovou hloubkou mohou vést k jemným chybám.

Například:

const velikost_t NUMBER_OF_ELEMENTS = 10; dlouhý a [NUMBER_OF_ELEMENTS]; memset (a, 0, 10 * 4); // špatně - předpokládá se, že long má 4 bajty, používá se magický počet prvků memset (a, 0, NUMBER_OF_ELEMENTS * 4); // špatně - předpokládá se, že délka je 4 bajty memset (a, 0, NUMBER_OF_ELEMENTS * sizeof (long)); // ne zcela správné - duplikace názvu typu (pokud se typ změní, budete muset změnit i zde) memset (a, 0, NUMBER_OF_ELEMENTS * sizeof (a [0])); // správné, optimální pro dynamická pole nenulové velikosti memset (a, 0, sizeof (a)); // správné, optimální pro statická pole

Čísla, která nejsou magická

Ne všechna čísla je třeba převádět do konstant. Například kód pro

Šéfové mi dali docela zajímavý úkol. V krátké době napište analyzátor spustitelných souborů, které by dokázaly najít těla virů podle podpisů a určit použitý packer / cryptor. Hotový prototyp se objevil během několika hodin.

Slovo autora

Analýza podpisu

Hledání škodlivého objektu podle podpisu je něco, co dokáže každý antivirus. Podpis je obecně formalizovaný popis některých znaků, pomocí kterých je možné určit, že naskenovaný soubor je virus a virus je zcela jednoznačný.

Existují zde různé techniky. Alternativně můžete použít podpis složený z N bajtů škodlivého objektu. V tomto případě můžete provést ne hloupé srovnání, ale srovnání pomocí nějaké masky (například hledání bajtů EB ?? ?? CD 13). Nebo nastavte další podmínky jako „takové a takové bajty musí být ve vstupním bodě programu“ a podobně. Malvariho podpis je zvláštní.

Stejným způsobem jsou popsány některé znaky, pomocí kterých je možné určit, že spustitelný soubor je zabalen s jedním nebo jiným kryptorem nebo balíčkem (například banální ASPack). Pokud si pozorně přečtete náš časopis, pak jste určitě slyšeli o takovém nástroji, jako je PEiD, který je schopen určit nejčastěji používané balírny, kryptory a překladače (v databázi je velké množství podpisů) pro přenesený soubor PE k tomu. Bohužel nové verze programu již dlouho nebyly vydány a nedávno se na oficiálním webu objevila zpráva, že projekt nebude mít další vývoj. Je to škoda, protože možnosti PEiD (zejména s ohledem na systém pluginů) pro mě mohly být užitečné. Po krátké analýze bylo jasné, že to není možné. Ale poté, co jsem se prohrabával v blogech v angličtině, jsem rychle našel, co mi vyhovuje. Projekt YARA (code.google.com/p/yara-project).

Co je YARA?

Od samého začátku jsem byl přesvědčen, že někde na webu již existuje vývoj open-source, který převezme úkol určit korespondenci mezi určitým podpisem a vyšetřovaným spisem. Pokud bych takový projekt našel, mohl by být snadno umístěn na kolejnice webové aplikace, přidat tam různé podpisy a získat to, co se po mně požadovalo. Plán se mi zdál ještě realističtější, když jsem si přečetl popis projektu YARA.

Sami vývojáři to považují za nástroj, který pomůže výzkumníkům malwaru identifikovat a klasifikovat škodlivé vzorky. Výzkumník může vytvářet popisy pro různé typy malwaru pomocí textových nebo binárních vzorů, které popisují formalizované funkce malwaru. Takto se získávají podpisy. Ve skutečnosti se každý popis skládá ze sady řádků a nějakého logického výrazu, na jehož základě je určena spouštěcí logika analyzátoru.

Pokud jsou u zkoumaného spisu splněny podmínky jednoho z pravidel, je podle toho určeno (například takový a takový červ). Jednoduchý příklad pravidla pro pochopení toho, o co jde:

pravidlo silent_banker: bankéř
{
meta:
description = "Toto je jen příklad"
thread_level = 3
in_the_wild = true
řetězce:
$ 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"
stav:
$ a nebo $ b nebo $ c
}

V tomto pravidle říkáme YARA, že jakýkoli soubor, který obsahuje alespoň jeden ze vzorových řetězců popsaných v proměnných $ a, $ b, $ c, by měl být klasifikován jako trojský kůň silent_banker. A to je velmi jednoduché pravidlo. Ve skutečnosti mohou být role mnohem komplikovanější (o tom si povíme níže).
Dokonce i seznam projektů, které jej používají, hovoří o autoritě projektu YARA, a to je:

  • VirusTotal Malware Intelligence Services (vt-mis.com);
  • jsunpack-n (jsunpack.jeek.org);
  • Sledujeme váš web (wewatchyourwebsite.com).

Veškerý kód je napsán v Pythonu a uživateli je nabízen jak samotný modul pro použití při jeho vývoji, tak pouze spustitelný soubor pro použití YARA jako nezávislé aplikace. V rámci své práce jsem zvolil první možnost, ale pro jednoduchost v článku použijeme analyzátor stejně jako konzolovou aplikaci.

Po malém kopání jsem rychle přišel na to, jak napsat pravidla pro YARA, a také, jak k němu připojit virové podpisy od free aver a packery od PEiD. Začneme ale instalací.

Instalace

Jak jsem řekl, projekt je napsán v Pythonu, takže jej lze snadno nainstalovat na Linux, Windows a Mac. Zpočátku můžete použít pouze binární soubor. Zavoláme -li aplikaci do konzoly, získáme pravidla pro spuštění.

$ yara
použití: yara ... ... SOUBOR | PID

To znamená, že formát volání programu je následující: nejprve přijde název programu, poté seznam možností, po kterém je uveden soubor s pravidly, a na samém konci - název zkoumaného souboru (nebo adresář obsahující soubory) nebo identifikátor procesu. Nyní bych chtěl přátelským způsobem vysvětlit, jak jsou sestavena právě tato pravidla, ale nechci vás hned zatěžovat suchou teorií. Budeme tedy jednat jinak a půjčíme si podpisy někoho jiného, ​​aby YARA mohla plnit jeden z našich úkolů - plnohodnotnou definici virů pomocí podpisů.

Váš antivirus

Nejdůležitější otázka: kde získat podpisovou databázi známých virů? Antivirové společnosti aktivně sdílejí takové databáze mezi sebou (některé velkorysěji, některé méně). Abych byl upřímný, zpočátku jsem dokonce pochyboval, že někde na webu někdo takové věci otevřeně nahrává. Ale jak se ukázalo, existují milí lidé. Vhodná databáze z populárního antiviru ClamAV je k dispozici všem (clamav.net/lang/en). V části „Poslední stabilní vydání“ najdete odkaz na nejnovější verzi antivirového produktu a také odkazy na stažení virových databází ClamAV. Nás především zajímají soubory main.cvd (db.local.clamav.net/main.cvd) a daily.cvd (db.local.clamav.net/daily.cvd).

První obsahuje hlavní základnu podpisů, druhá - aktuálně nejkompletnější základnu s různými dodatky. Daily.cvd, který obsahuje více než 100 000 odlitků malwaru, je pro tento účel docela dost. Databáze ClamAV však není databází YARA, proto ji musíme převést do správného formátu. Ale jak? Koneckonců zatím nevíme nic ani o formátu ClamAV, ani o formátu Yara. O tento problém jsme se již postarali připravením malého skriptu, který převede základnu viru ClamAV na sadu pravidel YARA. Skript se jmenuje clamav_to_ yara.py a napsal jej Matthew Richard (bit.ly/ij5HVs). Stáhněte si skript a převeďte databáze:

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

V důsledku toho získáme podpisovou základnu v souboru clamav.yara, který bude okamžitě připraven k použití. Nyní zkusme kombinaci YARY a základny od ClamAV v akci. Skenování složky pomocí podpisu se provádí jediným příkazem:

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

Volba -r určuje, že skenování by mělo být prováděno rekurzivně prostřednictvím všech podsložek aktuální složky. Pokud byla ve složce / pentest / msf3 / nějaká virová těla (alespoň ta v databázi ClamAV), YARA vás o tom bude okamžitě informovat. V zásadě se jedná o hotový skener podpisů. Pro větší pohodlí jsem napsal jednoduchý skript, který zkontroloval aktualizace databáze z ClamAV, stáhl nové podpisy a převedl je do formátu YARA. Ale to už jsou detaily. Jedna část úkolu je dokončena, nyní můžete začít sestavovat pravidla pro definování balíčků / kryptorů. Ale kvůli tomu jsem se s nimi musel trochu vypořádat.

Hraní podle pravidel

Pravidlo je tedy hlavním mechanismem programu, který vám umožňuje přiřadit daný soubor do jakékoli kategorie. Pravidla jsou popsána v samostatném souboru (nebo souborech) a svým vzhledem velmi připomínají konstrukci struct () z jazyka C / C ++.

vládnout BadBoy
{
řetězce:
$ a = "win.exe"
$ b = "http://foo.com/badfi le1.exe"
$ c = "http://bar.com/badfi le2.exe"
stav:
$ a a ($ b nebo $ c)
}

V zásadě není při psaní pravidel nic obtížného. V rámci tohoto článku jsem se dotkl pouze hlavních bodů a podrobnosti najdete v manuálu. Mezitím deset nejdůležitějších bodů:

1. Každé pravidlo začíná klíčovým slovem pravidla, za nímž následuje identifikátor pravidla. Identifikátory mohou mít stejná jména jako proměnné v C / C ++, to znamená, že se mohou skládat z písmen a číslic a první znak nemůže být číslice. Maximální délka názvu identifikátoru je 128 znaků.

2. Pravidla se obvykle skládají ze dvou částí: sekce řetězců a sekce podmínek. Sekce řetězců určuje data, na základě kterých sekce podmínek rozhodne, zda daný soubor splňuje určité podmínky.

3. Každý řádek v sekci řetězců má svůj vlastní identifikátor, který začíná znakem $ - obecně jako deklarování proměnné v php. YARA podporuje pravidelné řetězce uzavřené do uvozovek ("") a hexadecimální řetězce uzavřené do složených závorek (()) a také regulární výrazy:

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

4. Část podmínky obsahuje veškerou logiku pravidla. Tato část by měla obsahovat logický výraz, který určuje, kdy soubor nebo proces odpovídá pravidlu. Tato část obvykle odkazuje na dříve deklarované řetězce. A identifikátor řetězce je považován za logickou proměnnou, která vrací true, pokud byl řetězec nalezen v paměti souboru nebo procesu, a v opačném případě false. Výše uvedené pravidlo určuje, že soubory a procesy obsahující řetězec win.exe a jednu ze dvou adres URL by měly být kategorizovány jako BadBoy (podle názvu pravidla).

5. Hexadecimální řetězce umožňují tři konstrukce, které je činí flexibilnějšími: zástupné znaky, skoky a alternativy. Substituce jsou místa v řetězci, která jsou neznámá a na jejich místě může být jakákoli hodnota. Jsou označeny symbolem „?“:

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

Tento přístup je velmi užitečný při zadávání řetězců, jejichž délka je známá, ale obsah se může lišit. Pokud může mít část řetězce různé délky, je vhodné použít rozsahy:

$ hex_string = (F4 23 62 B4)

Tento záznam znamená, že uprostřed řádku může být 4 až 6 různých bajtů. Lze také implementovat alternativní možnosti:

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

To znamená, že v místě třetího bajtu může být 62 B4 nebo 56, takový záznam odpovídá řádkům F42362B445 nebo F4235645.

6. Chcete -li zkontrolovat, zda je daný řetězec na určitém posunu v adresním prostoru souboru nebo procesu, použijte příkaz at:

$ a při 100 a $ b při 200

Pokud řetězec může být v určitém rozsahu adres, použije se operátor in:

$ a v (0..100) a $ b v (100..fi lesize)

Někdy existují situace, kdy je nutné určit, že soubor by měl obsahovat určité číslo z dané sady. To se provádí pomocí operátoru:

pravidlo Of1
{
řetězce:
$ foo1 = "dummy1"
$ foo2 = "dummy2"
$ foo3 = "dummy3"
stav:
2 z ($ foo1, $ foo2, $ foo3)
}

Výše uvedené pravidlo vyžaduje, aby soubor obsahoval libovolné dva řádky ze sady ($ foo1, $ foo2, $ foo3). Namísto určení konkrétního počtu řádků v souboru můžete použít proměnné any (alespoň jeden řádek z dané sady) a all (všechny řádky z dané sady).

7. Poslední zajímavou funkcí, kterou je třeba zvážit, je aplikace jedné podmínky na mnoho řetězců. Tato funkce je velmi podobná operátorovi, pouze výkonnější je pro..of operátora:

pro výraz string_set: (boolean_expression)

Tento záznam je třeba číst následovně: ze řetězců uvedených v sadě string_set musí podmínka boolean_expression splňovat alespoň výrazy. Nebo jinými slovy: boolean_expression je vyhodnocen pro každý řetězec ze sady string_set a výraz musí vracet True. Dále tuto konstrukci zvážíme na konkrétním příkladu.

Vytváření PEiD

Když se tedy s pravidly vše víceméně vyjasnilo, můžete v našem projektu začít implementovat detektor packerů a kryptorů. Nejprve jsem si jako zdrojový materiál vypůjčil podpisy známých balíren ze stejného PEiD. Složka plugins obsahuje soubor userdb.txt, který obsahuje to, co potřebujeme. V mé databázi bylo 1850 podpisů.

Docela hodně, takže abyste je mohli úplně importovat, doporučuji vám napsat nějaký skript. Formát této databáze je jednoduchý - používá se běžný textový soubor, který ukládá záznamy formuláře:


podpis = 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 = true

První řádek nastavuje název packeru, který se zobrazí v PEiD, ale pro nás to bude identifikátor pravidla. Druhým je samotný podpis. Třetí je příznak ep_only, který udává, zda hledat daný řetězec pouze na adrese vstupního bodu, nebo v celém souboru.

Zkusme vytvořit pravidlo pro, řekněme, ASPack? Jak se ukázalo, není to nic těžkého. Nejprve vytvoříme soubor pro uložení pravidel a pojmenujeme jej například packers.yara. Poté vyhledáme v databázi PEiD všechny podpisy, v jejichž názvu se objeví ASPack, a přeneseme je do pravidla:

pravidlo ASPack
{
řetězce:
$ = (60 E8 ?? ?? ?? 5D 81 ED ?? ?? (43 | 44) ?? B8 ?? ?? (43 | 44) ?? 03 C5)
$ = (60 EB ?? 5D EB ?? FF ?? ?? ?? ?? ?? ?? E9)
[.. střih ..]
$ = (60 E8 03 00 00 00 E9 EB 04 5D 45 55 C3 E8 01)
stav:
pro kteréhokoli z nich: ($ ve vstupním bodě)
}

Všechny nalezené položky mají příznak ep_only nastaven na true, to znamená, že tyto řádky musí být umístěny na adrese vstupního bodu. Proto napíšeme následující podmínku: „pro kteroukoli z nich: ($ ve vstupním bodě)“.

Přítomnost alespoň jednoho ze zadaných řádků na adrese vstupního bodu tedy bude znamenat, že soubor je zabalen s ASPack. Všimněte si také, že v tomto pravidle jsou všechny řetězce jednoduše zadány pomocí znaku $, bez identifikátoru. To je možné, protože v sekci podmínek neodkazujeme na žádné konkrétní z nich, ale používáme celou sadu.

Chcete -li zkontrolovat výkonnost výsledného systému, stačí spustit příkaz v konzole:

$ yara -r packers.yara somefi le.exe

Když jsem tam nakrmil pár aplikací zabalených s ASPackem, ujistil jsem se, že vše funguje!

Připravený prototyp

Ukázalo se, že YARA je extrémně jasný a transparentní nástroj. Nebylo pro mě příliš obtížné napsat pro něj webového administrátora a nastavit jej jako webovou službu. Trochu kreativity a suché výsledky analyzátoru jsou již vybarveny různými barvami, což naznačuje stupeň nebezpečí nalezeného malwaru. Malá aktualizace základny a pro mnoho kryptorů je k dispozici krátký popis a někdy dokonce i instrukce pro vybalení. Prototyp je vytvořen a funguje perfektně a šéfové tančí radostí!

Mnozí možná slyšeli o souborech jako rarjpeg "a. Jedná se o speciální druh souboru, který je obrázkem jpeg a archivem rar slepeným dohromady. Je to vynikající kontejner pro skrytí skutečnosti o přenosu informací. Rarjpeg můžete vytvořit pomocí následující příkazy:

UNIX: kočka image1.jpg archive.rar> image2.jpg
OKNA: kopírovat / b image1.jpg + archive.rar image2.jpg

Nebo pokud máte hex editor.

Samozřejmě, abyste skryli skutečnost přenosu informací, můžete použít nejen formát JPEG, ale i mnoho dalších. Každý formát má své vlastní charakteristiky, díky kterým může, ale nemusí být vhodný pro roli kontejneru. Popíšu, jak můžete najít lepené soubory v nejpopulárnějších formátech, nebo naznačíte fakt lepení.

Metody detekce lepených souborů lze rozdělit do tří skupin:

  1. Způsob kontroly oblasti za značkou EOF. Mnoho populárních formátů souborů má takzvanou značku konce souboru, která je zodpovědná za zobrazení požadovaných dat. Například diváci fotek přečtou všechny bajty až po tuto značku, ale oblast po ní bude ignorována. Tato metoda je ideální pro formáty: JPEG, PNG, GIF, ZIP, RAR, PDF.
  2. Metoda kontroly velikosti souboru. Struktura některých formátů (audio a video kontejnery) umožňuje vypočítat skutečnou velikost souboru a porovnat ji s původní velikostí. Formáty: AVI, WAV, MP4, MOV.
  3. Metoda kontroly souborů CFB. CFB nebo Compound File Binary Format je formát dokumentu vyvinutý společností Microsoft, který je kontejnerem s vlastním systémem souborů. Tato metoda je založena na detekci anomálií souborů.

Existuje život po skončení souboru?

Jpeg

Abychom našli odpověď na tuto otázku, je nutné ponořit se do specifikací formátu, který je „předchůdcem“ lepených souborů, a porozumět jeho struktuře. Libovolný JPEG začíná podpisem 0xFF 0xD8.

Po tomto podpisu jsou informace o službě, volitelná ikona obrázku a nakonec samotný komprimovaný obrázek. V tomto formátu je konec obrázku označen dvoubajtovým podpisem 0xFF 0xD9.

Obrázek PNG

Prvních osm bajtů souboru PNG je obsazeno následujícím podpisem: 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A. Ukončení podpisu, který ukončí datový proud: 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82.

RAR

Společný podpis pro všechny archivy rar: 0x52 0x61 0x72 0x21 (Rar!). Poté přichází informace o verzi archivu a další související data. Experimentálně bylo zjištěno, že archiv končí podpisem 0x0A, 0x25, 0x25, 0x45, 0x4F, 0x46.

Tabulka formátů a jejich podpisů:
Algoritmus pro kontrolu lepení v těchto formátech je velmi jednoduchý:

  1. Najděte počáteční podpis;
  2. Najděte konečný podpis;
  3. Pokud po konečném podpisu nejsou žádná data, je váš soubor čistý a neobsahuje žádné přílohy! Jinak po finálním podpisu hledejte jiné formáty.

GIF a PDF

Dokument PDF může mít více než jednu značku EOF, například z důvodu nesprávného generování dokumentu. Počet koncových podpisů v souboru GIF se rovná počtu rámců v něm. Na základě zvláštností těchto formátů je možné vylepšit algoritmus pro kontrolu přítomnosti lepených souborů.
  1. Bod 1 se opakuje z předchozího algoritmu.
  2. Bod 2 se opakuje z předchozího algoritmu.
  3. Při hledání konečného podpisu si pamatujte jeho umístění a hledejte dále;
  4. Pokud jsme tímto způsobem dosáhli poslední značky EOF, soubor je čistý.
  5. Pokud soubor nekončí konečným podpisem - přejděte na místo posledního nalezeného konečného podpisu.
Velký rozdíl mezi velikostí souboru a pozicí po podpisu posledního konce naznačuje přítomnost připojené přílohy. Rozdíl může být více než deset bajtů, i když lze nastavit i jiné hodnoty.

ZIP

Zvláštností archivů ZIP je přítomnost tří různých podpisů: Struktura archivu je následující:
Místní hlavička souboru 1
Data souboru 1
Popisovač dat 1
Místní hlavička souboru 2
Data souboru 2
Popisovač dat 2
...
Místní hlavička souboru č
Data souboru č
Datový deskriptor č
Záhlaví dešifrování archivu
Archivujte extra datový záznam
Centrální adresář
Nejzajímavější je centrální adresář, který obsahuje metadata o souborech v archivu. Centrální adresář vždy začíná podpisem 0x50 0x4b 0x01 0x02 a končí podpisem 0x50 0x4b 0x05 0x06, za nímž následuje 18 bytů metadat. Zajímavé je, že prázdné archivy se skládají pouze z konečného podpisu a 18 prázdných bajtů. Po 18 bajtech následuje oblast komentářů k archivu, což je ideální kontejner pro skrytí souboru.

Chcete -li zkontrolovat archiv ZIP, musíte najít konečný podpis centrálního adresáře, přeskočit 18 bajtů a hledat podpisy známých formátů v oblasti komentářů. Velká velikost komentáře také naznačuje skutečnost lepení.

Na velikosti záleží

AVI

Struktura souboru AVI je následující: každý soubor začíná podpisem RIFF (0x52 0x49 0x46 0x46). Na 8. bajtu je podpis AVI určující formát (0x41 0x56 0x49 0x20). Blok na offsetu 4, skládající se ze 4 bajtů, obsahuje počáteční velikost datového bloku (v malém pořadí bajtů endian). Chcete-li zjistit číslo bloku obsahujícího další velikost, musíte přidat velikost záhlaví (8 bajtů) a velikost získanou v bloku o 4 až 8 bajtech. Tím se vypočítá celková velikost souboru. Předpokládá se, že vypočítaná velikost může být menší než skutečná velikost souboru. Po vypočítané velikosti bude soubor obsahovat pouze nulové bajty (potřebné k zarovnání ohraničení 1 kB).

Příklad výpočtu velikosti:


Wav

Stejně jako AVI začíná soubor WAV podpisem RIFF, ale tento soubor má 8bajtový podpis - WAVE (0x57 0x41 0x56 0x45). Velikost souboru se vypočítává stejným způsobem jako AVI. Skutečná velikost by měla být přesně stejná jako vypočítaná.

MP4

MP4 nebo MPEG-4 je formát kontejneru médií používaný k ukládání video a audio streamů a také poskytuje úložiště titulků a obrázků.
Při posunu 4 bajty jsou umístěny podpisy: typ souboru ftyp (66 74 79 70) (typ souboru kontejneru QuickTime) a podtyp souboru mmp4 (6D 6D 70 34). Abychom rozpoznali skryté soubory, zajímá nás schopnost vypočítat velikost souboru.

Podívejme se na příklad. Velikost prvního bloku je na offsetové nule a je rovna 28 (00 00 00 1C, pořadí bajtů Big Endian); také ukazuje na ofset, kde se nachází velikost druhého bloku dat. Na offsetu 28 najdeme další velikost bloku rovnou 8 (00 00 00 08). Chcete -li zjistit další velikost bloku, sečtěte velikosti předchozích nalezených bloků. Velikost souboru se tedy vypočítá:

MOV

Tento široce používaný formát je také kontejner MPEG-4. MOV používá proprietární algoritmus komprese dat, má strukturu podobnou MP4 a používá se ke stejnému účelu - k ukládání zvukových a obrazových dat a souvisejících materiálů.
Stejně jako MP4 má jakýkoli mov soubor 4bajtový podpis ftyp na offsetu 4, následující podpis má však hodnotu qt__ (71 74 20 20). Pravidlo pro výpočet velikosti souboru se nezměnilo: počínaje od začátku souboru vypočítáme velikost dalšího bloku a přidáme jej.

Způsob kontroly této skupiny formátů na přítomnost „slepených“ souborů spočívá ve výpočtu velikosti podle výše uvedených pravidel a ve srovnání s velikostí skenovaného souboru. Pokud je aktuální velikost souboru mnohem menší než vypočítaná, pak to znamená skutečnost, že dochází ke sloučení. Při kontrole souborů AVI se předpokládá, že vypočítaná velikost může být menší než velikost souboru kvůli přítomnosti přidaných nul pro zarovnání ohraničení. V takovém případě je nutné po vypočítané velikosti souboru zkontrolovat nuly.

Kontrola binárního formátu složeného souboru

Tento formát souboru vyvinutý společností Microsoft je známý také jako OLE (Object Linking and Embedding) nebo COM (Component Object Model). Soubory DOC, XLS, PPT patří do skupiny formátů CFB.

Soubor CFB se skládá z 512 bajtového záhlaví a sektorů stejné délky, které ukládají datové toky nebo informace o službě. Každý sektor má své vlastní nezáporné číslo, s výjimkou speciálních čísel: „-1“-čísluje volný sektor, „-2“-čísluje sektor, který uzavírá řetězec. Všechny sektorové řetězce jsou definovány v tabulce FAT.

Předpokládejme, že útočník upravil soubor doc a na jeho konec vložil jiný soubor. Existuje několik různých způsobů, jak to zjistit nebo označit anomálii v dokumentu.

Abnormální velikost souboru

Jak bylo uvedeno výše, jakýkoli soubor CFB se skládá ze záhlaví a sektorů stejné délky. Chcete-li zjistit velikost sektoru, musíte přečíst dvoubajtové číslo na offsetu 30 od začátku souboru a zvýšit 2 na sílu tohoto čísla. Toto číslo se musí rovnat buď 9 (0x0009), nebo 12 (0x000C), respektive velikost sektoru souboru je 512 nebo 4096 bajtů. Po nalezení sektoru musíte zkontrolovat následující rovnost:

(Velikost souboru - 512) mod SectorSize = 0

Pokud tato rovnost není splněna, můžete uvést skutečnost, že soubory se sloučí. Tato metoda má však značnou nevýhodu. Pokud útočník zná velikost sektoru, stačí mu nalepit soubor a n dalších bajtů, aby velikost lepených dat byla násobkem velikosti sektoru.

Neznámý typ sektoru

Pokud útočník ví o metodě, jak obejít předchozí kontrolu, pak tato metoda dokáže detekovat přítomnost sektorů s nedefinovanými typy.

Pojďme definovat rovnost:

FileSize = 512 + CountReal * SectorSize, kde FileSize je velikost souboru, SectorSize je velikost sektoru, CountReal je počet sektorů.

Rovněž definujeme následující proměnné:

  1. CountFat - počet FAT sektorů. Nachází se na offsetu 44 od začátku souboru (4 bajty);
  2. CountMiniFAT - počet sektorů MiniFAT. Nachází se na offsetu 64 od začátku souboru (4 bajty);
  3. CountDIFAT - počet sektorů DIFAT. Nachází se na posunu 72 od začátku souboru (4 bajty);
  4. CountDE je počet sektorů záznamu do adresáře. Abyste našli tuto proměnnou, musíte najít první sektor DE, který se nachází na offsetu 48. Poté musíte získat úplnou reprezentaci DE z FAT a spočítat počet sektorů DE;
  5. CountStreams - počet sektorů s datovými toky;
  6. CountFree - počet volných sektorů;
  7. CountClassified - počet sektorů s konkrétním typem;
CountClassified = CountFAT + CountMiniFAT + CountDIFAT + CountDE + CountStreams + CountFree

Je zřejmé, že s nerovností CountClassified a CountReal můžeme dojít k závěru, že soubory mohou být sloučeny.