DZWONEK

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu

Wiele osób słyszało o plikach takich jak rarjpeg "i. Jest to specjalny rodzaj pliku, który jest sklejony ze sobą obraz jpeg i archiwum rar. Jest to doskonały pojemnik do ukrywania faktu przesyłania informacji. Możesz utworzyć rarjpeg za pomocą następujących poleceń:

UNIX: cat image1.jpg archive.rar\u003e image2.jpg
WINDOWS: copy / b image1.jpg + archive.rar image2.jpg

Lub jeśli masz edytor szesnastkowy.

Oczywiście, aby ukryć fakt przekazywania informacji, możesz użyć nie tylko formatu JPEG, ale także wielu innych. Każdy format ma swoją własną charakterystykę, dzięki czemu może być odpowiedni lub nie do roli kontenera. Opiszę, jak znaleźć klejone pliki w najpopularniejszych formatach lub wskażę fakt klejenia.

Metody wykrywania sklejonych plików można podzielić na trzy grupy:

  1. Metoda sprawdzania obszaru za znacznikiem EOF. Wiele popularnych formatów plików ma tak zwany marker końca pliku, który odpowiada za wyświetlanie pożądanych danych. Na przykład przeglądarki zdjęć odczytują wszystkie bajty do tego znacznika, jednak obszar po nim pozostaje ignorowany. Ta metoda jest idealna dla formatów: JPEG, PNG, GIF, ZIP, RAR, PDF.
  2. Metoda sprawdzania rozmiaru pliku. Struktura niektórych formatów (kontenery audio i wideo) pozwala obliczyć rzeczywisty rozmiar pliku i porównać go z rozmiarem oryginalnym. Formaty: AVI, WAV, MP4, MOV.
  3. Metoda sprawdzania plików CFB. CFB lub Compound File Binary Format - format dokumentu opracowany przez Microsoft, który jest kontenerem z własnym systemem plików. Ta metoda opiera się na wykrywaniu anomalii w pliku.

Czy po zakończeniu pliku jest życie?

Jpeg

Aby znaleźć odpowiedź na to pytanie, należy zagłębić się w specyfikację formatu, który jest „przodkiem” sklejonych plików i zrozumieć jego strukturę. Każdy plik JPEG zaczyna się od podpisu 0xFF 0xD8.

Po tym podpisie znajduje się informacja serwisowa, opcjonalnie ikona obrazu, a na końcu sam skompresowany obraz. W tym formacie koniec obrazu jest oznaczony dwubajtowym podpisem 0xFF 0xD9.

PNG

Pierwsze osiem bajtów pliku PNG to następujący podpis: 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A. Sygnatura końcowa kończąca strumień danych: 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82.

Rar

Wspólny podpis dla wszystkich archiwów rar: 0x52 0x61 0x72 0x21 (Rar!). Po tym następuje informacja o wersji archiwum i innych powiązanych danych. Ustalono eksperymentalnie, że archiwum kończy się podpisem 0x0A, 0x25, 0x25, 0x45, 0x4F, 0x46.

Tabela formatów i ich podpisów:
Algorytm kontroli klejenia w tych formatach jest niezwykle prosty:

  1. Znajdź początkowy podpis;
  2. Znajdź najlepszy podpis;
  3. Jeśli po podpisie końcowym nie ma danych, plik jest czysty i nie zawiera żadnych załączników! W przeciwnym razie konieczne jest wyszukiwanie innych formatów po podpisie końcowym.

GIF i PDF

Dokument PDF może zawierać więcej niż jeden znacznik EOF, na przykład z powodu nieprawidłowego wygenerowania dokumentu. Liczba podpisów końcowych w pliku GIF jest równa liczbie zawartych w nim ramek. W oparciu o funkcje tych formatów możesz ulepszyć algorytm sprawdzania obecności sklejonych plików.
  1. Punkt 1 powtarza się z poprzedniego algorytmu.
  2. Punkt 2 powtarza się z poprzedniego algorytmu.
  3. Po znalezieniu końcowego podpisu pamiętaj jego lokalizację i szukaj dalej;
  4. Jeśli w ten sposób dojdziesz do ostatniego tokena EOF, plik jest czysty.
  5. Jeśli plik nie kończy się podpisem końcowym - goto jest miejscem ostatniego znalezionego podpisu końcowego.
Duża różnica między rozmiarem pliku a pozycją po ostatniej sygnaturze końcowej wskazuje na obecność przyklejonego załącznika. Różnica może wynosić więcej niż dziesięć bajtów, chociaż można ustawić inne wartości.

zamek błyskawiczny

Osobliwością archiwów ZIP jest obecność trzech różnych podpisów: Struktura archiwum jest następująca:
Lokalny nagłówek pliku 1
Dane pliku 1
Deskryptor danych 1
Lokalny nagłówek pliku 2
Dane pliku 2
Deskryptor danych 2
...
Lokalny nagłówek pliku n
Dane pliku n
Deskryptor danych n
Nagłówek deszyfrujący archiwum
Zarchiwizuj dodatkowy rekord danych
Centralny katalog
Najciekawszy jest katalog centralny, który zawiera metadane dotyczące plików w archiwum. Katalog centralny zawsze zaczyna się od sygnatury 0x50 0x4b 0x01 0x02 i kończy się sygnaturą 0x50 0x4b 0x05 0x06, po której następuje 18 bajtów metadanych. Co ciekawe, puste archiwa składają się tylko z końcowego podpisu i 18 bajtów zerowych. Po 18 bajtach znajduje się obszar komentarza do archiwum, który jest idealnym pojemnikiem do ukrywania pliku.

Aby sprawdzić archiwum ZIP, musisz znaleźć końcową sygnaturę centralnego katalogu, pominąć 18 bajtów i poszukać sygnatur znanych formatów w polu komentarza. Duży rozmiar komentarza wskazuje również na fakt klejenia.

Rozmiar ma znaczenie

Avi

Struktura pliku AVI jest następująca: każdy plik zaczyna się od podpisu RIFF (0x52 0x49 0x46 0x46). Na 8 bajtach znajduje się format określający podpis AVI (0x41 0x56 0x49 0x20). Blok o przesunięciu 4, składający się z 4 bajtów, zawiera początkowy rozmiar bloku danych (kolejność bajtów - mały endian). Aby znaleźć numer bloku zawierającego następny rozmiar, musisz dodać rozmiar nagłówka (8 bajtów) i rozmiar uzyskany w bloku 4-8 bajtów. W ten sposób obliczany jest pełny rozmiar pliku. Zakłada się, że obliczony rozmiar może być mniejszy niż rzeczywisty rozmiar pliku. Po obliczonym rozmiarze plik będzie zawierał tylko zero bajtów (niezbędne do wyrównania granicy 1 KB).

Przykład obliczenia rozmiaru:


WAV

Podobnie jak AVI, plik WAV zaczyna się od podpisu RIFF, jednak plik ten ma podpis 8 bajtów - WAVE (0x57 0x41 0x56 0x45). Rozmiar pliku jest obliczany w taki sam sposób jak AVI. Rzeczywisty rozmiar powinien być dokładnie taki sam jak obliczony.

Mp4

MP4 lub MPEG-4 - format kontenera multimediów służący do przechowywania strumieni wideo i audio, zapewnia również przechowywanie napisów i obrazów.
Przy przesunięciu 4 bajtów znajdują się sygnatury: typ pliku ftyp (66 74 79 70) (typ pliku kontenera QuickTime) i podtyp pliku mmp4 (6D 6D 70 34). Aby rozpoznać ukryte pliki, jesteśmy zainteresowani możliwością obliczenia rozmiaru pliku.

Rozważ przykład. Rozmiar pierwszego bloku ma zerowe przesunięcie i wynosi 28 (00 00 00 1C, kolejność bajtów Big Endian); wskazuje także przesunięcie, w którym znajduje się rozmiar drugiego bloku danych. Przy 28 przesunięciu znajdujemy kolejny rozmiar bloku równy 8 (00 00 00 08). Aby znaleźć następny rozmiar bloku, musisz dodać rozmiary znalezionych wcześniej bloków. W związku z tym obliczany jest rozmiar pliku:

Mov

Ten szeroko stosowany format to także kontener MPEG-4. MOV wykorzystuje zastrzeżony algorytm kompresji danych, ma strukturę podobną do MP4 i jest wykorzystywany do tych samych celów - do przechowywania danych audio i wideo, a także powiązanych materiałów.
Podobnie jak MP4, każdy plik mov ma 4-bajtową sygnaturę ftyp przy 4 przesunięciach, jednak następująca sygnatura ma wartość qt__ (71 74 20 20). Reguła obliczania rozmiaru pliku nie uległa zmianie: od początku pliku obliczamy rozmiar następnego bloku i dodajemy go.

Metoda sprawdzania tej grupy formatów na obecność „sklejonych” plików polega na obliczeniu rozmiaru zgodnie z powyższymi regułami i porównaniu go z rozmiarem sprawdzanego pliku. Jeśli bieżący rozmiar pliku jest znacznie mniejszy niż obliczony, oznacza to fakt klejenia. Podczas sprawdzania plików AVI zakłada się, że obliczony rozmiar może być mniejszy niż rozmiar pliku ze względu na obecność dodanych zer w celu wyrównania granicy. W takim przypadku konieczne jest sprawdzenie zer po obliczonym rozmiarze pliku.

Sprawdzanie formatu binarnego pliku złożonego

Ten format pliku opracowany przez Microsoft jest również znany jako OLE (Object Linking and Embedding) lub COM (Component Object Model). Pliki DOC, XLS, PPT należą do grupy formatów CFB.

Plik CFB składa się z 512-bajtowego nagłówka i sektorów o tej samej długości, które przechowują strumienie danych lub informacje o usłudze. Każdy sektor ma swoją nieujemną liczbę, z wyjątkiem liczb specjalnych: „-1” - numeruje wolny sektor, „-2” - numeruje sektor, który zamyka łańcuch. Wszystkie łańcuchy sektorów są zdefiniowane w tabeli FAT.

Załóżmy, że osoba atakująca zmodyfikowała określony plik dokumentu i wkleiła inny plik na jego końcu. Istnieje kilka różnych sposobów jego wykrycia lub wskazania anomalii w dokumencie.

Nieprawidłowy rozmiar pliku

Jak wspomniano powyżej, każdy plik CFB składa się z nagłówka i sektorów o równej długości. Aby ustalić rozmiar sektora, musisz odczytać dwubajtową liczbę z przesunięciem 30 na początku pliku i podnieść 2 do potęgi tej liczby. Liczba ta musi być równa odpowiednio 9 (0x0009) lub 12 (0x000C), rozmiar sektora pliku wynosi 512 lub 4096 bajtów. Po znalezieniu sektora należy sprawdzić następującą równość:

(FileSize - 512) mod SectorSize \u003d 0

Jeśli ta równość nie jest spełniona, możemy wskazać fakt klejenia plików. Jednak ta metoda ma znaczną wadę. Jeśli atakujący zna rozmiar sektora, musi po prostu przykleić swój plik i kolejne n bajtów, aby rozmiar sklejonych danych był wielokrotnością rozmiaru sektora.

Nieznany typ sektora

Jeśli atakujący wie o metodzie obejścia poprzedniej kontroli, ta metoda może wykryć obecność sektorów o nieokreślonym typie.

Zdefiniuj równość:

FileSize \u003d 512 + CountReal * SectorSize, gdzie FileSize to rozmiar pliku, SectorSize to rozmiar sektora, CountReal to liczba sektorów.

Definiujemy również następujące zmienne:

  1. CountFat - liczba sektorów FAT. Znajduje się na 44. przesunięciu od początku pliku (4 bajty);
  2. CountMiniFAT - liczba sektorów MiniFAT. Znajduje się w odległości 64 przesunięcia od początku pliku (4 bajty);
  3. CountDIFAT - liczba sektorów DIFAT. Znajduje się pod 72 przesunięciem od początku pliku (4 bajty);
  4. CountDE - liczba sektorów wpisów do katalogu. Aby znaleźć tę zmienną, musisz znaleźć pierwszy sektor DE, który ma 48 stronniczość. Następnie musisz uzyskać pełny widok DE z FAT i obliczyć liczbę sektorów DE;
  5. CountStreams - liczba sektorów ze strumieniami danych;
  6. CountFree - liczba wolnych sektorów;
  7. CountClassified - liczba sektorów o określonym typie;
CountClassified \u003d CountFAT + CountMiniFAT + CountDIFAT + CountDE + CountStreams + CountFree

Oczywiście przy nierówności CountClassified i CountReal możemy dojść do wniosku o możliwym sklejeniu plików.

Kod funkcji (FC) w nagłówku telegramu identyfikuje typ telegramu, taki jak telegram żądania (żądanie lub wysyłanie / żądanie) oraz telegram potwierdzenia lub odpowiedzi (ramka potwierdzenia, ramka odpowiedzi). Ponadto kod funkcji zawiera aktualną funkcję transmisji i informacje sterujące, które zapobiegają utracie i powieleniu komunikatów, lub typ stacji ze statusem FDL.

7 6 5 4 3 2 1 0 FC: Żądanie kodu funkcji
1 Poproś o telegramm
X FCV \u003d bit naprzemienny włączony
X href \u003d "http://profibus.felser.ch/en/funktionscode.htm#aufruffolgebit"\u003e FCB \u003d Bit naprzemienny (od liczby klatek)
1 0 (0x0) CV \u003d wartość zegara ()
1 inny Zarezerwowany
0 0 (0x0) TE \u003d Zdarzenie czasowe (synchronizacja zegara)
0 3 (0x3) SDA_LOW \u003d Wyślij dane potwierdzone - niski priorytet
0 4 (0x4) SDN_LOW \u003d Wyślij dane niepotwierdzone - niski priorytet
0 5 (0x5) SDA_HIGH \u003d Wyślij dane potwierdzone - wysoki priorytet
0 6 (0x6) SDN_HIGH \u003d Wyślij dane niepotwierdzone
0 7 (0x7) MSRD \u003d Wyślij dane żądania z odpowiedzią Multicast
0 9 (0x9) Zażądaj statusu FDL
0 12 (0xC) SRD low \u003d Wyślij i poproś o dane
0 13 (0xD) SRD high \u003d Wyślij i poproś o dane
0 14 (0xE) Poproś o identyfikator z odpowiedzią
0 15 (0xF) Żądanie statusu LSAP z odpowiedzią 1)
0 inny Zarezerwowany

1) ta wartość znajduje się w ostatniej wersji standardu, która nie jest już zdefiniowana, ale zarezerwowana

7 6 5 4 3 2 1 0 FC: Odpowiedź kodu funkcji
0 Telegram odpowiedzi
0 Zarezerwowany
0 0 Niewolnik
0 1 Mistrz nie jest gotowy
1 0 Mistrz gotowy, bez tokena
1 1 Mistrz gotowy, w tokenie pierścienia
0 (0x0) Ok
1 (0x1) UE \u003d Błąd użytkownika
2 (0x2) RR \u003d brak zasobów
3 (0x3) RS \u003d SAP nie włączony
8 (0x8) DL \u003d Data Low (normalny przypadek z DP)
9 (0x9) NR \u003d Brak danych odpowiedzi
10 (0xA) DH \u003d Data High (diagnostyka DP w toku)
12 (0xC) RDL \u003d Brak danych i brak danych
13 (0xD) RDH \u003d Dane nieotrzymane i dane wysokie
inny Zarezerwowany

Bit zliczania ramek Bit zliczania ramek FCB (b5) zapobiega duplikowaniu wiadomości przez stację potwierdzającą lub odpowiadającą (odpowiadającą) oraz wszelką utratę przez stację wywołującą (inicjator). Wyłączone z tego są żądania bez potwierdzenia (SDN) oraz żądania statusu FDL, identyfikatora i statusu LSAP.

Dla sekwencji bezpieczeństwa inicjator musi nosić FCB dla każdego respondenta. Gdy telegram żądania (żądanie lub wysyłanie / żądanie) jest wysyłany do respondera po raz pierwszy lub jeśli jest on ponownie wysyłany do respondenta oznaczonego obecnie jako nieoperacyjny, FCB należy ustawić zgodnie z definicją w responderze. Inicjator osiąga to w telegramie żądania z FCV \u003d 0 i FCB \u003d 1. Odpowiadający musi ocenić ten telegram jako pierwszy cykl wiadomości i zapisać FCB \u003d 1 wraz z adresem inicjatora (SA) (patrz poniższa tabela). Ten cykl wiadomości nie będzie powtarzany przez inicjatora. W kolejnych telegramach żądania do tego samego respondera inicjator musi ustawić FCV \u003d 1 i zmieniać FCB przy każdym nowym telegramie żądania. Każdy respondent, który otrzyma telegram żądania zaadresowany do niego z FCV \u003d 1, musi ocenić FCB. Jeśli FCB zmienił się w porównaniu z ostatnim telegramem żądania od tego samego inicjatora (tego samego SA), jest to prawidłowe potwierdzenie, że poprzedni cykl komunikatów został poprawnie zakończony. Jeśli telegram żądania pochodzi od innego inicjatora (innego SA), ocena FCB nie jest już konieczna. W obu przypadkach osoba odpowiadająca musi zapisać FCB ze źródłowym SA do momentu otrzymania nowego telegramu zaadresowanego do niego. W przypadku zagubionego lub uszkodzonego telegramu potwierdzenia lub odpowiedzi inicjator nie może zmienić FCB w ponownej próbie: oznacza to, że poprzedni cykl komunikatów był wadliwy. Jeśli respondent otrzyma telegram żądania z FCV \u003d 1 i tym samym FCB co ostatni telegram żądania od tego samego inicjatora (tego samego SA), będzie to oznaczać ponowienie żądania. Odpowiadający musi z kolei ponownie wysłać telegram potwierdzenia lub odpowiedzi przechowywany w gotowości. Do czasu wyżej wspomnianego potwierdzenia lub otrzymania telegramu z innym adresem (SA lub DA), który nie został potwierdzony (Wyślij dane bez potwierdzenia, SDN), osoba odpowiadająca musi przechowywać ostatnie potwierdzenie lub odpowiedź telegramu w gotowości na każde możliwe ponowne żądanie . W przypadku telegramów żądań, które nie są potwierdzone, a żądaniem jest status FDL, identyfikator i status LSAP, FCV \u003d 0 i FCB \u003d 0; ocena osoby udzielającej odpowiedzi nie jest już konieczna.

b5 b4 Pozycja bitu
FCB FCV Stan: schorzenie Znaczenie Akcja
0 0 DA \u003d TS / 127 Żądanie bez potwierdzenia
Żądanie statusu FDL / identyfikatora / statusu LSAP
Usuń ostatnie potwierdzenie
0/1 0/1 DA # TS Zapytanie do innego respondenta
1 0 DA \u003d TS Pierwsza prośba FCBM: \u003d 1
SAM: \u003d SA
Usuń ostatnie potwierdzenie / odpowiedź
0/1 1 DA \u003d TS
SA \u003d SAM
FCB # FCBM
Nowa prośba Usuń ostatnie potwierdzenie / odpowiedź
FCBM: \u003d FCB
Przytrzymaj potwierdzenie / odpowiedź w gotowości do ponownej próby
0/1 1 DA \u003d TS
SA \u003d SAM
FCB \u003d FCBM
Ponów żądanie FCBM: \u003d FCB
Powtórz potwierdzenie / odpowiedź i nadal utrzymuj gotowość
0/1 1 DA \u003d TS
SA # SAM
Nowy inicjator FCBM: \u003d FCB
SAM: \u003d SA Wstrzymaj potwierdzenie / odpowiedź w gotowości do ponownej próby

FCBM zapisał FCB w pamięci SAM zapisał SA w pamięci

Pojęcie „ magiczny numer»W programowaniu ma trzy znaczenia:

  • Podpis danych
  • Wyróżnione unikalne wartości, które nie powinny pokrywać się z innymi wartościami (na przykład UUID)
  • Zła praktyka programowania.

Podpis danych

magiczny numerlub podpis, jest liczbą całkowitą lub stałą tekstową służącą do jednoznacznej identyfikacji zasobu lub danych. Taka liczba sama w sobie nie ma sensu i może powodować dezorientację, ponieważ spotkała się w kodzie programu bez odpowiedniego kontekstu lub komentarza, a próba zmiany jej na inną, nawet o zbliżonej wartości, może prowadzić do absolutnie nieprzewidywalnych konsekwencji. Z tego powodu takie liczby były ironicznie nazywane magią. Obecnie ta nazwa jest mocno zakorzeniona jako termin. Na przykład dowolna skompilowana klasa Java zaczyna się od szesnastkowej magicznej liczby 0xCAFEBABE. Drugim powszechnie znanym przykładem jest to, że każdy plik wykonywalny Microsoft Windows z rozszerzeniem .exe zaczyna się sekwencją bajtów 0x4D5A (co odpowiada znakom ASCII MZ - inicjałów Marka Zbikowskiego, jednego z twórców MS-DOS). Mniej znanym przykładem jest niezainicjowany wskaźnik w Microsoft Visual C ++ (począwszy od wersji 2005 Microsoft Visual Studio), który w trybie debugowania ma adres 0xDEADBEEF.

W systemach operacyjnych typu UNIX typ pliku jest zwykle określany przez podpis pliku, niezależnie od rozszerzenia jego nazwy. Aby zinterpretować podpis pliku, udostępniają standardowe narzędzie do obsługi plików.

Zła praktyka programowania

Zwane także „magicznymi liczbami” to zła praktyka programowania, gdy w tekście źródłowym znajduje się wartość liczbowa i nie jest oczywiste, co to znaczy. Na przykład taki fragment napisany w Javie byłby zły:

drawSprite (53, 320, 240);

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

Teraz jest jasne: ta linia wyświetla duszka na środku ekranu - celownik celownika. W większości języków programowania wszystkie wartości zastosowane dla takich stałych zostaną obliczone na etapie kompilacji i zastąpione w miejscu użycia wartości. Dlatego taka zmiana tekstu źródłowego nie wpływa na wydajność programu.

Ponadto magiczne liczby są potencjalnym źródłem błędów programu:

  • Jeśli ta sama liczba magiczna zostanie użyta w programie więcej niż jeden raz (lub może być potencjalnie użyta), wówczas jej zmiana będzie wymagać edycji każdego wystąpienia (zamiast tylko edycji wartości nazwanej stałej). Jeśli nie wszystkie wystąpienia zostaną poprawione, wystąpi co najmniej jeden błąd.
  • W co najmniej jednym przypadku magiczna liczba może być pisana od początku niepoprawnie i jest raczej trudna do wykrycia.
  • Magiczna liczba może zależeć od niejawnego parametru lub innej magicznej liczby. Jeśli te zależności, które nie zostały jednoznacznie zidentyfikowane, nie zostaną spełnione, wystąpi co najmniej jeden błąd.
  • Modyfikując występowanie jednej magicznej liczby, możesz przez pomyłkę zmienić inną magiczną liczbę, niezależną, ale mającą tę samą wartość liczbową.

Liczby magiczne i wieloplatformowe

Czasami magiczne liczby szkodzą kodowi na różnych platformach. Faktem jest, że w C, 32- i 64-bitowych systemach operacyjnych gwarantuje rozmiar typów char, short i long long, podczas gdy rozmiary int, long, size_t i ptrdiff_t mogą się różnić (dla pierwszych dwóch, w zależności od preferencji twórców kompilatora , w dwóch ostatnich - w zależności od pojemności systemu docelowego). Stary lub niewykwalifikowany kod może zawierać „magiczne liczby”, które oznaczają rozmiar pewnego rodzaju - przy przełączaniu na maszyny o różnych głębokościach bitów mogą prowadzić do subtelnych błędów.

Na przykład:

const size_t NUMBER_OF_ELEMENTS \u003d 10; długi [NUMBER_OF_ELEMENTS]; memset (a, 0, 10 * 4); // źle - implikuje, że długi jest 4 bajty, używana jest magiczna liczba elementów memset (a, 0, NUMBER_OF_ELEMENTS * 4); // źle - implikuje, że długi jest 4 bajty memset (a, 0, NUMBER_OF_ELEMENTS * sizeof (długi)); // niezupełnie słuszne - powielenie nazwy typu (jeśli typ się zmieni, będziesz musiał również zmienić tutaj) memset (a, 0, NUMBER_OF_ELEMENTS * sizeof (a [0])); // poprawne, optymalne dla tablic dynamicznych o niezerowym rozmiarze memset (a, 0, sizeof (a)); // poprawne, optymalne dla tablic statycznych

Liczby, które nie są magiczne

Nie wszystkie liczby muszą być przeniesione do stałych. Na przykład kod dla

Wyszukiwanie plików znanych typów podczas skanowania (lub, jak często mówią, wyszukiwanie plików według podpisu) jest jednym z najbardziej efektywnych plików używanych w narzędziu do odzyskiwania danych R-Studio. Użycie określonego podpisu pozwala przywrócić pliki określonego typu w przypadku, gdy częściowo lub całkowicie brakuje (uszkodzonych) informacji o strukturze katalogów i nazwach plików.

Zazwyczaj tabela partycji dysku służy do określania lokalizacji plików. Jeśli porównasz dysk z książką, tablica partycji będzie podobna do spisu treści. Podczas skanowania R-Studio szuka plików znanych typów w tabeli partycji dysku w poszukiwaniu określonych określonych podpisów. Jest to możliwe, ponieważ praktycznie każdy typ pliku ma unikalny wzór sygnatury lub danych. Podpisy plików znajdują się w określonej lokalizacji na początku pliku, aw wielu przypadkach także na końcu pliku. Podczas skanowania R-Studio porównuje znalezione dane z podpisami plików znanych typów, co pozwala na ich identyfikację i przywrócenie danych.

Korzystając z technologii skanowania plików znanych typów, R-Studio pozwala odzyskać dane z sformatowanych dysków, a także z zastąpionych tabel partycji. Ponadto, jeśli partycja dysku zostanie nadpisana, uszkodzona lub usunięta, skanowanie plików znanych typów jest jedyne możliwe.

Ale prawie zawsze i we wszystkim są wady, a pliki znanych typów używane w R-Studio nie są wyjątkiem. Tak więc podczas skanowania plików znanych typów R-Studio pozwala przywracać tylko pliki niefragmentowane, ale jak już wspomniano, w większości przypadków jest to ostatnia z możliwych metod.

Struktura R-Studio zawiera już sygnatury najpopularniejszych typów plików (pełna lista znanych typów plików znajduje się w sekcji Pomoc online R-Studio).

W razie potrzeby użytkownik może dodać nowe typy plików do składu R-Studio. Na przykład, jeśli chcesz znaleźć pliki dowolnego unikalnego typu lub opracowane po dacie ostatniego wydania R-Studio, możesz dodać własne podpisy do składu plików znanych typów. Następnie ten proces zostanie wzięty pod uwagę.

Niestandardowe typy plików
Niestandardowe sygnatury plików znanych typów plików są przechowywane w pliku XML określonym w oknie dialogowym Ustawienia. Dodanie podpisu składa się z dwóch części:

  1. Definicja podpisu pliku znajdująca się na początku pliku i jeśli jest na końcu pliku.
  2. Utwórz plik XML zawierający podpis pliku i inne informacje o typie pliku.

Wszystko to można zrobić za pomocą R-Studio. W takim przypadku nie musisz być ekspertem w dziedzinie kompilacji (edycji) dokumentów XML lub w dziedzinie edycji szesnastkowej - w tym przewodniku (artykule), skoncentrowanym na użytkowniku na poziomie podstawowym, wszystkie etapy tego procesu zostaną szczegółowo zbadane.

Przykład: dodawanie podpisu do pliku MP4 (kodek XDCam-EX)
Rozważ dodanie podpisu pliku na przykładzie pliku .MP4 utworzonego za pomocą Sony XDCAM-EX. Można go użyć na przykład w przypadku uszkodzenia karty SD, której nie udało się jeszcze zapisać na dysku twardym komputera.

Etap pierwszy: Definiowanie podpisu pliku
Aby określić podpis pliku, rozważ przykłady plików o tym samym formacie.

Niech te cztery pliki wideo od Sony XDCAM-EX:
ZRV-3364_01.MP4
ZRV-3365_01.MP4
ZRV-3366_01.MP4
ZRV-3367_01.MP4

Dla wygody niech będą to małe pliki. Większe pliki są trudniejsze do przeglądania w systemie szesnastkowym.

1. Otwórz pliki w R-Studio. Aby to zrobić, kliknij prawym przyciskiem myszy każdy plik i wybierz opcję Wyświetl / edytuj w menu kontekstowym.

2. Porównaj pliki. Poszukamy tego samego szablonu znalezionego we wszystkich czterech plikach. On będzie podpis pliku. Zazwyczaj podpisy plików znajdują się na początku pliku, ale czasem na końcu.

3. Zdefiniuj podpis pliku na początku pliku. W naszym przykładzie jest to na samym początku pliku. Pamiętaj, że nie zawsze tak się dzieje - często podpis pliku znajduje się na początku pliku, ale nie w pierwszym wierszu (przesunięcie).

Z poniższych zdjęć wynika, że \u200b\u200bzawartość wszystkich czterech plików jest inna, ale wszystkie zaczynają się od tej samej sygnatury pliku.


Kliknij na zdjęcie, aby powiększyć


Kliknij na zdjęcie, aby powiększyć


Kliknij na zdjęcie, aby powiększyć


Kliknij na zdjęcie, aby powiększyć

Wybrany obszar na obrazach jest sygnaturą pliku tego typu. Jest prezentowany zarówno w formie tekstowej, jak i szesnastkowej.

W formie tekstowej podpis pliku wygląda następująco:
.... ftypmp42 .... mp42 ........ za darmo

Kropki („.”) Wskazują symbole, których nie można przedstawić w formie tekstowej. Dlatego musisz również podać szesnastkową formę podpisu pliku:
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. W ten sam sposób definiujemy podpis pliku, ale na samym końcu pliku. Może to być inny podpis pliku, o innej długości.

Na poniższych obrazach podpis pliku jest podświetlony na końcu pliku:


Kliknij na zdjęcie, aby powiększyć


Kliknij na zdjęcie, aby powiększyć


Kliknij na zdjęcie, aby powiększyć


Kliknij na zdjęcie, aby powiększyć

Należy pamiętać, że dane przed wybranym obszarem (podpis pliku) we wszystkich czterech plikach są takie same. Jest to informacja techniczna, która nie jest sygnaturą pliku, ale sugeruje, że wszystkie cztery zdjęcia (pliki) zostały wykonane przy użyciu tego samego aparatu o tych samych parametrach. Zazwyczaj można odróżnić pasujące wzorce z informacjami technicznymi od podpisu pliku. W naszym przykładzie w ostatnim wierszu przed rozpoczęciem podpisu pliku widzimy tekst „RecordingMode type \u003d” normal ”, co wyraźnie wskazuje, że jest to jakiś parametr pliku, a nie podpis. Zawsze zwracaj szczególną uwagę na tę linię, aby nie omyłkowo dołączyć informacji technicznych do podpisu pliku.

W naszym przypadku podpis pliku ma następujący tekst:
...
Przypomnij sobie, że kropki oznaczają symbole, których nie można przedstawić w formie tekstowej.

W postaci szesnastkowej sygnatura pliku wygląda następująco:
3N 2F 4E 6F 6E 52 65 61 6N 54 69 6A 65 4A 65 74 61 3E 0D 0A 00
Uwaga: podpis nie zawsze będzie znajdować się na końcu pliku.

Drugi krok: tworzenie pliku XML opisującego znany typ pliku
Teraz, po ustaleniu podpisu pliku, możesz utworzyć plik XML i dołączyć odpowiedni typ pliku w R-Studio. Można to zrobić na dwa sposoby:

2.1 Korzystanie z wbudowanego edytora graficznego podpisów plików:
Wybierz element Ustawienia w menu Narzędzia, w oknie dialogowym Ustawienia, które zostanie otwarte, kliknij kartę Znane typy plików, a następnie kliknij przycisk Edytuj typy plików użytkownika.

Kliknij na zdjęcie, aby powiększyć

Kliknij przycisk Utwórz typ pliku w oknie dialogowym Edytuj typy plików użytkownika.
Ustaw następujące opcje:

  • Id to unikalny identyfikator cyfrowy. Liczba ta zostanie wybrana losowo; jedyną rzeczą jest to, że nie powinien pokrywać się z cyfrowym identyfikatorem innego rodzaju pliku.
  • Opis grupy - grupa, w której zostaną znalezione pliki w R-Studio. Możesz określić nową grupę lub wybrać jedną z już istniejących. Będziemy mieć tę grupę „Multimedia Video (Multimedia: Video)”.
  • Opis - krótki opis typu pliku. W naszym przykładzie możesz użyć na przykład „Sony kamery wideo, XDCam-EX”.
  • Rozszerzenie - rozszerzenie pliku tego typu. W naszym przypadku mp4.

Parametr Właściwości jest opcjonalny, w naszym przypadku nie musimy go używać.

Kliknij na zdjęcie, aby powiększyć

Następnie musisz wprowadzić podpis pliku początkowego i końcowego. Aby to zrobić, wybierz Rozpocznij, a następnie w menu kontekstowym kliknij Dodaj podpis.

Kliknij na zdjęcie, aby powiększyć

Następnie kliknij dwukrotnie pole<пустая сигнатура> () i wprowadź odpowiedni tekst.

Kliknij na zdjęcie, aby powiększyć

Następnie utwórz końcowy podpis pliku. Pamiętaj, aby wpisać 21 w polu kolumny Od.

Kliknij na zdjęcie, aby powiększyć

Pomyślnie utworzono własną sygnaturę pliku znanego typu.

Teraz musisz go zapisać. Istnieją dwa sposoby: możesz zapisać go do domyślnego pliku określonego na karcie głównej okna dialogowego Ustawienia, klikając przycisk Zapisz. Lub kliknij przycisk Zapisz jako ... i zapisz podpis w innym pliku.

2.2 Ręczne tworzenie pliku XML opisującego znany typ pliku:
Aby utworzyć ten plik, użyjemy kodowania XML w wersji 1.0 i kodowania UTF-8. Nie rozpaczaj, jeśli nie wiesz, co to jest - po prostu otwórz dowolny edytor tekstu (na przykład Notepad.exe) i wprowadź następujący tekst w pierwszym wierszu:

Następnie utworzymy znacznik XML określający typ pliku (FileType). Biorąc pod uwagę opisane wcześniej atrybuty XML, znacznik będzie wyglądał następująco:

Włóż go zaraz po

Następnie zdefiniuj podpis pliku (tag ) Początkowy podpis (na początku pliku) będzie wewnątrz znacznika bez żadnych atrybutów. Używamy typu tekstu podpisu, ale jednocześnie zastępujemy znaki szesnastkowe, których nie można przedstawić w formie tekstowej. Przed każdym znakiem szesnastkowym wstaw „\\ x” Zatem znacznik z podpisem pliku będzie wyglądać tak:

Jeśli to możliwe, musisz także zdefiniować końcowy podpis (na końcu pliku). W tym celu stosuje się ten sam tag, ale z elementem „from” i atrybutem „end”. Będzie to wyglądać tak:

Przypomnij sobie, że w sygnaturze pliku końcowego nie było żadnych znaków nietekstowych, ale były ukośniki i nawiasy trójkątne. Aby uniknąć pomyłek i błędów w składni XML, zastąpimy znaki „/”, „w podpisie”<" и ">„ich wartości szesnastkowe.

Na końcu, po podpisach plików, muszą być obecne znaczniki zamykające FileType i FileTypeList:

Dlatego cały plik powinien wyglądać następująco:


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

Pamiętaj: w składni XML rozróżniana jest wielkość liter, dlatego znacznik będzie ważny , ale nie .

Zapisz plik w formacie tekstowym z rozszerzeniem .xml. Na przykład: SonyCam.xml.

Z powodzeniem stworzyliśmy własną sygnaturę pliku znanego typu. Ten przykład jest wystarczający do zrozumienia podstawowych zasad tworzenia niestandardowego typu pliku. Bardziej doświadczeni użytkownicy mogą korzystać z XML w wersji 2.0. Możesz przeczytać więcej na ten temat w sekcji pomocy online R-Studio.

Krok 3: Sprawdź i dodaj plik opisujący znany typ pliku
Następnym krokiem jest dodanie (przesłanie) pliku XML do R-Studio. W takim przypadku zostanie on automatycznie sprawdzony.

Ładujemy do R-Studio plik XML utworzony w poprzednim kroku. Aby to zrobić, wybierz pozycję Ustawienia w menu Narzędzia. W obszarze Typy plików użytkownika na karcie głównej okna dialogowego Ustawienia dodaj utworzony przez nas plik XML (SonyCam.xml). Kliknij przycisk Zastosuj.

Kliknij na zdjęcie, aby powiększyć

2. Odpowiedz Tak na prośbę o pobranie nowego typu pliku.

Kliknij na zdjęcie, aby powiększyć

3. Aby sprawdzić, czy typ pliku został pomyślnie przesłany, kliknij kartę Znane typy plików w oknie dialogowym Ustawienia. Przypomnijmy, że dodaliśmy typ pliku do grupy Multimedia Video. Po otwarciu tej grupy (folderu) powinniśmy zobaczyć element z opisem, który ustawiliśmy podczas tworzenia pliku XML: wideo z kamery Sony, XDCam-EX (.mp4).

Kliknij na zdjęcie, aby powiększyć


Kliknij na zdjęcie, aby powiększyć

Jeśli w składni pliku są jakieś błędy, zobaczysz odpowiedni komunikat:

Kliknij na zdjęcie, aby powiększyć

W takim przypadku sprawdź ponownie plik XML pod kątem błędów. Pamiętaj: w składni XML rozróżniana jest wielkość liter i na końcu musi znajdować się znacznik końcowy.

Krok 4: Testowanie pliku opisującego znany typ pliku
Aby sprawdzić poprawność utworzonego przez nas niestandardowego typu pliku, spróbujemy znaleźć nasze pliki .mp4 na wymiennym dysku flash USB.

1. W systemie Windows Vista lub Windows 7 przeprowadzimy pełne (nie szybkie) formatowanie dysku lub skorzystamy z narzędzia do czyszczenia miejsca na dysku (na przykład R-Wipe & Clean), aby całkowicie usunąć wszystkie dane z dysku. Niech dysk USB zostanie sformatowany w FAT32 (rozmiar szukanych plików nie przekracza 2 GB).

2. Skopiuj pliki testowe na dysk i uruchom ponownie komputer, aby zawartość pamięci podręcznej została zapisana na dysku. Możesz także odłączyć dysk zewnętrzny, a następnie podłączyć go ponownie.

3. W systemie operacyjnym dysk zostanie zdefiniowany na przykład jako dysk logiczny F: \\.

4. Uruchom R-Studio. Wybierz nasz dysk (F: \\) i kliknij przycisk Skanuj.

Kliknij na zdjęcie, aby powiększyć

5. W oknie dialogowym Skanuj w obszarze (System plików) kliknij przycisk Zmień ... i usuń wszystkie pola wyboru. W ten sposób wyłączymy wyszukiwanie systemów plików i plików za pomocą tablicy partycji.
Kliknij na zdjęcie, aby powiększyć

6. Zaznacz pole wyboru Dodatkowe wyszukiwanie znanych typów plików. Umożliwi to R-Studio wyszukiwanie plików znanych typów podczas skanowania.

7. Aby rozpocząć skanowanie, kliknij przycisk Skanuj.

8. Poczekajmy, aż R-Studio skanuje dysk. Karta Informacje o skanowaniu wyświetli postęp skanowania (postęp).


Kliknij na zdjęcie, aby powiększyć

9. Po zakończeniu skanowania wybierz element Extra Found Files i kliknij go dwukrotnie.


Kliknij na zdjęcie, aby powiększyć

10. Nasze pliki testowe będą znajdować się w folderze wideo kamery Sony, folderze XDCam-EX (lub w folderze pod inną nazwą odpowiadającą opisowi typu pliku określonego w drugim etapie).


Kliknij na zdjęcie, aby powiększyć

Widzisz, że nazwy plików, daty i lokalizacje (foldery) nie zostały przywrócone, ponieważ te informacje są przechowywane w systemie plików. Dlatego w R-Studio każdy plik będzie automatycznie wyświetlany z nową nazwą.

Oczywiste jest jednak, że zawartość plików nie jest uszkodzona. Aby to sprawdzić, otwórz je w odpowiednim programie, na przykład odtwarzaczu multimediów VLC.


Kliknij na zdjęcie, aby powiększyć

Wniosek
Zdolność R-Studio do skanowania plików znanych typów podczas skanowania pozwala odzyskać dane nawet z dysku, którego systemy plików są albo nadpisane, albo nadpisane. Możesz efektywnie wyszukiwać pliki przy użyciu ich podpisów, co jest szczególnie przydatne, jeśli dokładnie wiesz, jakiego rodzaju pliki chcesz odzyskać, jak na przykład w naszym przykładzie. Możliwość tworzenia niestandardowych typów plików pozwala dodawać dowolny plik o określonej sygnaturze do listy plików znanych typów.

Władze wyznaczyły mi dość interesujące zadanie. W krótkim czasie napisz analizator plików wykonywalnych, który może wykrywać ciała wirusów na podstawie sygnatur i określać używany program pakujący / szyfrujący. Gotowy prototyp pojawił się za kilka godzin.

Słowo autora

Analiza podpisów

Wyszukiwanie szkodliwego obiektu według sygnatury jest tym, co może zrobić każdy program antywirusowy. W ogólnym przypadku podpis jest sformalizowanym opisem niektórych znaków, za pomocą którego można stwierdzić, że skanowany plik jest wirusem, a wirus jest dobrze zdefiniowany.

Istnieją różne techniki. Alternatywnie użyj podpisu złożonego z N bajtów szkodliwego obiektu. W takim przypadku możliwe jest dokonanie nie głupiego porównania, ale porównanie przez jakąś maskę (na przykład szukanie bajtów EB? CD 13). Lub ustaw dodatkowe warunki, takie jak „takie i takie bajty powinny znajdować się w punkcie wejścia programu” i tak dalej. Podpis Malvari jest szczególny.

W ten sam sposób opisano niektóre funkcje, za pomocą których można stwierdzić, że plik wykonywalny jest pakowany przez jeden lub inny program szyfrujący lub pakujący (na przykład banalny ASPack). Jeśli uważnie przeczytasz nasz magazyn, na pewno usłyszysz o narzędziu takim jak PEiD, zdolnym do określania najczęściej używanych programów pakujących, szyfrujących i kompilatorów (w bazie danych znajduje się duża liczba sygnatur) dla pliku PE przesłanego do niego. Niestety, nowe wersje programu nie były długo wydawane, a ostatnio na oficjalnej stronie internetowej pojawiła się wiadomość, że projekt nie będzie dalej rozwijany. Szkoda, bo możliwości PEiD (szczególnie biorąc pod uwagę system wtyczek) mogą się okazać dla mnie przydatne. Po krótkiej analizie stało się jasne, że nie była to opcja. Ale zagłębiając się w angielskojęzyczne blogi, szybko znalazłem to, co mi odpowiadało. Projekt YARA (code.google.com/p/yara-project).

Co to jest YARA?

Od samego początku byłem przekonany, że gdzieś w Internecie istnieją już otwarte opracowania, które podjęłyby się zadania ustalenia zgodności między określonym podpisem a badanym plikiem. Gdybym mógł znaleźć taki projekt, można go łatwo umieścić na szynach aplikacji internetowej, dodać różne podpisy i uzyskać to, czego ode mnie wymagam. Plan zaczął wydawać się jeszcze bardziej realny, kiedy przeczytałem opis projektu YARA.

Sami programiści pozycjonują go jako narzędzie pomagające badaczom złośliwego oprogramowania w identyfikacji i klasyfikacji szkodliwych próbek. Badacz może tworzyć opisy różnych rodzajów złośliwego oprogramowania za pomocą wzorów tekstowych lub binarnych, które opisują sformalizowane oznaki malvari. W ten sposób uzyskuje się podpisy. W rzeczywistości każdy opis składa się z zestawu linii i logicznego wyrażenia, na podstawie którego określa się logikę odpowiedzi analizatora.

Jeżeli warunki jednej z reguł są spełnione dla badanego pliku, określa się to odpowiednio (na przykład taki i taki robak). Prosty przykład reguły pozwalającej zrozumieć, o co toczy się gra:

reguła silent_banker: bankier
{
meta:
description \u003d "To tylko przykład"
poziom_wątku \u003d 3
in_the_wild \u003d true
smyczki:
$ a \u003d (6A 40 68 00 30 00 00 6A 14 8D 91)
$ b \u003d (8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9)
$ c \u003d "UVODFRYSIHLNWPEJXQZAKCBGMT"
stan: schorzenie:
$ a lub $ b lub $ c
}

W tej regule mówimy YARA, że każdy plik zawierający co najmniej jeden z przykładowych ciągów opisanych w zmiennych $ a, $ b, $ c musi zostać sklasyfikowany jako trojan silent_banker. I to jest bardzo prosta zasada. W rzeczywistości zasady mogą być znacznie bardziej skomplikowane (o tym porozmawiamy poniżej).
Nawet lista projektów, które go wykorzystują, mówi o autorytecie projektu YARA, a to:

  • VirusTotal Malware Intelligence Services (vt-mis.com);
  • jsunpack-n (jsunpack.jeek.org);
  • Oglądamy Twoją stronę internetową (wewatchyourwebsite.com).

Cały kod jest napisany w Pythonie, a użytkownikowi oferowany jest zarówno sam moduł do wykorzystania w jego rozwoju, jak i tylko plik wykonywalny do użycia YARA jako samodzielnej aplikacji. W ramach mojej pracy wybrałem pierwszą opcję, ale dla uproszczenia w artykule użyjemy analizatora jako aplikacji konsolowej.

Szperając trochę, szybko wymyśliłem, jak napisać reguły dla YARA, a także jak dołączyć do niej sygnatury wirusów z bezpłatnych awersów i programów pakujących z PEiD. Ale zaczniemy od instalacji.

Instalacja

Jak powiedziałem, projekt napisany jest w Pythonie, więc można go łatwo zainstalować na Linuxie, Windowsie i Macu. Na początku możesz po prostu wziąć plik binarny. Jeśli wywołasz aplikację w konsoli, otrzymamy zasady uruchamiania.

$ yara
użycie: yara ... ... PLIK | PID

Oznacza to, że format wywołania programu jest następujący: najpierw pojawia się nazwa programu, następnie lista opcji, po czym wskazany jest plik z regułami, a na samym końcu - nazwa badanego pliku (lub katalogu zawierającego pliki) lub identyfikator procesu. Teraz chciałbym dobrze wyjaśnić, w jaki sposób powstają te same zasady, ale nie chcę od razu obciążać cię suchą teorią. Dlatego będziemy działać inaczej i pożyczać podpisy innych osób, aby YARA mogła wykonać jedno z naszych zadań - pełną definicję wirusów według podpisów.

Własny antywirus

Najważniejsze pytanie: skąd wziąć bazę sygnatur znanych wirusów? Firmy antywirusowe aktywnie dzielą się takimi bazami danych (niektóre hojniej, inne mniej). Szczerze mówiąc, na początku nawet wątpiłem, że gdzieś w sieci ktoś otwarcie rozpowszechnia takie rzeczy. Ale, jak się okazało, są mili ludzie. Odpowiednia baza danych popularnego programu antywirusowego ClamAV jest dostępna dla wszystkich (clamav.net/lang/en). W sekcji „Najnowsza stabilna wersja” można znaleźć link do najnowszej wersji produktu antywirusowego, a także łącza do pobierania baz wirusów ClamAV. Będziemy przede wszystkim zainteresowani plikami main.cvd (db.local.clamav.net/main.cvd) i daily.cvd (db.local.clamav.net/daily.cvd).

Pierwsza zawiera główną bazę sygnatur, druga - najbardziej kompletną obecnie bazę danych z różnymi dodatkami. Daily.cvd, który zawiera ponad 100 000 obsad Malvari, wystarczy do osiągnięcia tego celu. Jednak baza danych ClamAV nie jest bazą danych YARA, dlatego musimy przekonwertować ją na żądany format. Ale jak? W końcu wciąż nie wiemy nic o formacie ClamAV ani o formacie Yara. Rozwiązaliśmy już ten problem, przygotowując mały skrypt, który konwertuje bazę sygnatur wirusów ClamAV na zestaw reguł YARA. Skrypt nazywa się clamav_to_ yara.py i został napisany przez Matthew Richarda (bit.ly/ij5HVs). Pobierz skrypt i przekonwertuj bazy danych:

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

W rezultacie w pliku clamav.yara otrzymujemy bazę sygnatur, która będzie natychmiast gotowa do użycia. Wypróbujmy kombinację bazy YARA i ClamAV w akcji. Skanowanie folderu przy użyciu podpisu odbywa się za pomocą jednego polecenia:

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

Opcja -r wskazuje, że skanowanie powinno być wykonywane rekurencyjnie we wszystkich podfolderach bieżącego folderu. Jeśli w folderze / pentest / msf3 / data znajdowały się jakieś ciała wirusów (przynajmniej te, które znajdują się w bazie danych ClamAV), YARA natychmiast je zgłosi. Zasadniczo jest to gotowy skaner podpisów. Dla większej wygody napisałem prosty skrypt, który sprawdzał aktualizacje bazy danych ClamAV, przesyłałem nowe podpisy i konwertowałem je do formatu YARA. Ale to są szczegóły. Jedna część zadania została zakończona, teraz możemy zacząć opracowywać zasady określania programów pakujących / szyfrujących. Ale do tego musiałem trochę z nimi poradzić.

Gra według zasad

Tak więc reguła jest głównym mechanizmem programu, który pozwala przypisać dany plik do dowolnej kategorii. Reguły są opisane w osobnym pliku (lub plikach), a ich wygląd jest bardzo podobny do konstrukcji struct () z języka C / C ++.

rządzić badboyem
{
smyczki:
$ a \u003d „win.exe”
$ b \u003d "http://foo.com/badfi le1.exe"
$ c \u003d "http://bar.com/badfi le2.exe"
stan: schorzenie:
$ a i ($ b lub $ c)
}

Zasadniczo pisanie zasad nie jest skomplikowane. W ramach tego artykułu dotknąłem tylko głównych punktów, a szczegóły znajdziesz w instrukcji. Tymczasem dziesięć najważniejszych punktów:

1. Każda reguła zaczyna się od słowa kluczowego reguły, po którym następuje identyfikator reguły. Identyfikatory mogą mieć takie same nazwy jak zmienne w C / C ++, to znaczy składają się z liter i cyfr, a pierwszy znak nie może być liczbą. Maksymalna długość nazwy identyfikatora wynosi 128 znaków.

2. Zazwyczaj reguły składają się z dwóch sekcji: sekcji ciągów i sekcji warunków. Sekcja ciągów określa dane, na podstawie których zostanie podjęta decyzja w sekcji warunków, czy dany plik spełnia określone warunki.

3. Każda linia w sekcji ciągów ma swój własny identyfikator, który zaczyna się od znaku $ - ogólnie, podobnie jak deklaracja zmiennej w php. YARA obsługuje ciągi regularne ujęte w podwójne cudzysłowy („”) i ciągi szesnastkowe ujęte w nawiasy klamrowe (()), a także wyrażenia regularne:

$ my_text_string \u003d "tekst tutaj"
$ my_hex_string \u003d (E2 34 A1 C8 23 FB)

4. Sekcja warunków zawiera całą logikę reguły. Ta sekcja powinna zawierać wyrażenie logiczne, które określa, w którym przypadku plik lub proces spełnia regułę. Zwykle ta sekcja odnosi się do wcześniej zadeklarowanych linii. Identyfikator linii jest uważany za zmienną logiczną, która zwraca true, jeśli linia została znaleziona w pamięci pliku lub procesu, a false w przeciwnym razie. Powyższa reguła określa, że \u200b\u200bpliki i procesy zawierające ciąg win.exe i jeden z dwóch adresów URL powinny zostać sklasyfikowane jako BadBoy (według nazwy reguły).

5. Szesnastkowe ciągi znaków umożliwiają użycie trzech konstrukcji, które zwiększają ich elastyczność: symbole wieloznaczne, skoki i alternatywy. Podstawienia to miejsca w ciągu, które są nieznane, a każda wartość może być na ich miejscu. Są one oznaczone symbolem „?”:

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

To podejście jest bardzo wygodne przy definiowaniu ciągów, których długość jest znana, a zawartość może się różnić. Jeśli część ciągu może mieć różną długość, wygodnie jest użyć zakresów:

$ hex_string \u003d (F4 23 62 B4)

Ten wpis oznacza, że \u200b\u200bw środku wiersza może znajdować się od 4 do 6 różnych bajtów. Możesz także wdrożyć alternatywny wybór:

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

Oznacza to, że zamiast trzeciego bajtu może być 62 B4 lub 56, taki rekord odpowiada wierszom F42362B445 lub F4235645.

6. Aby sprawdzić, czy określony ciąg znajduje się z określonym przesunięciem w przestrzeni plików lub przestrzeni adresowej procesu, używany jest operator at:

$ a przy 100 i $ b przy 200

Jeśli ciąg może znajdować się w określonym zakresie adresów, używany jest operator in:

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

Czasami pojawiają się sytuacje, gdy konieczne jest wskazanie, że plik powinien zawierać określoną liczbę z danego zestawu. Odbywa się to za pomocą operatora:

reguła Przykład 1
{
smyczki:
$ foo1 \u003d "dummy1"
$ foo2 \u003d "dummy2"
$ foo3 \u003d "dummy3"
stan: schorzenie:
2 z ($ foo1, $ foo2, $ foo3)
}

Powyższa reguła wymaga, aby plik zawierał dowolne dwa wiersze z zestawu ($ foo1, $ foo2, $ foo3). Zamiast określać określoną liczbę linii w pliku, możesz użyć zmiennych dowolne (co najmniej jedna linia z danego zestawu) i wszystkie (wszystkie linie z danego zestawu).

7. Ostatnią interesującą okazją do rozważenia jest zastosowanie jednego warunku do wielu linii. Ta funkcja jest bardzo podobna do operatora, tylko bardziej wydajny jest operator for… operatora:

do wyrażenia zestawu ciągów: (wyrażenie_logiczne)

Ten rekord należy odczytać w następujący sposób: spośród linii określonych w zestawie ciągów co najmniej elementy wyrażenia muszą spełniać warunek wyrażenie boolean. Lub innymi słowy: wyrażenie boolean_expression jest oceniane dla każdego łańcucha z zestawu string_set, a wyrażenie z nich powinno zwracać wartość True. Ponadto rozważymy tę konstrukcję na konkretnym przykładzie.

Making PEiD

Kiedy więc wszystko stało się mniej lub bardziej jasne dzięki regułom, możemy zacząć wdrażać detektor pakerów i kryptorów w naszym projekcie. Początkowo pożyczyłem podpisy znanych pakerów z tego samego PEiD jako materiału źródłowego. W folderze wtyczek znajduje się plik userdb.txt, który zawiera to, czego potrzebujemy. W mojej bazie danych było 1850 podpisów.

Dużo, więc aby je w pełni zaimportować, radzę napisać jakiś skrypt. Format tej bazy danych jest prosty - używany jest zwykły plik tekstowy, w którym przechowywane są rekordy formularza:


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

Pierwszy wiersz ustawia nazwę pakera, który będzie wyświetlany w PEiD, dla nas będzie to identyfikator reguły. Drugi to sam podpis. Trzeci to flaga ep_only, wskazująca, czy szukać danego ciągu tylko według adresu punktu wejścia, czy całego pliku.

Cóż, spróbujmy stworzyć regułę, powiedzmy, dla ASPack? Jak się okazało, nie jest to nic skomplikowanego. Najpierw utwórz plik do przechowywania reguł i nazwij go, na przykład packers.yara. Następnie sprawdzamy w bazie danych PEiD wszystkie podpisy, w imieniu których pojawia się ASPack, i przesyłamy je do reguły:

reguła ASPack
{
smyczki:
$ \u003d (60 E8 ??? ?? 5D 81 ED ?? (43 | 44) ?? B8 ?? (43 | 44) ?? 03 C5)
$ \u003d (60 EB ?? 5D EB ?? FF ?? ?? ?? ?? ?? ?? E9)
[.. odetnij ..]
$ \u003d (60 E8 03 00 00 00 E9 EB 04 5D 45 55 C3 E8 01)
stan: schorzenie:
dla dowolnego z nich: ($ w punkcie wejścia)
}

Dla wszystkich znalezionych rekordów flaga ep_only jest ustawiona na wartość true, to znaczy linie te powinny znajdować się pod adresem punktu wejścia. Dlatego piszemy następujący warunek: „dla dowolnego z nich: ($ w punkcie wejścia)”.

Zatem obecność co najmniej jednej z określonych linii pod adresem punktu wejścia będzie oznaczać, że plik jest pakowany przez ASPack. Należy również pamiętać, że w tej regule wszystkie wiersze są określone po prostu za pomocą znaku $, bez identyfikatora. Jest to możliwe, ponieważ w sekcji warunków nie odnosimy się do żadnych konkretnych, ale używamy całego zestawu.

Aby sprawdzić kondycję wynikowego systemu, po prostu uruchom polecenie w konsoli:

$ yara -r packers.yara somefi le.exe

Po nakarmieniu kilku aplikacji spakowanych przez ASPack upewniłem się, że wszystko działa!

Gotowy prototyp

YARA okazało się niezwykle zrozumiałym i przejrzystym narzędziem. Nie było mi trudno napisać do tego administratora WWW i skonfigurować pracę jako usługa internetowa. Trochę kreatywności i suche wyniki analizatora są już pomalowane na różne kolory, co wskazuje na stopień zagrożenia wykrytego złośliwego oprogramowania. Mała aktualizacja bazy danych, a dla wielu kryptorów dostępny jest krótki opis, a czasem nawet instrukcja rozpakowywania. Prototyp został stworzony i działa idealnie, a władze tańczą z zachwytem!

DZWONEK

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu