Słowem wstępu
Niektóre rodzaje anomalii posiadają powłokę w postaci wirtualizacji kodu. Polega to na implementacji niestandardowej maszyny wirtualnej, która w połączeniu ze zniekształceniem kodu znacznie utrudnia badanie wpływu programu na systemy komputerowe w strefie ZONA.
Programy wytworzone przez aurę strefy lub odtworzone przez laboratoria na podstawie opisów udokumentowanych anomalii często posiadają zaawansowaną wirtualizację kodu połączoną z niestandardowymi formatami plików. Jednak na potrzeby niniejszego tekstu prezentowana maszyna wirtualna będzie mocno uproszczona.
Przepływ wykonywania programu
Domyślnie programy wykonują się sekwencyjnie, linia po linii, od góry do dołu. Przepływ ten decyduje o kolejności przetwarzania poszczególnych instrukcji.
Istnieją różne elementy pozwalające na sterowanie działaniem programu. Rozgałęzienia pozwalają na wybór ścieżki wykonywania zależnie od warunku logicznego. Pętle dają możliwość wielokrotnego (iteracyjnego) przetwarzania wyznaczonego fragmentu kodu. Z kolei funkcje lub metody przenoszą wykonanie do wydzielonego bloku instrukcji i zazwyczaj wracają do miejsca wywołania. Możliwa jest także natychmiastowa zmiana miejsca wykonywania kodu poprzez skok lub niskopoziomową modyfikację rejestru wskaźnika instrukcji.
Poniższy schemat z narzędzia Ghidra prezentuje przykładowy przepływ wykonywania programu między funkcjami.
Automat skończony (ang. finite state machine)
Niektóre anomalie mają zniekształcony przepływ wykonywania programu przez umieszczenie fragmentów kodu na jednym poziomie zagnieżdżenia i przełączanie się między nimi przez kontroler nazywany dyspozytorem (ang. dispatcher).
Dziwo (ang. weird) zaprezentowane poniżej to bardzo prosty przykład płaskiego przepływu wykonywania programu w języku C#. Zmienna o nazwie x określa stan, a wyrażenie switch pełni rolę dyspozytora (ang. dispatcher).
┌ Weird.IL.FL4T!z
└─ src.txt
Własna maszyna wirtualna (ang. custom virtual machine)
Podstawą własnej maszyny wirtualnej jest mechanizm nazywany cyklem wykonywania rozkazów (ang. fetch-decode-execute cycle).
Maszyna wirtualna odczytuje kolejne instrukcje w postaci kodów operacyjnych (ang. opcode) z programu wczytanego jako kod bajtowy (ang. bytecode). Po zdekodowaniu rozkazu następuje przekazanie wykonania do procedury obsługi (ang. handler).
Przykładowy program w języku Asembler dla maszyny wirtualnej.
mov r1, 0xFF0000FF
mov r2, 0xFF00FF00
xor r1, r2
halt
Przykładowy program w postaci kodu bajtowego (ang. bytecode).
01 00 FF 00 00 FF
01 01 00 FF 00 FF
02 00 01
FF
Kod źródłowy prototypu edukacyjnej maszyny wirtualnej w języku C# przedstawiono poniżej.
┌ Maszyna wirtualna (C#)
└─ vm.txt
Wykaz literatury
[1] Advanced Micro Devices, Inc. (AMD), AMD64 Architecture Programmer's Manual, 2024.
[2] Arm Limited, Arm Architecture Reference Manual for A-profile architecture, 2025.
[3] Intel Corporation, The Intel 64 and IA-32 Architectures Software Developer's Manual, 2025.