Давайте неспеша подумаем об этой защите. То, что адреса перепутаны, М1 использован нестандартно и пр. - это защита от того, чтобы программу заново с нуля не переписали так просто.
Плавающие биты это защита от прямого копирования.
Но просто плавающие биты это не защита - их легко можно сделать в нужных битах.
Как можно плавающие биты использовать для реальной защиты? Способ только один - применять не просто плавающие биты, а записывать в эти биты как бы аналоговое значение. Тоесть считываем этот бит, к примеру 100 раз, получается, например из 100 считываний 30 раз считался "0" и 70 раз "1". Это можно сделать условием проверки подлинности. Если же считалось 90 раз "0" и 10 раз "1", или, скажем, 50 на 50, то можно считать , что проверка не прошла.
Но не всё так просто - процент считывания "0" и "1" зависит ещё и от температуры и напряжения питания. Поэтому такой ключ ненадежен.
Выход такой - записать несколько плавающих битов с разной степенью "прошитости" (прошитостью назовем отношение количества считанных "0" к количеству считанных "1" . При прошитости 100% всегда считывается "0", при прошитости 0% всегда считывается "1", плавающий бит считывается с каким то промежуточным %)
Так вот - записать несколько плавающих битов с разной степенью "прошитости" , скажем так:
бит 1 - 30%
бит 2 - 60%
бит 3 - 10%
Если поплывут внешние условия - температура и напряжение питания, то считываемая статистика изменится, к примеру, так:
бит 1 - 57%
бит 2 - 93%
бит 3 - 48%
Фишка в том, что дестабилизирующие факторы влияют на разные биты одновременно - и если опираться на абсолютные значения "прошитости" бита нельзя - этот параметр сильно плавает , но стабильным остается соотношение прошитости разных бит, тоесть из примера выше - бит 2 всегда будет более прошит, чем бит 1 , соответственно бит 1 всегда будет более прошит, чем бит 3.
А на проверке этих условий уже можно построить защиту.
Не спроста же защита срабатывает через 3 сек. - время нужно, чтобы собрать статистику.
Вывод - для того, чтобы правильно считать это ПЗУ -
по железу: подойдет любой программатор и считывать достаточно только при номинальном напряжении питания.
по софту: софт для программатора надо написать свой - чтобы он собирал статистику считанных плавающих бит в табличку типа вышеприведенной:
бит 1 - 30%
бит 2 - 60%
бит 3 - 10% и т.д.
Два дополнения: 1. Количество считываний для сбора верной статистики надо подобрать эксперементально, начать, скажем со 100 считываний и увеличивать пока процент не перестанет сильно изменятся.
2. Надо убедится, что считываемая ПЗУ реально работает в компе - даже хорошо зашитые ячейки со временем начинают плавать, а уж изначально плавающие тем более ненадежны.
Про запись в следующий раз.





Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
