แปลงไฟล์ปฏิบัติการกลับเป็นซอร์สโค้ด C


14

น่าเสียดายที่ฉันทำซอร์สโค้ดของฉันหายและฉันเพิ่งมีไฟล์เอาต์พุตที่สร้างด้วย gcc ใน linux และฉันไม่มีสิทธิ์เข้าถึงพีซีของฉันเลยตอนนี้มีวิธีแปลงไฟล์เอาต์พุตเป็นไฟล์ต้นฉบับ (ใน c ภายใต้ linux) หรือไม่


สิ่งที่คุณต้องการเรียกว่า decompiler คุณอาจพบความช่วยเหลือเกี่ยวกับคำตอบนี้: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf

IDA Pro พร้อมโมดูลตัวถอดรหัสสัญญาณเสียงเป็นโซลูชันทางปฏิบัติตัวเดียวที่ใช้งานได้จริงกับโปรแกรมเรียกใช้งานขนาดใหญ่
fpmurphy

@ fpmurphy1 คุณได้รับ Hopper ซึ่งเทียบเคียงได้กับคุณภาพของ IDA Pro และใบอนุญาตใดเป็นเศษส่วนของราคา
Rui F Ribeiro

@ fpmurphy1 ฉันยังไม่ได้เห็นคุณภาพของรหัสที่สร้างโดย Avast ... ใครที่ใช้แพลตฟอร์ม Intel 32 บิตอีกต่อไป นอกจากนี้ฉันไม่ได้ใช้ Wintel มานานหลายทศวรรษแล้ว ดูunix.stackexchange.com/questions/418354/ …ความแตกต่างของราคาค่อนข้างมีนัยสำคัญอย่างไรก็ตาม Hex-rays / IDA pro เริ่มต้นที่ 1,500 USD สำหรับใบอนุญาตส่วนบุคคลไปยังค่ากรรโชกสำหรับใบอนุญาตการค้าเช่น 5000USD หรือสูงกว่า AFAIK, Hopper คือ 100USD สำหรับผู้ใช้คนเดียวและ 130 สำหรับคอมพิวเตอร์เครื่องเดียว
Rui F Ribeiro

@RuiFRibeiro มัลแวร์จำนวนมากที่ฉันตรวจสอบยังคงเป็นแบบ 32 บิต
fpmurphy

คำตอบ:


25

ดังนั้นคุณมีวัว แต่คุณแปลงมันเป็นแฮมเบอร์เกอร์โดยไม่ได้ตั้งใจและตอนนี้คุณต้องการวัวของคุณกลับมา

ขออภัยมันไม่ทำงานอย่างนั้น

เพียงกู้คืนไฟล์ต้นฉบับจากข้อมูลสำรองของคุณ

อาคุณไม่มีข้อมูลสำรอง น่าเสียดายที่เอกภพไม่ได้หยุดพักสำหรับสิ่งนั้น

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

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


1
บูมเมอแรงดูค่อนข้างเรียบร้อย อัปยศเอกสารอ้างอิง gcc -O4 ตั้งแต่นั้นไม่ทำอะไรเลย (เกิน -O3) ถ้าหน่วยความจำทำหน้าที่ฉันถูกต้อง แน่นอนว่าประโยคสุดท้ายของคุณมีผลอย่างมากเช่นเดียวกับประโยคห้าประโยคแรกของคุณ นั่นไม่ใช่การบอกว่าส่วนที่เหลือนั้นไม่ถูกต้องมากนักเพราะคุณกำลังทำประเด็นที่สำคัญมากเกี่ยวกับความสำคัญของการสำรองข้อมูลเป็นประจำ +1
Pryftan

6

เครื่องมือหลายอย่างเป็นเรื่องธรรมดาในวิศวกรรมย้อนกลับที่ปฏิบัติการได้

  1. คำสั่ง "ไฟล์" ซึ่งใช้พา ธ ไฟล์เป็นพารามิเตอร์แรกเพื่อให้คุณสามารถกำหนด (ในกรณีส่วนใหญ่) ชนิดของไฟล์ปฏิบัติการที่คุณมี
  2. Disassembler ที่แสดงว่าสิ่งที่ปฏิบัติการทำได้ แต่อ่านยากสำหรับผู้ที่ไม่ได้เขียนรหัสชุดประกอบบนสถาปัตยกรรมเฉพาะนั้นหรือมีประสบการณ์ในการถอดชิ้นส่วน
  3. Decompilers เช่น Boomerang, Hex-rays และ Snowman สามารถให้ความสามารถในการอ่านได้มากกว่า แต่ไม่สามารถกู้ชื่อตัวแปรหรือซินแท็กซ์ของโปรแกรมดั้งเดิมได้และไม่น่าเชื่อถือ 100% โดยเฉพาะในกรณีที่วิศวกรที่สร้างโปรแกรมปฏิบัติการทดสอบ แพ็คเกจเหล่านี้และพยายามทำให้การรักษาความปลอดภัยแย่ลงอีก
  4. ไดอะแกรมการไหลของข้อมูลหรือตาราง ฉันรู้ว่าไม่มีเครื่องมือฟรีที่จะทำสิ่งนี้โดยอัตโนมัติ แต่สคริปต์ Python หรือ Bash ที่ด้านบนของตัวแยกวิเคราะห์ข้อความของเอาต์พุตแอสเซมบลี (ซึ่งสามารถเขียนใน sed หรือ Perl) จะมีประโยชน์
  5. ดินสอและกระดาษเชื่อหรือไม่สำหรับการจดไหลและความคิด

ในกรณีส่วนใหญ่ที่ฉันเห็นรหัสจำเป็นต้องเขียนใหม่ตั้งแต่ต้นรักษาเป็นภาษาแอสเซมบลีภาษาหรือสร้างขึ้นใหม่โดยใช้การร้องขอการเปลี่ยนแปลงอีกครั้งกับเวอร์ชันที่เก่ากว่า


1
# 1: จริงแม้ว่ามันจะมีข้อบกพร่องเช่นกัน # 3: ฉันเดาว่ามันเป็นโฆษณาหรือเปล่า ฉันแค่อยากรู้เชิงวิชาการ (ฉันมีการสำรองข้อมูลซ้ำซ้อนจึงไม่จำเป็นต้องมีสิ่งนั้น) # 4: cflow (แม้ว่าจะใช้แหล่งที่มามีบางอย่างที่ทำงานบนไบนารี - กับบางคำเตือนแน่นอน) มาถึงใจ มีคนอื่น ๆ ออกมีขึ้นอยู่กับสิ่งที่คุณหลังจาก สำหรับเอาต์พุตกราฟิกฉันไม่สามารถช่วยได้เพราะฉันไม่ชอบหรือต้องการเอาต์พุตกราฟิกสำหรับสิ่งประเภทนั้น (ฉันจะพบว่ามันกวนใจจริง ๆ ) # 5: จริงมาก คุณสามารถใช้ไฟล์ข้อความได้ที่นี่แน่นอน
Pryftan

3

สิ่งที่คุณต้องการทำเรียกว่า "decompiling" มี decompilers มากมายอยู่ที่นั่นและมันก็ไม่เชิงที่จะครอบคลุมพวกมันทั้งหมดที่นี่

อย่างไรก็ตามตามข้อสังเกตทั่วไป: การแปลงจากซอร์ส C ไปเป็นรหัสเครื่องที่ใช้งานได้นั้นสูญเสียไป ตัวอย่างเช่น

  • ความคิดเห็นจะหายไปอย่างถาวร
  • ชื่อตัวแปรหายไป
  • บางครั้งการวนซ้ำไม่ถูกควบคุมเพื่อประสิทธิภาพ
  • ฟังก์ชั่นอาจถูกจัดเรียงใหม่

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


ในเรื่องของความคิดเห็นสิ่งที่ฉันสังเกตเห็นเมื่อเร็ว ๆ นี้คือ - และฉันไม่รู้ว่ามันจะช่วยให้ความคิดเห็นที่จะอ่านโดย decompiler หรือฉันคาดหวังว่า decompilers จะมองหาสิ่งประเภทนี้ - นี่: -C อย่าทิ้งความคิดเห็น ความคิดเห็นทั้งหมดจะถูกส่งผ่านไปยังไฟล์เอาต์พุตยกเว้นความคิดเห็นในคำสั่งที่ประมวลผลซึ่งจะถูกลบพร้อมกับคำสั่ง มันเน้นผลข้างเคียงรวมทั้งตัวเลือก -CC (นี่คือ gcc แม้ว่าอาจเป็น cpp แทน) ไม่ใช่ว่าฉันคาดหวังว่ามันจะนำไปใช้กับ OP แต่อาจเป็นที่สนใจของบางคน
Pryftan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.