5

listingu 7.1 deszyfrującego wirusa CascadeSP (wskaźnik stosu) Anti-debug Sztuczka - x86

lea si, Start ; position to decrypt (dynamically set) 

mov  sp, 0682 ; length of encrypted body (1666 bytes) 

Decrypt: 
xor  [si],si ; decryption key/counter 1 
xor  [si],sp ; decryption key/counter 2 
inc  si ; increment one counter 
dec  sp ; decrement the other 
jnz  Decrypt ; loop until all bytes are decrypted 

Start: ; Encrypted/Decrypted Virus Body 

Zauważ, że ten deszyfrującego ma możliwości antidebug ponieważ SP (wskaźnik stosu) rejestr jest używany jako jeden z klucze odszyfrowywania.

Czy ktoś może wyjaśnić, dlaczego używanie rejestru SP działa jak funkcja anty-debugowania? Popraw mnie jeśli się mylę, ale nie sądzę, mający działa debugger zmienia układ stosu ...

góry dzięki

+0

Brzmi podejrzanie jak zadanie domowe ... –

+0

Świetne pytanie! –

Odpowiedz

1

Moja x86-fu jest zardzewiały, ale wydaje mi się, aby przypomnieć najbardziej breakpoint debugowanie narzędzia działają poprzez wywołanie błędu w procesorze i stwierdzenie, że jest to proces nadzorczy - który dałby ci nowy stos i odpowiednio zmieniony wskaźnik stosu. Zatem przejście przez ten kod dałoby wartości sp, które różnią się od tych, które normalnie normalnie by to zrobił, gdyby nie zostały uwięzione przez debugger.

0

Większość debuggerów oczekuje, że [e] sp jest poprawna i wskazuje obszar stosu. Możliwe, że niektóre debuggery ulegają awarii, jeśli sp nie wskazuje prawidłowej pamięci, ale nie znam żadnej.

+1

Z definicji (e) sp jest ważny. Większość debugerów, jeśli są one inteligentnie zaprojektowane, używają * własnego * obszaru stosu, aby uniknąć przekroczenia przestrzeni stosu używanej przez program aplikacji. Zobacz moją odpowiedź, dlaczego użycie własnego stosu nie pozwoli debuggerowi na debugowanie tego kodu. –

+0

Ach, to ma sens. Nie myślałem o przerwaniu obsługi. –

2

Jeśli segment stosu jest równy segmentowi danych (czy jest to wirus .com lub .exe? Seem .com, ponieważ DS jest już równy CS), wszelkie użycie stosu (debuggera lub nawet przerwania) zmodyfikuje pamięć, w której ss: [sp] wskazuje, i wskaże gdzieś w ciele wirusa (ponieważ jest używana jako licznik).

5

Przyjmowanie punktu przerwania lub przerwania spowoduje "wypchnięcie danych na stos", co spowoduje uszkodzenie bajtów danych w obszarze wskazywanym przez wskaźnik stosu. Tak więc, jeśli umieścisz punkt przerwania (INT n) w kodzie za pomocą debuggera, sam twój proces debugowania (napotkanie punktu przerwania) zniszczy dane, które ten kod próbuje odszyfrować.

Ten kod może działać w systemie DOS, jeśli nie ma przerwania; może najpierw wyłączają przerywanie. Nie możesz realistycznie używać tego pod Windows lub Linux (i tak 16-bitowy kod).

+0

Po prostu, aby rozwinąć twoją odpowiedź: "INT n zasadniczo zachowuje się jak dalekie połączenie z tym wyjątkiem, że rejestr flag jest wypychany na stos przed adresem zwrotnym Procedury przerwań powracają za pośrednictwem instrukcji IRET, która wyskakuje z flag i adresu zwrotnego ze stosu . " - http://pdos.csail.mit.edu/6.828/2008/readings/i386/INT.htm –

+0

Okazuje się, że ta sztuczka działa dobrze na 32-bitowym systemie Windows. – Joshua