จุดมุ่งหมายของโครงการนี้คือการใช้งานท่อย่อยสลายซึ่งประกอบด้วยส่วนประกอบอิสระที่มีปฏิสัมพันธ์ผ่านอินเทอร์เฟซที่กำหนดไว้อย่างดีตามที่อธิบายไว้ในเอกสารการออกแบบของโครงการ
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...ดูตัวอย่างการใช้งานที่ตัวอย่าง/การสาธิตและความคิดเห็นนี้สำหรับรายละเอียดเพิ่มเติม
จากมุมมองระดับสูงส่วนประกอบของการสลายตัวของไปป์ไลน์จะถูกจัดกลุ่มแนวคิดเป็นสามโมดูล ประการแรกส่วนหน้าแปลภาษาต้นทาง (เช่นแอสเซมบลี x86) เป็น LLVM IR; การเป็นตัวแทนระดับกลางระดับต่ำที่ไม่ขึ้นกับแพลตฟอร์ม ประการที่สองโครงสร้างระดับกลาง LLVM IR โดยการระบุการไหลของการควบคุมระดับสูง (เช่นลูปทดสอบล่วงหน้า, เงื่อนไข 2 ทาง) สุดท้ายส่วนหลังแปล LLVM IR ที่มีโครงสร้างเป็นภาษาการเขียนโปรแกรมเป้าหมายระดับสูง (เช่น GO)
โปสเตอร์ต่อไปนี้สรุปความสามารถในปัจจุบันของการถอดรหัสไปป์ไลน์โดยใช้องค์ประกอบของส่วนประกอบอิสระเพื่อแปล LLVM IR ให้ไป
แปลรหัสเครื่อง (เช่นแอสเซมบลี x86) เป็น LLVM IR
ส่วนประกอบส่วนหน้าของบุคคลที่สาม
ดำเนินการวิเคราะห์การไหลของการควบคุมบน LLVM IR เพื่อระบุการไหลของการควบคุมระดับสูง (เช่นลูปทดสอบล่วงหน้า)
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
เครื่องมือสร้างกราฟการไหลของโฟลว์
สร้างกราฟการควบคุมการควบคุมจากแอสเซมบลี LLVM IR ( *.ll -> *.DOT)
https://godoc.org/github.com/decomp/decomp/cmd/restructure
เครื่องมือการกู้คืนการควบคุมการไหล
กู้คืนการควบคุมการไหลเริ่มต้นจากกราฟการควบคุมการไหล ( *.DOT -> *.JSON)
แปล LLVM IR ที่มีโครงสร้างเป็นภาษาเป้าหมายระดับสูง (เช่น GO)
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
เครื่องมือสร้างรหัสไป
ถอดรหัสแอสเซมบลี LLVM IR เพื่อไปที่ซอร์สโค้ด ( *.ll -> *.go)
https://godoc.org/github.com/decomp/decomp/cmd/go-post
ไปเครื่องมือหลังการประมวลผล
โพสต์กระบวนการ GO ซอร์สโค้ดเพื่อให้เป็นสำนวนมากขึ้น ( *.GO -> *.GO)
โฟกัสหลักของเวอร์ชัน 0.2: ความเร็วในการรวบรวมทั่วทั้งโครงการ
การพัฒนาส่วนประกอบการสลายตัวควรสนุก
ดูเหมือนจะมีความสัมพันธ์แบบผกผันระหว่างขึ้นอยู่กับห้องสมุด C ++ ขนาดใหญ่และสนุกกับการพัฒนาส่วนประกอบการสลายตัว
เวอร์ชัน 0.2 ของการถอดรหัสไปป์ไลน์มุ่งมั่นที่จะแก้ไขปัญหานี้โดยใช้ประโยชน์จากห้องสมุด LLVM IR ที่เขียนด้วย Pure Go ก่อนการเปิดตัวครั้งนี้การรวบรวมทั่วทั้งโครงการอาจใช้เวลาหลายชั่วโมงกว่าจะเสร็จสมบูรณ์ ตอนนี้พวกเขาเสร็จสมบูรณ์ในเวลาไม่ถึง 1 นาที - ขีด จำกัด ที่ยากลำบาก สำหรับการเผยแพร่ในอนาคตทั้งหมด
การเปิดตัวครั้งแรก
โฟกัสหลักของเวอร์ชัน 0.1: การสลายตัวขององค์ประกอบ
decompilers ควรเป็นคอมโพสิตและโอเพ่นซอร์ส
ท่อย่อยสลายควรประกอบด้วยส่วนประกอบแต่ละตัวแต่ละชิ้นมีจุดประสงค์เดียวและอินพุตและเอาต์พุตที่กำหนดไว้อย่างดี
เวอร์ชัน 0.1 ของโครงการ Decomp สำรวจความเป็นไปได้ของการเขียนท่อย่อยสลายจากส่วนประกอบอิสระและศักยภาพของการเปิดเผยส่วนประกอบเหล่านั้นไปยังผู้ใช้ปลายทาง
สำหรับพื้นหลังเพิ่มเติมโปรดดูการสลายตัวขององค์ประกอบโดยใช้เอกสารการออกแบบ LLVM IR
โฟกัสหลักของเวอร์ชัน 0.3: การยกไบนารีที่รับรู้ประเภท
decompilers พึ่งพาการยกไบนารีคุณภาพสูง
คุณภาพของเอาท์พุท IR ของการยกแบบไบนารีส่วนหน้าโดยพื้นฐานจะกำหนดคุณภาพของเอาท์พุทของไปป์ไลน์การสลายตัวทั้งหมด
เวอร์ชัน 0.3 มีจุดมุ่งหมายเพื่อปรับปรุงคุณภาพของเอาท์พุท LLVM IR โดยใช้การยกแบบไบนารีที่รับรู้ประเภท
จุดสนใจหลักของเวอร์ชัน 0.4: การวิเคราะห์การไหลของการควบคุม
decompilers ควรกู้คืนการไหลของการควบคุมระดับสูง
หนึ่งในความแตกต่างหลักระหว่างแอสเซมบลีระดับต่ำและซอร์สโค้ดระดับสูงคือการใช้การไหลของการควบคุมระดับสูง เช่น 1-WAY, 2-WAY และ N-WAY CONDITY ( if , if-else และ switch ), ลูปก่อนและหลังการทดสอบ ( while และ do-while )
เวอร์ชัน 0.4 พยายามที่จะกู้คืนการไหลของการควบคุมระดับสูงโดยใช้อัลกอริทึมการวิเคราะห์การไหลของการควบคุมที่แข็งแกร่ง
โฟกัสหลักของเวอร์ชัน 0.5: การยอมรับความผิดพลาด
decompilers ควรมีความแข็งแกร่ง
ส่วนประกอบการสลายตัวควรตอบสนองได้ดีต่อรัฐที่ไม่คาดคิดและการวิเคราะห์ที่ไม่สมบูรณ์
เวอร์ชัน 0.5 มุ่งเน้นไปที่ความเสถียรและพยายามที่จะทดสอบความเครียดไปป์ไลน์การสลายตัวโดยใช้ซอฟต์แวร์กึ่งจริงของโลก (ดูซีรี่ส์ปัญหาการท้าทาย)
จุดสนใจหลักของเวอร์ชัน 0.6: การวิเคราะห์การไหลของข้อมูล
จุดสนใจหลักของเวอร์ชัน 0.7: การวิเคราะห์ประเภท