我有一个Arduino Uno Rev3。我想提取并找出微控制器板ROM上刻录的代码是什么。


如何从开发板上提取代码?
如何找出进入hex文件的原始源代码?


评论

为了改善下面的答案-在原始源代码之外,您是否还需要寻找更多详细信息?

@borowcm基本功能。您的答案涵盖了这一点。您尚未将其选择为最佳答案,其他人则可以对其进行回答/添加。

#1 楼

我将分两部分来回答这个问题,#1相对容易,#2不可能达到我假设的水平。
1。从Uno提取十六进制代码:
具体取决于您所拥有的Uno的修订版,但是您将需要使用avrdude(适用于Linux,与OS X Arduino软件捆绑在一起)和一个命令类似于从ATmega168中提取信息的以下内容:
avrdude -F -v -pm168 -cstk500v1 -P/dev/ttyUSB0 -b19200 -D -Uflash:r:program.bin:r

查看avrdude文档以匹配特定于您设备的零件参数-p(或发布它们,我们可以从那里开始)。 br />因为您似乎拥有Uno Rev3,所以该主板具有ATmega328(-pm328)。程序员“使用原始的STK500协议进行通信”,因此通信协议标志-c应为-cstk500v1您需要的命令(假设Uno已连接到/ dev / ttyUSB0),如下所示:
avrdude -F -v -pm328p -cstk500v1 -P/dev/ttyUSB0 -b19200 -D -Uflash:r:program.bin:r

接下来您的命令第二个问题。
2。将十六进制代码转换为原始源代码:
抱歉,但这是不可能的。尽管您可以获取一些十六进制的“反编译器”,但返回的乱码虽然在功能上是正确的,但却无法被人类读取(某些商业版本,例如Hex-Rays,可能会为您提供一定程度的人类可读性)。
话虽如此,您最好还是将汇编/转换器转换为十六进制-仍然只能使您对正在发生的事情有更好的了解,但(根据定义)仍然会非常低。所有变量名,注释等都将被剥离,并且您仍然会不知道原始源程序的内容,只是编译后的结果。
由于您正在处理Atmel设备,因此可以尝试使用avr特定的gcc工具链avr-gcc。具体来说,您需要使用所需的MCU类型标志avr-objdump(avr5)架构(可用架构的完整列表,MCU类型)-m atmega328
avr-objdump -s -m atmega328 program.hex > program.dump

根据您的配置,提供架构类型本身(avr5)也可能就足够了:
avr-objdump -s -m avr5 program.hex > program.dump


#2 楼

在arduino nano的窗户上,您可以执行以下操作:

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


其后是:

"C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude" -F "-CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -v -patmega328p -carduino -PCOM14 -b57600 -D-Uflash:r:c:\keep\program.bin:r


这里是上面的抓取代码的输出:

avrdude2.exe: Version 6.0.1, compiled on Mar 30 2015 at 14:56:06
              Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
              Copyright (c) 2007-2009 Joerg Wunsch

              System wide configuration file is "C:\Program Files (x86)\Arduino\
hardware\tools\avr/etc/avrdude.conf"

              Using Port                    : COM14
              Using Programmer              : arduino
              Overriding Baud Rate          : 57600
              AVR Part                      : ATmega328P
              Chip Erase delay              : 9000 us
              PAGEL                         : PD7
              BS2                           : PC2
              RESET disposition             : dedicated
              RETRY pulse                   : SCK
              serial program mode           : yes
              parallel program mode         : yes
              Timeout                       : 200
              StabDelay                     : 100
              CmdexeDelay                   : 25
              SyncLoops                     : 32
              ByteDelay                     : 0
              PollIndex                     : 3
              PollValue                     : 0x53
              Memory Detail                 :

                                       Block Poll               Page
           Polled
                Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW
  MaxW   ReadBack
                ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----
- ----- ---------
                eeprom        65    20     4    0 no       1024    4      0  360
0  3600 0xff 0xff
                flash         65     6   128    0 yes     32768  128    256  450
0  4500 0xff 0xff
                lfuse          0     0     0    0 no          1    0      0  450
0  4500 0x00 0x00
                hfuse          0     0     0    0 no          1    0      0  450
0  4500 0x00 0x00
                efuse          0     0     0    0 no          1    0      0  450
0  4500 0x00 0x00
                lock           0     0     0    0 no          1    0      0  450
0  4500 0x00 0x00
                calibration    0     0     0    0 no          1    0      0
0     0 0x00 0x00
                signature      0     0     0    0 no          3    0      0
0     0 0x00 0x00

              Programmer Type : Arduino
              Description     : Arduino
              Hardware Version: 2
              Firmware Version: 1.16
              Vtarget         : 0.0 V
              Varef           : 0.0 V
              Oscillator      : Off
              SCK period      : 0.1 us

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

Reading | ################################################## | 100% 0.02s

avrdude2.exe: Device signature = 0x1e950f
avrdude2.exe: safemode: lfuse reads as 0
avrdude2.exe: safemode: hfuse reads as 0
avrdude2.exe: safemode: efuse reads as 0
avrdude2.exe: reading flash memory:

Reading | ################################################## | 100% 9.49s

avrdude2.exe: writing output file "c:\keep\program.bin"

avrdude2.exe: safemode: lfuse reads as 0
avrdude2.exe: safemode: hfuse reads as 0
avrdude2.exe: safemode: efuse reads as 0
avrdude2.exe: safemode: Fuses OK (H:00, E:00, L:00)

avrdude2.exe done.  Thank you.


,这是结果文件:-

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin>dir c:\keep\program.bin
 Volume in drive C has no label.
 Volume Serial Number is EE8C-DFB9

 Directory of c:\keep

19/02/2016  07:00 PM            32,670 program.bin
               1 File(s)         32,670 bytes
               0 Dir(s)  41,416,818,688 bytes free


我将我的“ avrdude.exe”重命名为“ avrdude2.exe”,并编写了一个名为“ avrdude.exe”的填充程序,在将arduino所做的工作输出到目标设备后,该填充程序将调用真实的填充程序。

我的系统用来构建的原始命令是:-

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude "-CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -v -patmega328p -carduino -PCOM14 -b57600 -D -Uflash:w:C:\Users\user\AppData\Local\Temp\build4588201597642272956.tmp/TFT_Baja2.cpp.hex:i


有趣的事实:十六进制转储包含我想要的其他代码片段书面...这对于任何以前用于其他用途的运输arduinos的人来说,都意味着一些非常有趣的隐私和安全问题...

如果您使用的不是Nano板,我的垫片是:

#!perl

use strict;

foreach(@ARGV){$_=qq("$_") if(/\s/)};   # DOS Wants quotes around space-embedded paramaters!

foreach(@ARGV){$_='-v' if($_ eq '-q');} # go verbose instead of silent

my $parms=join(" ",@ARGV);
open(OUT,">>","C:\keep\avrdude.log") || warn "Cannot write: $!"; 
print OUT "\n" . &db_now() . " 
perlapp avrdude.pl
$parms\n"; close(OUT); my $rc=`avrdude2.exe $parms`; open(OUT,">>","C:\keep\avrdude.log"); print OUT $rc; close(OUT); print $rc; # Return "now()" in mysql default format. sub db_now { my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); return sprintf("%04d-%02d-%02d %02d:%02d:%02d",1900+$year,$mon+1,$mday,$hour,$min,$sec); }


使用以下命令编译到Windows .exe:

q4312078q

享受!

#3 楼

有一种使用此开源应用程序重新编译的方法,称为RetDec:

https://github.com/avast-tl/retdec

评论


las,它不支持AVR。

–伊戈尔·斯科钦斯基♦
18年5月11日在13:13