НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ ДЛЯ ДZЕНСТВУЮЩИХ (FAQ)
АРХИВ MAIL-КОНФЕРЕНЦИИ RTFM_HELPERS ЗА МАЙ 2001
Сайт: http://hi-tech.nsys.by/
Информация о конференции: http://hi-tech.nsys.by/forum/
ИО модератора aka DZ Kir777: kir777@hotmail.com
Co-moderator aka Serrgio: serrgio@gorki.unibel.by
[В О П Р О С - О Т В Е Т]
=======================================================================
ВОПРОС: Мне интересно, как работает следующий кусок программы на
ассемблере:
mov byte ptr @, 90h
@: ret
mov ax, $F000
push ax
mov ax, $FFF0
push ax
retf
ХЕМУЛЬ: Этот код идентичен следующему:
jmp 0F000h:0FFF0
Идея здесь в том, что этот код пытается выполнить
перезагрузку. А все эти сложности вокруг, видимо, связаны с
тем, что автор хотел сминимизировать предупреждения от
антивирусных эвристиков.
NICK: Вообще-то этот код будет поразному выполняться на разных
процессорах. Для Pentium и выше он действительно идентичен
джампу. А вот для более ранних он будет выполнять
первый ret!!!
DMITRY: В старых процессорах (семейство 80х86) использовался
конвейерный способ обработки команд, это значит, что
следующая машинная инструкция запихивается во внутреннюю
очередь команд процессора прежде чем завершится выполнение
предыдущей команды. Этот кусок кода может быть использован,
например, для защиты от трассировки: когда выполняется
команда mov byte ptr @, 90h, инструкция ret уже занесена во
внутреннюю очередь, поэтому ничего не помешает ее
нормальному выполнению, произойдет выход из подпрограммы и
кусок кода ниже ret выполнен не будет.
Если же программа трассируется, то после выполнения каждой
команды отладчику необходимо вернуть себе управление. Это
может делаться, например, перехватыванием прерывания 3.
Подобный способ удобен тем, что вызов прерывания 3
выполняется однобайтной командой CCh т. е. на каждом шаге
трассировки отладчик записывает в байт памяти, следующий
за последним байтом текущей команды, значение CCh, чем
обеспечивает возвращение управления на себя.
Значит получается так: когда под отладчиком в режиме
трассировки выполняется команда mov byte ptr @, 90h, вместо
команды ret во внутреннюю очередь загружена команда
ССh (Int3), которую вставил отладчик, а следующей на
конвейер поступит 90h (Nop), а не ret, т. е. выхода из
подпрограммы не произойдет и управление будет передано на
блок перезагрузки mov ax, $F000... вот такая вот защита.
Правда, этот метод не будет работать под всеми отладчиками,
т. к. не все они используют Int3...
-----------------------------------------------------------------------
ВОПРОС: Что такое экзепакеры?
ХЕМУЛЬ: Программы, пакующие код экзешника. LZEXE, PKLITE, aPACK,
UPX...
-----------------------------------------------------------------------
ВОПРОС: Есть компьютер, я его еще в глаза не видел, говорят что на
его биосе стоит защита паролем. У меня есть пару прог, но
может не хватить, т.к. я не знаю какой конкретно БИОС
установлен.
DMITRY: Пароль можно сбросить вот так:
mov ax, 1010h
out 70h, ax
Здесь происходит обращение в CMOS по несуществующему
адресу (максимальный адрес - 7Fh ). Возникает ошибка и,
почему-то, нарушается контрольная сумма. Все это работает
на AWARD и AMI BIOS'ах, на других пробовать не доводилось,
но думаю, что работать будет, так как программа не
привязывается к каким-либо определенным адресам CMOS.
-----------------------------------------------------------------------
ВОПРОС: Посоветуйте, где можно найти описание вызовов VxD?
И еще доки про обработку прерываний в Win98/NT.
LEGIO- 1. Windows 98/NT DDK
NARY: - kernrel service guide
- introduction to virtual drivers
2. win32 programmers reference, раздел device input and output.
3. msdn: fat 32 api reference
-----------------------------------------------------------------------
ВОПРОС: Как перезагрузить комп в Винде? (на ассемблере)
DINOZAUR: На асме это будет что-то вроде
call ExitWindowsEx EWX_FORCE+EWX_REBOOT,0
======================================================================
(С) HI-TECH group. All rights reserved and reversed. Оригинальная
грамматика авторов сохранена.