Wyszukiwanie zagrożeń za pomocą ciągów znaków i zapisu szesnastkowego
Dopasowywanie artefaktów złośliwego oprogramowania
Wyszukiwanie zagrożeń za pomocą ciągów znaków i zapisu szesnastkowego to bezpłatna lekcja Cyber Security Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cyber Security Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.
Od próbki do reguły
Wyszukiwanie zagrożeń zaczyna się od próbki. Należy wyodrębnić charakterystyczne artefakty, zdecydować, które z nich są trwałe, a następnie zakodować je w regule, która wykryje rodzinę bez oznaczania legalnych plików.
Przebieg pracy wygląda następująco: wstępna analiza próbki, zebranie ciągów i cech strukturalnych, oddzielenie sygnału od szumu, przygotowanie reguły, a następnie przetestowanie jej zarówno na próbkach rodziny, jak i na czystym korpusie przed wdrożeniem.
Wyodrębnianie potencjalnych ciągów
Najpierw należy użyć narzędzia strings do wyświetlenia sekwencji drukowalnych znaków, uwzględniając zarówno tekst ASCII, jak i UTF-16 (wide). Złośliwe oprogramowanie dla systemu Windows często przechowuje ciągi w postaci wide.
Należy przeanalizować wynik pod kątem adresów URL C2, nazw mutexów, ścieżek rejestru, niestandardowych komunikatów błędów, ścieżek PDB oraz nietypowo szczegółowych tekstów. Należy pominąć ogólne ciągi środowiska uruchomieniowego i kompilatora.
strings -a sample.bin > ascii.txt
strings -e l sample.bin > wide.txt # UTF-16LE
grep -iE 'http|mutex|\\\\pipe\\\\|\.pdb' ascii.txt wide.txtWybór stabilnych ciągów znaków
Nie każdy ciąg znaków powinien trafić do reguły. Należy wybierać artefakty, których autor nie może łatwo zmienić:
- zapisane na stałe nazwy mutexów i potoków unikatowe dla rodziny
- niestandardowe znaczniki protokołu lub klucze konfiguracji
- nietypowe komunikaty debugowania lub paniki
- osadzone ścieżki PDB ujawniające środowisko kompilacji
Należy unikać szablonowego kodu bibliotek, typowych nazw API i numerów wersji współdzielonych przez legalne oprogramowanie, ponieważ generują one fałszywe alarmy.
strings:
$mutex = "Global\\Zx7yQ_lock" wide
$cfgkey = "x0r_cfg_begin" ascii
$pdb = "C:\\build\\loader\\release\\loader.pdb"Obchodzenie prostego zaciemniania
Wiele rodzin szyfruje ciągi operacją XOR lub stosuje inne lekkie metody kodowania. Jeśli jawnych ciągów jest niewiele, należy poszukać ich zakodowanej postaci albo procedury dekodującej.
Można obliczyć bajty zakodowane operacją XOR dla znanego tekstu jawnego i dopasowywać je albo użyć modyfikatora xor YARA, aby automatycznie dopasować ciąg przy użyciu dowolnego jednobajtowego klucza XOR.
strings:
// matches "http://" under any single-byte XOR key
$u = "http://" xor
// or a fixed key range
$k = "config" xor(0x01-0xff)Wyszukiwanie wzorców szesnastkowych
Gdy ciągi są zaciemnione, ale kod nie, należy dopasowywać wzorce bajtowe pochodzące z własnej logiki złośliwego oprogramowania: procedurę deszyfrującą, pętlę rozpakowującą lub unikatową stałą.
Należy zdeasemblować próbkę, znaleźć charakterystyczną sekwencję instrukcji i przekształcić kody operacji na ciąg szesnastkowy. Bajty, które mogą się zmieniać (adresy, wartości immediate), należy zastąpić symbolami wieloznacznymi, aby wzorzec przetrwał rekompilację.
strings:
// XOR decrypt loop with wildcarded counter/address
$decrypt = { 8A ?? 34 ?? 88 ?? 4? 4? 75 ?? }Symbole wieloznaczne i skoki w praktyce
Sztuka wyszukiwania szesnastkowego polega na odpowiednim wyborze bajtów zastępowanych symbolami wieloznacznymi. Zbyt sztywny wzorzec przestanie działać po rekompilacji, a zbyt luźny będzie pasować do wszystkiego.
- Należy zastępować symbolami wieloznacznymi przesunięcia względne i wartości immediate, które kompilator zmienia
- Należy zachować niezmienione kody operacji, ponieważ algorytm pozostaje stabilny
- Należy używać skoków
[n-m]tam, gdzie zmieniają się długości instrukcji
Wzorzec powinien być wystarczająco długi, aby pozostać unikatowym (często potrzeba co najmniej 8 znaczących bajtów), ale elastyczny tam, gdzie jest to konieczne.
strings:
$stub = { 55 8B EC 83 EC [1-4] E8 ?? ?? ?? ?? 33 C0 }Wskaźniki strukturalne i PE
Cechy statyczne wykraczające poza surowe bajty pozwalają budować skuteczne warunki o niskim poziomie szumu. Za pomocą modułu pe można dopasowywać:
- imphash — hash tablicy importów, często stabilny w kolejnych kompilacjach rodziny
- nazwy sekcji — niestandardowe packery dodają charakterystyczne sekcje
- konkretne importy — VirtualAllocEx + WriteProcessMemory + CreateRemoteThread sygnalizują wstrzykiwanie
import "pe"
condition:
pe.imphash() == "4e3a9f..." or
for any s in pe.sections : ( s.name == ".x0rsec" )Entropia jako wskaźnik
Spakowane lub zaszyfrowane regiony mają wysoką entropię. Moduł math ją mierzy, co pozwala oznaczać próbki, których sekcja z ładunkiem wygląda na zaszyfrowaną — jest to cecha charakterystyczna packerów.
Sama entropia generuje dużo szumu (instalatory używające kompresji również mają wysoką entropię), dlatego należy łączyć ją z innymi wskaźnikami, zamiast generować alarm wyłącznie na jej podstawie.
import "math"
condition:
math.entropy(0, filesize) >= 7.2 and $loader_stubŁączenie wskaźników
Najskuteczniejsze reguły wymagają wielu niezależnych wskaźników, aby pojedyncza zbieżność nie wywołała dopasowania. Należy łączyć ciąg, wzorzec kodu i cechę strukturalną.
Taki warunek wielowarstwowy ogranicza zarówno fałszywe alarmy (wszystkie elementy muszą się zgadzać), jak i możliwość uniknięcia wykrycia (autor musi jednocześnie zmienić kilka cech).
condition:
uint16(0) == 0x5A4D and
filesize < 800KB and
$mutex and
$decrypt and
pe.imports("kernel32.dll", "CreateRemoteThread")Nazewnictwo, meta i wersjonowanie
Reguła służąca do wyszukiwania jest użyteczna tylko wtedy, gdy inni mogą jej zaufać i ją utrzymywać. Każdej regule należy nadać jasną nazwę z przestrzenią nazw oraz kompletną sekcję meta.
- Należy zapisać hashe próbek, na podstawie których zbudowano regułę
- Należy podać rodzinę, autora, datę i odwołanie
- Po dopracowaniu logiki należy zwiększyć pole wersji
Gdy reguła zadziała kilka miesięcy później, te metadane informują osobę reagującą na incydent, co oznacza trafienie i na ile można mu ufać, zamieniając jednorazową analizę w trwałe, współdzielone wykrywanie.
meta:
family = "X0rLoader"
author = "ir-team"
date = "2026-06-04"
hash = "9f1c...e2"
version = "2"Testuj, zanim zaufasz
Nową regułę należy zawsze zweryfikować na dwóch korpusach:
- Prawdziwe trafienia — każda znana próbka rodziny musi zostać dopasowana
- Czyste oprogramowanie — duży, czysty zbiór (pliki systemowe, popularne aplikacje) NIE może zostać dopasowany
Pojedynczy fałszywy alarm dotyczący biblioteki DLL systemu Windows może spowodować poddanie kwarantannie krytycznych plików w całym środowisku. Należy uruchomić regułę, policzyć wyniki, przeanalizować pominięte i wykryte przypadki, a następnie ją dopracować przed szerokim wdrożeniem.
yara -r family.yar /malware_corpus/ # expect all to hit
yara -r family.yar /clean_corpus/ # expect zero hitsSzybki test
Wybierz najbardziej odporny wskaźnik.
Podsumowanie
Praktyczne wyszukiwanie za pomocą YARA — od początku do końca:
- Wyodrębniaj ciągi ASCII i wide; zachowuj stabilne artefakty (mutexy, klucze konfiguracji, ścieżki PDB)
- Obchodź lekkie zaciemnianie za pomocą modyfikatora xor lub zakodowanych wzorców
- Gdy ciągi są ukryte, dopasowuj wzorce bajtowe kodu (fragmenty deszyfrujące i rozpakowujące)
- Zastępuj symbolami wieloznacznymi zmienne bajty, zachowuj kody operacji i używaj skoków dla zmiennych długości
- Wykorzystuj PE imphash, sections, imports oraz entropię jako sygnały strukturalne
- Łącz wiele wskaźników, aby ograniczyć fałszywe alarmy i utrudnić uniknięcie wykrycia
- Przed wdrożeniem zawsze testuj reguły na zbiorach próbek rodziny i czystego oprogramowania
Następnie: uruchamianie tych reguł w całym środowisku.
Ucz się Cyber Security Academy dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 76
- Lekcje
- 303
Często zadawane pytania
Czy lekcja „Wyszukiwanie zagrożeń za pomocą ciągów znaków i zapisu szesnastkowego” jest bezpłatna?
Tak — pełny tekst „Wyszukiwanie zagrożeń za pomocą ciągów znaków i zapisu szesnastkowego” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cyber Security Academy, przejdź na CoddyKit PRO. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wyszukiwanie zagrożeń za pomocą ciągów znaków i zapisu szesnastkowego”?
Dopasowywanie artefaktów złośliwego oprogramowania Ćwiczysz Cyber Security Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Cyber Security Academy?
Nie wymagamy żadnego doświadczenia. Cyber Security Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wyszukiwanie zagrożeń za pomocą ciągów znaków i zapisu szesnastkowego”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Cyber Security Academy?
Tak. Każda lekcja Cyber Security Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Do czego służy YARA
- Składnia reguł YARA
- Wyszukiwanie zagrożeń za pomocą ciągów znaków i zapisu szesnastkowego
- Skalowanie i automatyzacja skanowania