Dynamiczne tłumaczenie kodu

Najpierw trzeba oszukać urządzenia: Używa się "prawdziwego" system operacyjnego aby skorzystać z gotowych już sterowników sprzętu, na które nałożone zostaną nakładki.

Następnie uruchamiane oprogramowanie: W trybie jądra systemu hosta działa tak zwany monitor jądra, który zajmuje się uruchamianiem kodu wirtualnego systemu operacyjnego i jego procesów. Robi to poprzez dynamiczne skanowanie kodu binarnego, który ma się właśnie wykonać i tłumaczeniu go na kod z podmienionymi różnymi wartościami.

Każdy oryginalny kod posiada swój odpowiednik gdzieś wewnątrz pamięci monitora jądra. W rzeczywistości procesor tam go wykonuje.

 

Na czym polega tłumaczenie?

Na podmianie adresów występujących w skokach i czytań z pamięci
Na umieszczeniu break-pointów w rozwidleniach (skokach warunkowych)
Na umieszczeniu break-pointów przy napotkaniu instrukcji, które stwarzają problemy i trzeba je emulować.
Przykładowo: instrukcje sprawdzające aktualny tryb procesora, instrukcje zmieniające/odczytujące deskryptor segmentu, instrukcje zmieniające/odczytujące tablice stron
Na umieszczeniu break pointów przy instrukcjach wejścia-wyjścia
Cały trik polega na tym, że raz przetłumaczony kod może być wykonany drugi raz bez tłumaczenia.

 

Trudności w implementacji:

Trzeba sprawdzać, czy tłumaczone oprogramowanie nie pisze po własnym kodzie
Zależność od konkretnej wersji procesora, na którym będziemy uruchamiani
Wszystkie instrukcje sprawdzające stan procesora muszą być emulowane

 

Przykłady zastosowania dynamicznej translacji:

QEMU
WMWare
Plex
Valgrind

 

Pełna wirtualizacja.

spis tresci

Dygresja na temat Valgrinda.