Zaciemnianie kodu poprzez wyliczanie adresów skoków

Manna5

Jeśli w asemblerze (tutaj 8086+) chcemy skoczyć pod określony adres, robimy to tak:

JMP $1234

Taką instrukcję łatwo znaleźć analizując kod maszynowy, równie łatwo namierzając lokalizację docelową skoku. Możemy jednak skakać pod adres z rejestru, wcześniej obliczony. Uwaga: nie możemy użyć instrukcji powodujących utratę danych, czyli SHL/R, AND, OR. Zamiast tego należy użyć instrukcji bezstratnych: XOR, ROL/R, ADD, SUB.

MOV AX, $8246
ROL AX, 3
JMP AX

Kod będzie oczywiście wolniejszy (dlatego nie zalecam tej metody w długotrwałych iteracjach), ale za to utrudnimy jego analizę. W praktyce nie używamy jednak konkretnych adresów, lecz raczej etykiet. Czy w takim wypadku da się zastosować tę metodę? Tak, tylko musimy się wspomóc obliczeniami w czasie asemblacji:

MOV AX, ETYKIETA-100
ADD AX, 100
JMP AX

0 komentarzy