Arduinoのプログラムを保護する

Arduino

目的

Arduinoに書き込まれたプログラムやEEPROM内のデータを第三者に読み取られないように保護します。

ロックビット

Arduino UNO/NANOなどに載っているATmega328Pにはロックビットという施錠ビットがあります。ロックビットを操作することによって、プログラム領域(フラッシュ領域)、EEPROM領域、ブートローダーに対して読み書きの保護をすることができます。

  • ロックビットの設定によりフラッシュ領域などの読み書きが出来なくなります。
  • 再度読み出しができるようにするためには、ATmega328Pのフラッシュ領域など全消去を必要とします。

ロックビットの詳細については、ATmega328Pのデータシートの「31.1. プログラムメモリとデータメモリ用施錠ビット」を参照してください。

手順

ロックビットを使ってフラッシュ領域、データ領域の読み書きを禁止する手順を以下に示します。

1. 保護対象とするArduino(TARGET)と、TARGETのロックビット操作用に別のArduino(PROGRAMER)を用意します。

2. TARGETに、Arduino IDEを使って通常通りプログラムを書き込みます。

3. PROGRAMERに、Arduino IDEのサンプルプログラム「ArduinoISP」を書き込みます。

4. PROGRAMERとTARGETを、以下を参考に接続します。

Arduino UNOでの接続例

5. PROGRAMERとPCをUSBケーブルで接続します。

6. Arduino IDEに含まれるavrdude.exeをコマンドプロンプトから実行し、以下の結果になることを確認します。

$ cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p)

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.

7. ロックビットの内容を確認します。

$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p -U lock:r:con:h

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p)
avrdude.exe: reading lock memory:

Reading | ################################################## | 100% 0.01s

avrdude.exe: writing output file "con"
0xf

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.

8. (省略可) この状態でフラッシュ領域(プログラム領域) が読み取れるか確認します。

$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p -U flash:r:"C:\tmp\flach-l0f.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p)
avrdude.exe: reading flash memory:

Reading | ################################################## | 100% 19.98s

avrdude.exe: writing output file "C:\tmp\flach-l0f.hex"

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.

ブートローダーとプログラムを書き込んだ状態では、ロックビットは0x0fになっています。

9. ロックビットを0x00に書き換えます。

$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p -U lock:w:0x00:m

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p)
avrdude.exe: reading input file "0x00"
avrdude.exe: writing lock (1 bytes):

Writing | ################################################## | 100% 0.03s

avrdude.exe: 1 bytes of lock written
avrdude.exe: verifying lock memory against 0x00:
avrdude.exe: load data lock data from input file 0x00:
avrdude.exe: input file 0x00 contains 1 bytes
avrdude.exe: reading on-chip lock data:

Reading | ################################################## | 100% 0.01s

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of lock verified

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.

10. (省略可) フラッシュ領域をもう一度読み込み、読み取れなくなっていることを確認します。

$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p -U flash:r:"C:\tmp\flach-l00.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p)
avrdude.exe: reading flash memory:

Reading | ################################################## | 100% 19.94s

avrdude.exe: Flash is empty, resulting file has no contents.
avrdude.exe: writing output file "C:\tmp\flach-l00.hex"

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.
$ dir "C:\tmp\*.hex"
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 5AB7-111D です

 C:\tmp のディレクトリ

令和1/11/19  11:31                13 flach-l00.hex
令和1/11/19  11:29            78,861 flach-l0f.hex
               2 個のファイル              78,874 バイト
               0 個のディレクトリ  126,325,178,368 バイトの空き領域
  • 78KBあったフラッシュ領域のダンプファイルが13バイトになっており読み取れなくなっていることが確認できます。

再度プログラムの読み書きができるようにする手順

ロックビットを0x00にすると第三者だけではなく、自分も読み書きできません。そこで、チップ消去をしてロックビットを初期化します。

1. Arduino IDEのツールメニューから「ブートローダーを書き込む」を実行します。書き込み装置は「Arduino as ISP」にします。

  • この際内部でチップ消去処理が実行され、ロックビットが初期化されます。

2. Arduino IDEで書き込みたいスケッチを開き、スケッチメニューから「書き込み装置から書き込む」を実行します。

  • USBケーブルをTARGETにつなぎ直して、通常のように「マイコンボードに書き込む」で書き込むこともできます。

(参考) 単独でロックビットを初期化する方法

avrdude単独でロックビットを初期化するには、-eオプションでチップ消去を実行します。
ブートローダーの書き込みを行うとチップ消去も同時に実行されるため以下の手順は不要ですが、参考として記載しておきます。

1. 現在のロックビットの内容を確認します。

$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.04s

avrdude.exe: Device signature = 0x1e950f (probably m328p)

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.

2. -eオプションでチップ消去します。

これにより、フラッシュ領域とデータ領域の内容が値「0xff」にリセットされ、すべてのロックビットがクリアされます。

$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p -e

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p)
avrdude.exe: erasing chip

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.

3. 再度ロックビットを確認します。

$ avrdude.exe -C "..\etc\avrdude.conf" -c avrisp -P COM9 -b 19200 -p m328p -U lock:r:con:h

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p)
avrdude.exe: reading lock memory:

Reading | ################################################## | 100% 0.01s

avrdude.exe: writing output file "con"
0x3f

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done.  Thank you.
  • この時点でロックビットは初期値の0x3fになっています。この後ブートローダーの書き込みを行うと0x0fになります。

コメント

タイトルとURLをコピーしました