มีวิธีการดาวน์โหลดภาพร่างจาก Arduino หรือไม่?


44

ฉันทำร่าง แต่แล้วฉันก็ทำมันหาย อย่างไรก็ตามฉันอัปโหลดไปยัง Arduino ก่อนที่จะสูญเสียมัน มีวิธีใดบ้างที่ฉันจะเอามันคืนมาได้?


5
electronics.stackexchange.com/questions/28211/ …แต่อย่างที่คนอื่นบอกว่ามันแยกไฟล์. hex ออกเท่านั้นไม่ใช่แหล่งกำเนิด C
jippie

ข้ามไซต์อุปกรณ์: reverseengineering.stackexchange.com/q/125/189
asheeshr

คำตอบ:


35

ควรเป็นไปได้ตราบใดที่ไม่ได้ตั้งค่าบิตความปลอดภัย คำถามนี้ถูกถามใน EE ในขณะที่กลับ

เป็นไปได้หรือไม่ที่จะดึงรหัสจากบอร์ด Arduino

แต่คุณจะไม่ได้รับรหัส Arduino ที่คุณเขียนกลับมา รหัสจะถูกรวบรวมไว้ในชุดประกอบและคุณจะต้องแปลงกลับเป็น C ด้วยตัวคุณเอง


การอ่านเลขฐานสิบหกดิบ: forum.arduino.cc/index.php?topic=6150.0 และการถอดอัตโนมัติ: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

20

คำตอบนี้ไม่ได้ตอบคำถามโดยตรง แต่ยังจะส่งผลให้ผลลัพธ์เดียวกัน

Arduino IDE ใช้ไดเรกทอรีชั่วคราวเพื่อจัดเก็บไฟล์บิลด์รวมถึงร่างต้นฉบับรวมถึงไฟล์ HEX และไฟล์ระดับกลาง

บน Mac สิ่งเหล่านี้อยู่ใน / var / โฟลเดอร์โดยค่าเริ่มต้นและบนเครื่อง Windows ที่อยู่ใน ... \ Local Settings \ Temp \ (ซึ่งขึ้นอยู่กับรุ่นของ Windows อาจอยู่ในหลาย ๆ ที่)

ฉันพบว่าโดยเฉพาะอย่างยิ่งใน Windows ไฟล์สร้างเหล่านี้จะไม่ถูกลบเมื่อคุณปิดแบบร่างหรือ IDE ดังนั้นอาจมีอยู่ในเครื่องของคุณนานกว่าที่คุณคิด

นอกจากนี้ตามค่าเริ่มต้น Crashplan, Backblaze และ Time Machine สำรองข้อมูลตำแหน่งเหล่านี้ดังนั้นแม้ว่าจะถูกลบไปแล้วก็ตามพวกเขาอาจยังอยู่ในการสำรองข้อมูล

ข้อได้เปรียบที่นี่คือคุณจะกู้คืนรหัส C แทน ASM


3
นี่คือทางออกที่ดีที่สุด IMHO ความคิดสร้างสรรค์มากเกินไป ...
dda

1
คุณอาจพบสิ่งนี้ใน/tmp/ไดเรกทอรีบน Linux (และแม้แต่ Mac) cf arduino.cc/th/Hacking/BuildProcess
pd12

ความคิดเห็นสะท้อนจากคำตอบที่ยอมรับ: การอ่าน hex ดิบ: forum.arduino.cc/index.php?topic=6150.0 และการถอดชิ้นส่วนอัตโนมัติ: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

คุณสามารถดาวน์โหลดฐานข้อมูลเลขฐานสิบหกของไฟล์ได้ แต่ไม่มีวิธีง่ายๆในการรับรหัส C ++ และความคิดเห็นทั้งหมด หากคุณสามารถเข้าใจแอสเซมบลีคุณสามารถสร้างโปรแกรมใหม่ แต่อาจใช้เวลาสักครู่ มีตัวแยกสัญญาณสำหรับอุปกรณ์บางตัวฉันไม่รู้เกี่ยวกับ arduino


3
ไม่มีแอสเซมบลีแทร็กสำหรับ Arduino เนื่องจากไม่ใช่ชนิด MCU มีอยู่หลายATMEGA disassemblers (Google atmega disassembler)
Connor Wolf

หากคุณมี arduino envitonment คุณมี avr-objdump เหมือนกับ avr-gcc
Chris Stratton

การอ่านเลขฐานสิบหกแบบดิบ: forum.arduino.cc/index.php?topic=6150.0 และการถอดอัตโนมัติ: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

ฉันคิดว่ามีวิธีอื่นในการทำเช่นนี้โดยไม่ต้องแยกรหัสจากบอร์ด Arduino จำวันที่ที่คุณสร้างร่างและค้นหาใน C: \ Users \ User \ AppData \ Local \ Temp \ (ตัวอย่างเช่น: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a) คุณสามารถค้นหารหัสที่ไม่ได้บันทึกของคุณได้เว้นแต่จะถูกลบโดย "โปรแกรมเพิ่มพื้นที่ว่าง" บางโปรแกรม โชคดี!


4

หากคุณไม่มีวัตถุประสงค์เพื่อคัดลอกรหัสที่เหมือนกันไปยังอุปกรณ์อื่นคำตอบง่ายๆคือ: ไม่

ดังที่ได้อธิบายไว้ในคำตอบอื่น ๆ คุณสามารถเปลี่ยนรหัสฐานสิบหกบนอุปกรณ์กลับไปเป็นรหัสแอสเซมเบลอร์

ตัวอย่างเช่น (เมื่อคุณคัดลอกรหัสจากอุปกรณ์กลับสู่ดิสก์ของคุณ):

avr-objdump -j .sec1 -d -m avr5 yourFileHere.hex

ทำงานกับไฟล์ bootloader ไฟล์ใดไฟล์หนึ่งที่ฉันได้รับผลลัพธ์เหล่านี้ (บางส่วน):

00007e00 <.sec1>:
    7e00:       11 24           eor     r1, r1
    7e02:       84 b7           in      r24, 0x34       ; 52
    7e04:       14 be           out     0x34, r1        ; 52
    7e06:       81 ff           sbrs    r24, 1
    7e08:       f0 d0           rcall   .+480           ;  0x7fea
    7e0a:       85 e0           ldi     r24, 0x05       ; 5
    7e0c:       80 93 81 00     sts     0x0081, r24
    7e10:       82 e0           ldi     r24, 0x02       ; 2
    7e12:       80 93 c0 00     sts     0x00C0, r24
    7e16:       88 e1           ldi     r24, 0x18       ; 24
    7e18:       80 93 c1 00     sts     0x00C1, r24
    7e1c:       86 e0           ldi     r24, 0x06       ; 6
    7e1e:       80 93 c2 00     sts     0x00C2, r24
    7e22:       80 e1           ldi     r24, 0x10       ; 16
    7e24:       80 93 c4 00     sts     0x00C4, r24
    7e28:       8e e0           ldi     r24, 0x0E       ; 14
    7e2a:       c9 d0           rcall   .+402           ;  0x7fbe
    7e2c:       25 9a           sbi     0x04, 5 ; 4

อย่างที่คุณเห็นไม่มีประโยชน์อย่างยิ่งในการทำซ้ำสิ่งที่ร่างของคุณทำ มีแนวโน้มว่าจะเป็นหนึ่งในสองสถานการณ์:

  • ร่างของคุณสั้นซึ่งในกรณีนี้คุณอาจเปลี่ยนรหัสแอสเซมเบลอร์กลับเป็น C
  • ร่างของคุณยาวซึ่งในกรณีนี้มันจะเป็นไปไม่ได้เลยที่จะเปลี่ยนเป็น C

ในกรณี "ร่างสั้น" คุณจะดีกว่าแค่เขียนใหม่ตั้งแต่ต้น นั่นจะเร็วขึ้นอย่างแน่นอน ในกรณี "ร่างยาว" - มันก็ไม่คุ้มค่า ไม่มีชื่อตัวแปรใดที่ถูกสงวนไว้และวิธีที่คอมไพเลอร์ปรับรหัสให้เหมาะสมแม้โครงสร้างของรหัสจะยากต่อการพิจารณา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.