Есть ли способ программе определить на z80 она выполняется или на его эмуляторе?
Есть ли способ программе определить на z80 она выполняется или на его эмуляторе?
можно определить по некоторым неточностям\ошибкам эмуляции
но никто не гарантирует что защита от эмулятора потом не сработает на каком нибудь железном кривом клоне с железным кривым клоном z80
а эмуляторы потом вскоре пофиксят
и будет несколько обидно :)
в придачу в процессе определения что мы на эмуляторе
можно повесить как кривой эмулятор так и кривое железо...
можно ловить на хитрых командах, но результаты различаются на реальных NMOS/CMOS
применительно к спеку можно устроить порчу ячеек памяти манипулируя с R (эмули на такое не способны)
А если дополнительно установить на плату чип, который невозможно сэмулировать? Есть идея майнить на спектрумах специальную криптовалюту, чтобы ее невозможно было майнить на эмулях. Иначе на мощных компах процесс пойдет в сотни раз быстрее и она обесценится. Ее же ( эту крипту) использовать в целях расчета между спектрумистами. Заодно будет и дополнительный стимул железом с z80 обзаводиться.
как вариант - посмотреть как это делают для FUZIX:
https://github.com/EtchedPixels/FUZI...util/cpuinfo.c
если честно, разбираться самому - лень (ввиду сомнительной полезности данных знаний), но чототам следующее из LD A,R и подобного
- - - Добавлено - - -
Ахах, там по тексту "вот тут должны быть пустые строки и процедура строго раньше вызова because of bug in {лучшем компиляторе} SDCC" :)))
Есть, и достаточно нехитрый способ. Причём тип процессора вообще не важен (речь про детект работы ПО под эмулятором, а не на реале). Но свою "находку" пока не могу рассказать :) В своём ПО активно использую, достоверность 146% !
- - - Добавлено - - -
Найти и обезвредить причинный участок кода никакая не проблема.
- - - Добавлено - - -
Всё равно финал всех заморочек будет в виде: "if <чего-то там> then <туда-то> else <досвидос>"
В отладчике эмулятора это ловится на раз-два, вместо "if" записывается "goto" и gotoво дело :)
программно это можно запутать - компиляция/байткод - вычислить будет очень сложно.
..................
Denn, вот простой пример - адвентюра для +3 http://www.tzxvault.org/Spectrum/Disks/Myth.zip
попробуй обойти запрос на рег.данные
Вопрос востребованности конкретного ПО и степени заинтересованности хакеров.
Мои интересы только в плоскости ПРК "Орион", причём сугубо реалов. Ради спора изучать другую платформу и среду отладки для неё не готов.
Запутывание кода сам практикую, но прекрасно понимаю, что все эти защиты - на тему разнообразия инструментария и порога терпения взломщика, ничего невозможного там нет в принципе.
Сравниться по производительности с видеокартами и процессорами PC на Спектруме невозможно. Следовательно нужен какой-то другой подход. Сбор каких-то характеристик реального железа и маловероятные события при его функционировании. Программа же должна вносить нечто, чтобы требуемое для регистрации новой монеты случалось все же с ненулевой вероятностью после N<100 часов работы "реального железа"(при этом если на компьютере не происходило нечто осмысленное и он был просто включен, время возрастало непропорционально) Центральный сервер же должен, проанализировав блок данных, присланных регистрирующим, выносить вердикт и подтверждать регистрацию.
Цели такой "валюты" не инвестиционные и не анонимайзерские, а иные:
1) усилить интерес к реальному железу на z80;
2) к работе на этом реальном железе( следовательно и в новом софте);
3) дать людям средство для расчетов в своей среде, минуя деньги( хотя, если сделать это товаром<-> обмен на обычные деньги или обычную крипту, то первые два пункта уже не работают в полной мере.
А алгоритм и подход должен быть всем понятен в общих чертах. Внешний чип, если и нужен, то только чтобы сильно не отвлекать все остальное от их функций. Симитировать столь полно реальное железо в эмуляторах должно быть весьма трудозатратно.
- - - Добавлено - - -
видимо и эмуляторы там пока не столь изощренные как на Спектрумах, но при замене проца на z80 появляются и точки соприкосновения. Правда не в курсе, есть ли такая замена на ПРК "Орион"
- - - Добавлено - - -
уже объяснился. Чтобы только не грузить основную систему не свойственными ей до этого задачами. Потом это по желанию владельца, как необязательная опция.
На оригинальном спектруме с раздельными полями памяти можно легко затестить:
Ждем минуты три. Проверяем верхние 32 Кб памяти, например, графику UDG. Заряд из ячеек будет утекать и байты превращаться в $ff. Только первые несколько байтов для каждого блока в 256 байт остануться в нуле, потому, что рефреш для них выполнялся во время выполнения цикла. А нижние 16 Кб будут штатно зарефрешены ULA. Опыт не будет работать на эмуляторе.Код:ORG 32768
DI
LD B,0
L1: XOR A
LD R,A
DEC HL
LD A,H
OR L
JR NZ,L1
DJNZ L1
EI
RET
Только на 48к, на 128х вся память рефрешится юлой.
Ну и нет проблем заэмулить это. Только временные и качественные параметры порчи содержимого ячеек снять нужно тестовой программой, чтобы точнее было. Эмуль ZEsarUX даже эмулит, опция такая есть, но, судя по моим тестам, вообще от фонаря. Портится одна ячейка в начале верхней памяти)
Вообще - нет проблем заэмулить любые такие фичи, главное знать о них, ну и тесты провести, чтобы эмулировать поточнее. Так что любая такая защита - до первого пытливого эмуляторщика.
Лет 20 назад тема определения эмуляторов была весьма популярна. Находили всё новые и новые особенности Z80, которые в мирной жизни были не нужны, а для отлова эмуляторов хорошо подходили. Проверки такого поведения некоторые программисты включали в свои игры и журналы, чтобы они могли запускаться только на реалах. Но со временем все эти штучки благополучно добавлялись в эмуляторы. Сейчас таких неописанных особенностей скорее всего и не осталось уже - всё давно копано-перекопано вдоль и поперёк. А даже если кто-то что-то подобное и найдёт, то, зная правильное поведение, добавить его в эмулятор большого труда не составит.
внешняя схема может быть высокоточным таймером, где вывод прерывания zx заведен на старт или еще куда-то. Но просто четко выдерживать в секундах, минутах или еще чем-то наверное не совсем правильно(это надо моделировать). Пользователя можно попросить ввести датакод ряда его компонентов, обычно это номер недели в году и год.
На процессоре он точно стоит, на памяти вроде тоже. Для fpga наверное придется вводить ее датакод и еще у jtag микросхем вроде есть уникальный идентификатор чипа( но может я путаю, тогда придется просить их заводить регистр для идентификации изделия, чтобы быть участниками программы "zx012021-майнинга"). И идентификатор запрашивать у сервера регистрации.
Вероятность того, что на разных платах это совпадет довольно низкая. Эта инфа может быть передана программой в чип и на основе этой последовательности чип выберет свое локальное время. А редкое событие, которое будет равно 1 монете можно построить, пропуская n-ное кол-во прерываний, а далее зафиксировав время обработки очередного прерывания и соотнося его с текущим локальным временем этого чипа. Только формулу надо так построить, чтобы за 100 часов нажатия на клавиши клавиатуры, джойстика или кликанья мышью вероятность этого не была нулевой.
Этим мы зададим и масштаб валюты, поощряя реальную работу на реальном железе. Ну а курс с рублем может быть плавающим и отображаемым на этом же сервере( если все сделки этой крипты с рублем будут только на нем).
- - - Добавлено - - -
но тогда придется моделировать случайные процессы. Ведь не все в z80 регламентировано с точностью до микросекунды( единицы микросекунды). На совсем уж худой конец и при подозрении на мошенничество, придется запрашивать фото платы( вернее определенных чипов, вводить датакоды и проверять, правда пока неясно как, прогоняя на большой скорости). Правда это ПО придется держать в большом-большом секрете тому, кто возьмется заниматься сервером регистрации. Интересы эмуляторщиков этой технологией ущемлены не будут. Так как это не защита программ, а приятный бонус( если конечно 1 монета не станет когда-нибудь стоить 10 000 руб :) )
сейчас можно более менее защитить что то только если приличная часть этого чего то расположена на территории разработчика например в его облаке
По Z80 и правда перекопано многое, но явно еще не все. До сих пор не знаю ни одного эмулятора, который проходил бы все тесты в zexall. Если нужно отличать выполнение на реале и на эмуляторе, нужно смотреть на эффекты флага CCF. Аналогично, это касается реализаций z80 на fpga. Как раз в конце минувшего лета в софтовом ядре T80 Miguel Angel Rodríguez Jódar нашел и исправил кривую реализацию инструкции IM 2: ED 7E, которая сидела в исходниках годами.
Никому не возбраняется разрабатывать свою систему. Главное потом нести за нее ответственность.
Тут просто все носятся с "цифровым рублем", а я предположил, что скорее востребован "бартерный рубль", но чтобы не быть связанным c российским законом, надо назвать это как-то по другому, типа "zxbon" или как-то еще.
ух сколько у тебя уже скопилось идей, скоро можно книгу будет выпустить "идеи до которых так и не дошли руки" ))
- - - Добавлено - - -
там вроде есть тесты с учетом недокументируемых флагов и без учета, но в принципе можно стопудово сказать что невозможно сделать гарантированное определение эмулятора спека если автор эмуля положит неочень большие силы чтобы это было невозможно
у Леонардо Да Винчи было еще больше(нереализованных). Я же их не патентую. Если кому-то интересно, делайте. А чтобы мне делать надо реальный Спектрум, я пока не выбрал какой. Внутрисхемный эмулятор( его надо купить или разработать). Анализатор и осциллоскоп современный( тоже надо приобретать). Человек с паяльником( желательно с авто, так как неудобно к нам ехать, и приезжающий иногда с посуточной оплатой, что мало кого сейчас устроит). Ну и многое другое. Планы есть, но реальный бизнес в другой сфере и пока не позволяющий отвлекать больше 50 тыс. рублей в год на иные цели.
Так что пока есть только обустроенный офис и ключи от него. А занимаемся пока поставками всякой всячины, но бизнес-партнер пока не против моих самых безумных идей. Баллон с гелием два года уже стоит( состава для резины так и не нашли, периодически покупаю шарики детям, очередной висит в воздухе и не падает на пол почти месяц, если провисит еще месяц - пойду выпытывать состав у продавцов. Хотя конечно фиг скажут, но хотя бы будем знать, что есть). Низколетающие дирижабли для посетителей болот( чтобы ягоды не на своем горбу с болота нести) и фермерского хозяйства это пока самый крупный мой замысел.
Teensy и micro:bit можем конечно поставлять, но есть раскрученная Амперка. Пока вот ковыряюсь с их софтом, так как партнер вообще далеко-далеко от всех этих технологий. Была бы техподдержка и софт можно бы было заняться.
Можно попробовать изменять данные или программный код, которые уже зашли на конвейер хоста. На Z80 такое будет работать, на эмуляторе нет.
На самом деле есть более злой тест z80full. Вот его только JSpeccy и SpecEmu без ошибок выполняет. Была раньше на форуме тема, посвященная тестам эмуляторов.
Вот я для примера запустил его на последнем Unreal и ZXMAK2 и видим, что примерно одинаковый печальный результат, причем, на разных тестах разное: где-то фейлится Unreal а где-то ZXMAK2:
Скрытый текст
А у Spectaculator всего 2, вот тебе и "коммерческая поделка".
А реальный проц на Эве проходит не все)))
в ZXMAK2 опкоды IN*/OUT* фейлятся потому что особенность гальванической связи выхода магнитофонного порта со входом не эмулируется. Но это фейл не эмуляции Z80, а эмуляции магнитофонного входа. Просто руки так и не дошли прикрутить полноценную эмуляцию обратной связи для магнитофонного порта. На разных моделях поведение порта немного отличается, поэтому нужно разбираться.
По поводу SCF/ССF подозреваю, что с такими-же кодами будет фейлится и на реальном Z80, т.е. это видимо фейл самого теста.
Помню были старые тесты в которых неправильный CRC был задан для SCF/CCF и они фейлились на реальном Z80, тест делали на эмуляторе и проверить на риале у автора возможности не было. В этом тесте видимо просто скопировали без исправлений CRC.
Если тест SCF/CCF на реальном Z80 проходит, тогда действительно ошибка эмуляции, это можно исправить. Но подозреваю дело в том, что тест ошибочно показывает фейл для корректного результата.
И да - этот тест чувствителен к содержимому ПЗУ, поэтому прошивка ПЗУ должна байт в байт соответствовать той, под которую в тесте контрольные суммы забиты.
- - - Добавлено - - -
нету способа, все можно эмулировать :)
В некоторых эмуляторах при пошаговой отладке кода часто происходит сбой числа тактов на кадр, например в spectaculator. Это впринципе можно отлавливать, правда работать такая защита будет только если попытаться пошагово отлаживать код. ZXMAK2 этим не проведешь, он корректно отрабатывает даже если в отладчике при пошаговой отладке на лету установить любой номер такта.
Визуальные эффекты с точностью до пиксела для модели Pentagon эмулировать проблематично. Помоему пока ни один эмулятор точно Pentagon не эмулирует. ZXMAK2 наиболее близко эмулирует, но особенность смены последовательности выборки ATTR/SCRN не эмулируется. Эта особенность помоему нигде не эмулируется. Но разница будет видна только визуально, программно разницу не заметить.
Нет, просто ZXMAK не эмулирует правильное поведение флагов F3 и F5 для команд SCF/CCF, эту особенность открыли и изучили не так давно. Где-то на вос-форуме была тема по этому поводу.
- - - Добавлено - - -
Кстати, есть тест zexall2, и на нем ZXMAK точно также фейлит проверку команд SCF/CCF.
понятно, если раскрыть детали алгоритма. Если проц на Alter-а там есть особенности, которые эмулятороваятелям могут быть неизвестны. То есть прочитать о них можно, но если не раскрыть какие именно будут использованы в алгоритме. Там и допкоманды легко подсунуть. Но тогда пострадают держатели обычных z80. Если вводить в программу защиты датакоды процессора и памяти, чтобы он вычислял по ним временной интервал каких-то прерываний или получал дополнительно некие данные от поставщика программы защиты