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 не указывает на действительную память, но я не знаю ни одного.