มีตัวถอดรหัส C ++ หรือไม่? [ปิด]


116

ฉันมีโปรแกรมที่ฉันทำซอร์สโค้ด C ++ หาย มีตัวถอดรหัส C ++ ที่ดีหรือไม่?

ฉันวิ่งข้ามบูมเมอแรงแล้ว


objdumpสำหรับ Linux
Stypox

1
เครื่องตัดสำหรับ gui ที่ยอดเยี่ยมและตัวถอดรหัสในตัวที่ยอดเยี่ยม
Misiur

คำตอบ:


80

คุณสามารถใช้IDA ProโดยHex-Rays โดยปกติคุณจะไม่ได้รับ C ++ ที่ดีจากไบนารีเว้นแต่คุณจะรวบรวมข้อมูลในการดีบัก เตรียมใช้แรงงานคนจำนวนมากในการย้อนกลับรหัส

หากคุณไม่ได้ตัดไบนารีออกมีความหวังว่า IDA Pro สามารถสร้างรหัส C-alike เพื่อให้คุณใช้งานได้ โดยปกติแล้วมันจะหยาบมากอย่างน้อยก็เมื่อสองสามปีก่อน


27
เพื่อชี้แจง IDA จะให้เฉพาะการถอดชิ้นส่วนเท่านั้น มีส่วนเสริมที่เรียกว่า Hex-Rays ซึ่งจะแยกส่วนที่เหลือลงในซอร์ส C / C ++ เท่าที่จะทำได้
davenpcj

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

เพื่อชี้แจงเพิ่มเติมบางส่วน Disassembly เป็นสิ่งที่คุณสามารถถอดรหัสได้มากที่สุดด้วย Hex-Rays จะแปล ASM เป็น C ++ ASM สามารถแปลเป็นภาษาโปรแกรมใดก็ได้ที่ทำงานได้เนื่องจากโปรแกรมทั้งหมดสามารถทำงานเป็น ASM ได้
Barkermn 01

4
SNOWMAN เป็นตัวถอดรหัส c ++ ที่ดีฟรี
Inga

2
+1 สำหรับ Snowman แต่อย่างที่คนอื่น ๆ พูดถึงแม้แต่Helloธรรมดา ๆโลกก็แทบจะอ่านไม่ได้เลยเมื่อถอดรหัส
bdetweiler

25

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


25
"จิตวิญญาณ" ของรายการหายไปเป็นเพียงเปลือกว่างเปล่าของตัวตนในอดีต ... "
Darshan Chaudhary

21

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


6

ฉันไม่เห็นตัวถอดรหัสใด ๆ ที่สร้างรหัส C ++ ฉันเคยเห็นการทดลองสองสามรายการที่พยายามสร้างรหัส C อย่างสมเหตุสมผล แต่พวกเขามักจะขึ้นอยู่กับการจับคู่รูปแบบการสร้างรหัสของคอมไพเลอร์เฉพาะ (ซึ่งอาจมีการเปลี่ยนแปลงมันเป็นเวลานานแล้วที่ฉันได้ตรวจสอบสิ่งนี้ครั้งล่าสุด ) ข้อมูลเชิงสัญลักษณ์ใด ๆ จะหายไปแน่นอน Google สำหรับ "decompiler"


4

ขึ้นอยู่กับว่าโค้ดต้นฉบับมีขนาดใหญ่เพียงใดและเขียนได้ดีเพียงใดการเริ่มต้นอีกครั้งในภาษาโปรดของคุณ (ซึ่งอาจยังคงเป็น C ++) และเรียนรู้จากข้อผิดพลาดที่เกิดขึ้นในเวอร์ชันล่าสุด ไม่เคยมีใครพูดเกี่ยวกับการเขียนหนึ่งเพื่อทิ้ง?

nb เห็นได้ชัดว่าหากเป็นผลิตภัณฑ์ขนาดใหญ่อาจไม่คุ้มกับเวลา



24
โจเอลเป็นคอลัมนิสต์ที่ยอดเยี่ยม แต่ในบางครั้งก็ผิดพลาด แล้วก็มีหลายครั้งที่เขายกมาผิด เช่นเดียวกับที่นี่เนื่องจากคำถามมุ่งเน้นไปที่การสูญเสียซอร์สโค้ด บทความ Joels อธิบายว่าเหตุใดซอร์สโค้ดจึงมีค่า
MSalters

5
ไม่เคยมีใครพูดเกี่ยวกับการเขียนหนึ่งเพื่อทิ้ง? ใช่แล้วเขาก็เปลี่ยนใจdavewsmith.com/blog/2010/brook-revisits-plan-to-throw-one-away [I] n 1975 ฉันแนะนำโปรแกรมเมอร์ให้ "ทิ้งเวอร์ชันแรกทิ้งไป" จากนั้นสร้างวินาที หนึ่ง. ในฉบับครบรอบ 20 ปีฉันตระหนักว่าการทำซ้ำแบบเพิ่มหน่วยคงที่เป็นแนวทางที่ดีกว่า
ta.speot.is
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.