การออกแบบคอมไพเลอร์ – บทนำ

Source page: http://www.backerstreet.com/decompiler/introduction.htm

Giampiero Caprino จามเหมือนเจ้าชาย

บทนำ

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

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

มีความพยายามหลายครั้งในการเขียนตัวถอดรหัสปฏิบัติการไบนารี หน้านี้ มีตัวอย่างบางส่วน

มีตัวถอดรหัสเพิ่มเติมสำหรับสภาพแวดล้อมที่มีการจัดการซึ่งใช้รหัสไบต์เช่น Java และ C# รายการมากมายมีอยู่ที่ การแปลงโปรแกรมวิกิ

ในหน้าเหล่านี้เราจะมุ่งเน้นไปที่การแยกส่วนของไฟล์ปฏิบัติการไบนารีหรือจากรหัสเครื่องไปยังซอร์สโค้ดเนื่องจากเป็นเรื่องยากกว่าการถอดรหัส Java ไบต์รหัส หรือ C#

หลายภาษาและคอมไพเลอร์สามารถสร้างรหัสเครื่องรวมถึงคอมไพเลอร์ Java, C# และ Visual Basic บางตัว ดังนั้นตัวถอดรหัสต้องรู้ภาษาที่ใช้ในการคอมไพล์โปรแกรมและจะต้องมีการสนับสนุนเพื่อสร้างภาษานั้น อย่างไรก็ตามปัญหาที่ยากที่สุดในการแยกส่วนจะปรากฏขึ้นเมื่อใช้ภาษาที่มีข้อ จำกัด น้อยกว่าคือ C, Pascal หรือ C++

อัลกอริทึมส่วนใหญ่สามารถใช้ได้กับทุกภาษาดังนั้นเราจะใช้ตัวอย่างที่เขียนเป็นภาษาซีเป็นส่วนใหญ่เมื่อเราแสดงอัลกอริทึมเราจะใช้ C หรือ C++ เนื่องจากภาษาเหล่านี้เป็นภาษาที่มีอยู่มากที่สุดใน Linux และ Windows

เครื่องแปลภาษาส่วนใหญ่จะเกี่ยวข้องกับเอนทิตี 3 ชนิดโดยไม่คำนึงถึงภาษาเป้าหมาย

  • วัตถุรหัส (ฟังก์ชั่นงบ)
  • วัตถุข้อมูล (ตัวแปรทั่วโลกและท้องถิ่น)
  • ประเภท (ประเภทตัวแปร, ฟังก์ชั่นต้นแบบ)

ปัญหาคงที่ของ ของคอมไพเลอร์ คือพยายามที่จะอนุมานหนึ่งหรือมากกว่าหนึ่งในสามหน่วยงานดังกล่าวข้างต้นจากลำดับของไบต์ที่พบในไฟล์ไบนารี ในการทำเช่นนี้มีประโยชน์ที่จะทราบว่าเครื่องมือการพัฒนา (ที่เราเรียกว่า ‘วิศวกรรมไปข้างหน้า’ เครื่องมือ) ใช้อย่างไรเมื่อเขียนโปรแกรมเนื่องจากเป็นกระบวนการที่เราพยายามเปลี่ยนกลับ