Arduino デコンパイルは出来るか?まとめてみました。
目次
Arduinoのスケッチの作成と読み出し
Arduinoのソフト開発は、パソコンにSDKをダウンロードしてインストールして行います。
↓ダウンロードはコチラから。
・https://www.arduino.cc/en/Main/Software
作成したスケッチ (プログラムソース=人間が目で見て意味がわかる英語文章的なテキスト) は、パソコン側でコンパイル操作により、プログラムバイナリ(Arduinoに載っているマイコンが読み取って意味がわかるが、人間にとっては意味不明なデータ列)に変換します。
そして、変換後にArduinoに転送します。
コンパイルしたバイナリでは、人間が目で見たときに分かりやすくするためのものである変数名などの情報は失われていますし、無駄な処理は省くという最適化が行われています。
そのため、バイナリから元のスケッチを復元することはまず不可能です。
つまり、Arduinoに入っているバイナリは、後からパソコンに読み出すことは難しくありません。
ただ、そこからソースを復元するのは無理ということになります。
逆コンパイラといって、バイナリからソースを復元する方法も技術的には存在しますが、元のスケッチとは似ても似つかないものになります。
逆コンパイルについては以下をご覧ください。
・https://urashita.com/archives/8493
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
コメント