SP (Stack Pointer) Анти-отладочный трюк - x86

Листинг 7.1. Расшифровщик каскадного вируса

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 

Обратите внимание, что у этого дешифратора есть функции антиотладки, потому что регистр SP (указатель стека) используется в качестве одного из ключей дешифрования.

Может кто-нибудь объяснить, почему использование регистра SP действует как анти-отладочная функция? Поправьте меня, если я ошибаюсь, но я не думаю, что запуск отладчика меняет структуру стека...

заранее спасибо

4 ответа

Взятие точки останова или прерывания "вытолкнет данные в стек", что повредит байты данных в области, на которую ссылается указатель стека. Таким образом, если вы поместите точку останова (INT n) в код с помощью отладчика, сам ваш отладочный процесс (столкновение с точкой останова) уничтожит данные, которые этот код пытается расшифровать.

Этот код может работать под DOS, если не происходит прерываний; может быть, они отключают прерывания в первую очередь. Вы не можете реально использовать это под Windows или Linux (в любом случае это 16-битный код).

Если сегмент стека равен сегменту данных (является ли он.com или.exe вирусом? Кажется.com, потому что DS уже равен CS), то любое использование стека (отладчик или даже прерывание) изменит память, где ss:[sp] указывает, и он будет указывать где-то в теле вируса (потому что он используется в качестве счетчика).

Мой x86-fu ржавый, но я, кажется, вспоминаю, что большинство инструментов отладки точек останова работают, вызывая сбой в ЦП и утверждая себя как процесс супервизора - который даст вам новый стек и соответственно измененный указатель стека. Таким образом, пошаговое выполнение этого кода даст вам значения sp которые отличаются от тех, которые процесс обычно видит, если бы он не был захвачен отладчиком.

Большинство отладчиков ожидают, что [e]sp будет действительным и указывает на область стека. Я предполагаю, что возможно, что некоторые отладчики аварийно завершают работу, если sp не указывает на действительную память, но я не знаю ни одного.

Другие вопросы по тегам