LABA 120 - ** Как защитить свой софт для контроллеров AVR или Arduino от пиратского копирования


Электронная Коммерция шагает семимильными шагами
Программный код для устройств также можно монетизировать


И возможно кому то уже невтерпеж продавать свои крутые прошивки
для контроллеров AVR или Arduino через интернет.

Как в таком случае защитить свой софт от пиратского копирования?
Здесь не идет речь о FUSE bit которые закрывают прошивку от считывания.

А о той прошивке, которую можно послать электронной почтой
и работать она будет только на одном устройстве



Для этого в схему в схему устройства нужно добавить
элемент с уникальным номером. И этим элементом может стать практически любой датчик
с интерфейсом 1Wire.. Так как уникальность это их философия
Каждый датчик имеет уникальный 64 битный серийный номер,
по которому происходит общение с датчиком на шине.

На 1-Wire работает большинство "таблеток" - домофонных чипов (DS1990A), 120р
также через 1-Wire общаются популярные датчики температуры (DS18S20 и DS18B20), 110р
транзисторные ключи (DS2405, DS2406), 150р программируемые порты ввода-вывода (DS2408),
АЦП и ЦАП, часы реального времени (DS2417) 120р, и многое другое.

Вероятно в вашем устройстве уже и так установлено что либо из
этих штучек. Тогда заказчик присылает вам уникальный номер
1wire прибора, а ваша задача, установить в программе проверку этого номера



Для примера будем использовать градусник DS18B20 (DS18S20 кривоват) и ATtiny2313

Кодить прошивку в Bascom AVR . Алгоритм простой и любители других
языков программирования легко портируют его под свой словарный запас
Схему рисовать не буду, из программы видно что куда цеплять



программа минимальная из за того что память ATtiny2313 всего 2к
на более жирных контролерах есть где развернуться

Существуют китайские таблетки в которые можно залить любой номер
поэтому вариант с градусником предпочтительней, да еще и температуру
можно измерить


$regfile = "ATtiny2313.DAT"

$crystal = 8000000
$baud = 38400


Config Lcdbus = 4 ' 4 СТРОКИ ЛСД
Config Lcdpin = Pin , Db7 = Portb .0 , Db6 = Portb .1 , Db5 = Portb .2 , Db4 = Portb .3 , E = Portb . 4 , Rs = Portb .5

Config Lcd = 16 * 1

Dim Ss As String * 5
Dim TT As Integer
Dim sid(8) As Byte
Dim cnt as word
Dim t as byte

Restore cod

'********************************************

Config 1wire = Portd.5


Declare Sub Main ' ! sub = 4 byte
Declare Sub Find


'********************************************

Run:

cls ' 2 byte

'cursor off ' 4 BYTE

LCD "ds18b20 as key"

Find

if ss = "NOT" then : lcd " KEY BAD" : stop : end if

'********************************************
do
incr cnt
if cnt > 60000 then main

loop

'********************************************
Sub main
cnt = 0

'incr t
'if t> 250 then find ' повторная проверка (не влезла)


1wreset
1wwrite & HCC
1wwrite & H44

Waitms 750


1wreset
1wwrite & H55
1wverify sid(1)
1wwrite & HBE

TT = 1wread (2)
TT = TT * 10
TT = TT \ 16
Ss = Str (tT)
Ss = Format (ss , "0.0" )


locate 2,1 : lcd ss
End Sub

'********************************************
Sub Find
sid(1) = 1wsearchfirst()
for cnt = 1 to 8
read t
if t <> sid(cnt) then : ss = "NOT" : exit sub : end if
next

End Sub


cod :

' КЛЮЧ В ДЕСЯТИЧНОМ ВИДЕ

data 40 , 0 , 9 , 0 , 78 , 105 , 34 , 95

'data 28,00,170,187,170 ,204 ,221

END ' Конец делу венец

Работа программы проверялась на живом устройстве



вот две фотки, с не правильным ключом



и правильным ключом

Конечно, судя по описанию DS2406, более подходит к данной теме



Это адресуемый порт ввода/вывода, и проверить срабатывание
этого порта можно тут же в наше программе
Но на момент написания данного перла, В ближайших
магазинах данный товар отсутствует , может быть позже
мы вернемся к этой теме


Если бы память программ была больше
то в я бы добавил такую конструкцию

-------------
Sub main
cnt = 0
incr t
if t > 250 then find
--------------

Что бы проверка ключа проводилась не только при включении
устройства, а если вдуматься , то пусть наша приблуда
сначала проработает около минуты, а только потом проверит
ключ, это будет и демо режим, и очень затруднит
взлом защиты. Придется минуту ждать получился взлом или нет

Но в ATtiny2313 это уже не влезло,
память программ переполнилась

Конечно вместе с номером нужно использовать значение температуры
что повысит защищенность прошивки AVR или Arduino

Также следует предусмотреть возможность для заказчика
посмотреть номер ключа, дабы он мог заказать у вас прошивку


В данном коде это не предусмотрено из за маленькой памяти



осталось 6 байт

Но если вдуматься, просмотр номера ключа может быть
оформлен другой прошивкой, Благо заливка ее
через USBASP программатор, под программой BasCom AVR
В Контроллер AVR занимает пару секунд



Если у вас "Жирный" AVR типа ардуины , используйте всю память программ
заполняйте остаток "левыми" операторами
Чем прошивка больше тем труднее в ней найти защиту

И еще, любая защита ломается , Даже на замечательные HASP4
в интернете встречались эмуляторы
Программу с адекватной ценой, и не ЗАМОРОЧЕНОЙ схемой приобретения
вряд ли будут ломать.

скачать исходник