如何从开发板上提取代码?
如何找出进入hex文件的原始源代码?
#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
评论
为了改善下面的答案-在原始源代码之外,您是否还需要寻找更多详细信息?@borowcm基本功能。您的答案涵盖了这一点。您尚未将其选择为最佳答案,其他人则可以对其进行回答/添加。