誰かが私にAtmelAVR8ビットマイクロコントローラー用の逆アセンブラーを提案できますか?このためのオープンソースプロジェクトはありますか?
ありがとう。
誰かが私にAtmelAVR8ビットマイクロコントローラー用の逆アセンブラーを提案できますか?このためのオープンソースプロジェクトはありますか?
ありがとう。
また、avr-gccツールセットのツール部分であるavr-objdump(http://www.nongnu.org/avr-libc/)を使用することもできます。元:
avr-objdump -s -m <avr architecture> .d program.hex > program.dump
http://www.nongnu.org/avr-libc/user-manual/using_tools.htmlにあり<avr architecture>
ます
http://www.onlinedisassembler.com/odaweb/
多くのプラットフォーム(AVRも)ですが、Microchip(どちらも必要ありませんでした)がありません。
大きなプラスは、それがWebベースであることです。
vAVRdisasmをチェックアウトします。
AVRDisassemblerは、.NET Coreで記述されたオープンソース(MIT)AVR / Arduino逆アセンブラーです(つまり、Windows、Mac、Linuxで実行できます)。逆アセンブリをstdoutに書き込む以外に、JSONダンプを発行することもできます(相互運用性、分析目的)。
免責事項:私は上記のライブラリの作者です。
JohannesBauerのavrdisasを使用しています。.hexファイルやELFではなく、ダンプされたフラッシュで動作します。
以下をコンパイルします:
.include "tn13def.inc"
ldi r16,1
out ddrb,r16 ; PB0 as output
sbiw r24,1 ; slight wait
brne PC-1
sbi pinb,pinb0 ; toggle
rjmp PC-3 ; forever
リストを生成します:
C:000000 e001 ldi r16,1
C:000001 bb07 out ddrb,r16 ; PB0 as output
C:000002 9701 sbiw r24,1 ; slight wait
C:000003 f7f1 brne PC-1
C:000004 9ab0 sbi pinb,pinb0 ; toggle
C:000005 cffc rjmp PC-3 ; forever
フラッシュの内容を次のように抽出します。
$ avrdude -p t13 -P usb -c usbtiny -U flash:r:flash.bin:r
与える:e001 bb07 9701 f7f1 9ab0 cffc
分解:
$ ./avrdisas -a1 -o1 -s1 flash.bin
; Disassembly of flash.bin (avr-gcc style)
.text
main:
0: 01 e0 ldi r16, 0x01 ; 1
2: 07 bb out 0x17, r16 ; 23
; Referenced from offset 0x06 by brne
; Referenced from offset 0x0a by rjmp
Label1:
4: 01 97 sbiw r24, 0x01 ; 1
6: f1 f7 brne Label1
8: b0 9a sbi 0x16, 0 ; 0x01 = 1
a: fc cf rjmp Label1
エンディアンがリストと一致せず、0x17をDDRBなどに解決する必要がある場合でも、これは私にとってはうまくいきます。
オープンソースの逆アセンブラとして、コマンドライン指向のRadare2を試しましたが、Cutterと呼ばれるGUIを使用することもできます。https://rada.re/n/
または、古典的なavr-objdumpを使用することもできます。
avr-objdump.exe -j .sec1 -d -m avr5 dumpfile.hex
問題はむしろHEXファイルを逆アセンブルすることであり、解決策として、他の回答で上記の非常に多くのツールが言及されています。これ以上何かを追加するのは難しい。
しかし、誰かが探しているなら:IDEで実行している間にC /C++を分解することも可能です。統合された逆アセンブルツールを備えたAtmelスタジオでは、次の方法で実行できます。
これは、特定のコードフラグメントが必要に応じてコンパイルされていることを確認するために役立ちます。これは、最適化によってシーケンスがスキップ/マングルされ、予期しない動作が発生する場合があるためです。