ZX Review
#11-12
26 ноября 1997 |
|
Форум - Программа детекта эмулятора.
А теперь - некоторые разра- ботки Max'а: Продолжая тему эмуляторов, начатую Alex'ом, несколько слов хочу сказать о способах защиты от них (в основном от UKV). Не всем может понравиться на- личие встроенного отладчика, под которым почти любую программу можно не только отладить, но и взломать. И ведь нельзя перехва- тить нажатие ESC (выход в отлад- чик) - ведь это не СПЕКТРУМ, и нажатие сей кнопочки не остав- ляет никаких следов... (вот было бы здорово: нажимает какой-ни- будь чайник ESC, с целью поковы- ряться в программе, а там - SHA- DOW FORMATTER...) Поэтому оста- ется только один способ - в са- мом же начале работы программы определить факт запуска под эму- лятором и сброситься. После проведения серии бесче- ловечных экспериментов над UKV Spectrum Debugger, было найдено несколько способов: 1) Следующие байты: #DD, #DD, #23 интерпретируются эмулятором как INC HL, в то время как для СПЕКТРУМА это - INC IX. Т.е. ес- ли после такой проверки увели- чился регистр HL, то программа запущена под эмулятором. 2) Абсолютно не эмулируются 3-й и 5-й биты флагового регис- тра - они сброшены в ноль. 140. XOR A ADD A,240 PUSH AF DEC SP POP AF AND 40 2 Если после выполнения такой процедуры в аккумуляторе будет ноль - программа под UKV. 3) Подвязка по скорости. Сравнивать замеренную ско- рость с каким-либо числом не ре- комендуется. Во-первых - и у Спектрумов скорость может незначительно варьироваться. Во-вторых - скорость эмуля- тора можно подобрать (например понизить частоту прерываний в 2 раза - в результате тактов меж- ду прерываниями станет больше). Лучше сделать так. UKV сильно тормозит при работе с атрибута- ми. Теперь если сделать замер тактов между прерываниями, и в цикле подсчета поставить коман- ду записи числа в область атри- бутов, то вы получите одно зна- чение. Если затем повторить этот за- мер еще раз, но записывать чис- ло в обычную память, результат будет другим. На настоящем Спектруме эти два числа будут равны. 140. Цикл 1-й: LD BC,50 XOR A COUNT1 INC BC LD (22528),A JR COUNT1 Цикл 2-й: LD BC,0 XOR A COUNT2 INC BC LD (65535),A JR COUNT2 2 В первом цикле стоит команда LD BC,50. Это сделано для того, чтобы дать 'фору' более медлен- ному (на эмуляторе) циклу (вдруг Спектрум тоже слегка тормозит при записи в атрибуты...) Естественно, запускать эти циклы нужно сразу же после HALT'а, а выход из них - через процедуру обработки IM 2. Теперь осталось сравнить два этих числа, к примеру - SPEED1 и SPEED2: LD HL,SPEED1 LD DE,SPEED2 AND A SBC HL,DE JR C,EMU OKAY ... То же самое можно проделать и с выводами в порты - эмулятор весьма и весьма медленно меняет цвет бордюра (ведь "бордюр" - на самом деле только часть экрана на IBM, и эмулятор после каждо- го OUT'а в порт 254 меняет цвет всех пикселов бордюра, а это за- нимает значительное время). Alex писал и еще об одном эмуляторе - Z80TRDOS. Так вот: все вышеперечислен- ные тесты на нем не срабатыва- ют - он более совместим, нежели UKV Spectrum Debugger. Да и защищаться от него не имеет смысла, так как в Z80 мо- нитор отсутствует. Тем не менее, могу порекомен- довать следующее: LD HL,(#FFFF). После такого, Z80TRDOS без- надежно виснет вместе с PC, и единственное, что может помочь - кнопка RESET (семь бед - один RESET...) Кстати, то же самое будет и с UKV, если на вашем PC не уста- новлена EMS-память. Еще Alex писал о случаях пор- чи ПЗУ (так как в эмуляторе ПЗУ - это ОЗУ, только с программно запрещенной записью, видимо, иногда эта проверка не срабаты- вает...) Мне не удалось найти такие условия, при которых происходит эта порча.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября