Arduino デコンパイルは出来るか?書き込んだスケッチを読み出す

ITで知っておくべき知識
スポンサーリンク

Arduino デコンパイルは出来るか?まとめてみました。

スポンサーリンク

Arduinoのスケッチの作成と読み出し

Arduinoのソフト開発は、パソコンにSDKをダウンロードしてインストールして行います。

 

↓ダウンロードはコチラから。

https://www.arduino.cc/en/Main/Software

 

作成したスケッチ (プログラムソース=人間が目で見て意味がわかる英語文章的なテキスト) は、パソコン側でコンパイル操作により、プログラムバイナリ(Arduinoに載っているマイコンが読み取って意味がわかるが、人間にとっては意味不明なデータ列)に変換します。

そして、変換後にArduinoに転送します。

 

コンパイルしたバイナリでは、人間が目で見たときに分かりやすくするためのものである変数名などの情報は失われていますし、無駄な処理は省くという最適化が行われています。

そのため、バイナリから元のスケッチを復元することはまず不可能です。

 

つまり、Arduinoに入っているバイナリは、後からパソコンに読み出すことは難しくありません。

ただ、そこからソースを復元するのは無理ということになります。

 

逆コンパイラといって、バイナリからソースを復元する方法も技術的には存在しますが、元のスケッチとは似ても似つかないものになります。

 

逆コンパイルについては以下をご覧ください。

https://urashita.com/archives/8493

 

ArduinoのROMに何が書き込まれたか調べる方法はあるか?

さらに調べてみました。

英文の質問と回答を見つけました。

https://reverseengineering.stackexchange.com/questions/125/how-do-i-figure-out-what-is-burned-on-an-arduino-rom

 

元の英文

How do I figure out what is burned on an Arduino ROM?

I have an Arduino Uno Rev3. I would like to extract and find out what code is burned on the ROM of the micro-controller board.

How do I extract the code from the board?
How do I figure out the original source code that went into the hex file

 

日本語訳

Arduino ROMに何が焼かれたかを調べる方法はあるのか?

私はArduino Uno Rev3を持っています。マイクロコントローラーボードにどんなコードが焼かれたかを見つけて、抽出したいです。

ボードからコードを抽出可能ですか?

バイナリファイルになったコードからオリジナルのコードを見つけ出すことが出来ますか?

 

この質問には以下の回答がありました。

 

元の英文

I'll answer this in two parts, #1 is relatively easy, #2 impossible to the level which I'm assuming you want.

 

日本語訳

#1 最初の質問は比較的簡単
#2 次の質問は、質問されているレベルでは不可能

 

Extracting the hex code from the Uno (Unoからバイナリコードを抽出)

While the specifics will depend on the revision of the Uno that you have, you'll want to use avrdude (available for linux, bundled with the OS X Arduino software) and a command similar to the following that would extract the information from an ATmega168:

avrdude -F -v -pm168 -cstk500v1 -P/dev/ttyUSB0 -b19200 -D -Uflash:r:program.bin:r

Look at the avrdude documentation to match the part parameter -p specific to your device (or post them and we can go from there).

Since it appears that you have the Uno Rev3, that board has an ATmega328 (-pm328). The programmer "communicates using the original STK500 protocol" thus the communication protocol flag -c should be -cstk500v1 the command you would need (assuming the Uno is connected to /dev/ttyUSB0) follows:

avrdude -F -v -pm328p -cstk500v1 -P/dev/ttyUSB0 -b19200 -D -Uflash:r:program.bin:r

Next up your second question.

 

なるほど

avrdude -F -v -pm328p -cstk500v1 -P/dev/ttyUSB0 -b19200 -D -Uflash:r:program.bin:r

で行けるのかな。

 

avrdude は、Windowsでは、

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude

にあるはずです。

 

Converting Hex code to original source (バイナリファイルからオリジナルのソースファイルに変換)

Sorry, but that's not possible. While you can get some hex to c "decompilers" the gibberish returned, while functionally correct, will not be human readable (some commercial ones, like Hex-Rays, might give you some level of human-readability).

With that said, you're best bet would be a hex to assembly translator/converter - which will still only give you a better picture of what's happening, but will still be (by definition) very low level. All variable names, comments etc would be stripped and you're still going to be left with not knowing the original source program contents - just the compiled result.

Since you're dealing with an Atmel device you could try to use the avr specific gcc toolchain avr-gcc. Specifically, you'll need avr-objdump using the needed MCU type flag -m atmega328 (avr5) architecture (Full List of Available Architectures, MCU types)

avr-objdump -s -m atmega328 program.hex > program.dump

It is also possible, depending on your configuration, that providing the architecture type itself (avr5) would be sufficient:

avr-objdump -s -m avr5 program.hex > program.dump

 

やはり、無理なのは無理なようです。

avr-objdump を使えば、逆アセンブルすることによりアセンブラのソースコードが取得できるようです。

Arduinoの関連記事

Arduinoに関する関連記事をまとめてみました。

 

↓Arduinoのダウンロード

https://urashita.com/archives/25608

 

↓ArduinoのELEGOO UNO スターターキット

https://urashita.com/archives/25656

 

↓Arduino IDE for Visual Studioの使い方

https://urashita.com/archives/28016

 

コメント