الهدف من هذا المشروع هو تنفيذ خط أنابيب إلغاء تجميع مكونات مستقلة تتفاعل من خلال واجهات محددة جيدًا ، كما هو موضح في مستندات التصميم للمشروع.
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...انظر مثال الاستخدام في الأمثلة/العرض التوضيحي ، وهذا التعليق لمزيد من التفاصيل.
من منظور رفيع المستوى ، يتم تجميع مكونات خط أنابيب فك الإلغاء مفاهيميًا في ثلاث وحدات. أولاً ، يترجم الواجهة الأمامية لغة المصدر (على سبيل المثال مجموعة X86) إلى LLVM IR ؛ تمثيل وسيطة منخفضة المستوى مستقلة عن النظام الأساسي. ثانياً ، تقوم الهياكل المتوسطة LLVM IR من خلال تحديد بدائل تدفق التحكم عالية المستوى (مثل حلقات ما قبل الاختبار ، الشرطية ذات الاتجاهين). أخيرًا ، يترجم الواجهة الخلفية LLVM IR المنظمة إلى لغة برمجة مستهدفة عالية المستوى (على سبيل المثال).
يلخص الملصق التالي القدرات الحالية لخط أنابيب فك الإلغاء ، باستخدام تكوين مكونات مستقلة لترجمة 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
أداة استعادة تدفق التحكم.
استرداد Primitives تدفق التحكم من الرسوم البيانية لتدفق التحكم ( *.DOT -> *.JSON).
ترجمة LLVM IR المهيكلة إلى لغة مستهدفة عالية المستوى (على سبيل المثال GO).
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
GO Code Generation Tool.
Delpile llvm IR Assembly to GO Source Code ( *.ll -> *.go).
https://godoc.org/github.com/decomp/decomp/cmd/go-post
اذهب إلى أداة ما بعد المعالجة.
ما بعد العملية Go Source Code لجعله أكثر اعتمادًا ( *.go -> *.Go).
التركيز الأساسي للإصدار 0.2: سرعة التجميع على مستوى المشروع .
يجب أن يكون تطوير مكونات فك الإلغاء ممتعًا.
يبدو أن هناك ارتباطًا عكسيًا بين الاعتماد على مكتبة C ++ ضخمة والاستمتاع بتطوير مكونات فك الإلغاء.
يسعى الإصدار 0.2 من خط أنابيب فك الإلغاء إلى حل هذه المشكلة عن طريق الاستفادة من مكتبة LLVM IR مكتوبة في Pure Go. قبل هذا الإصدار ، قد يستغرق تجميع على مستوى المشروع عدة ساعات لإكماله. الآن ، يكملون في أقل من دقيقة واحدة - الحد الأقصى الثابت لجميع الإصدارات المستقبلية.
الإصدار الأولي.
التركيز الأساسي للنسخة 0.1: فك التشكيل .
يجب أن تكون decompilers قابلة للتأليف ومفتوح المصدر.
يجب أن يتكون خط أنابيب إزالة التجميع من مكونات فردية ، ولكل منها غرض واحد ومدخلات ومخرجات محددة جيدًا.
يستكشف الإصدار 0.1 من مشروع Decomp جدوى تكوين خط أنابيب فك الارتباط عن المكونات المستقلة ، وإمكانية تعريض هذه المكونات للمستخدم النهائي.
لمزيد من الخلفية ، ارجع إلى إزالة الإلغاء التركيبي باستخدام وثيقة تصميم LLVM IR.
التركيز الأساسي للنسخة 0.3: رفع النوع الثنائي .
تعتمد Decompilers على رفع الثنائي عالي الجودة.
تحدد جودة إخراج الأشعة تحت الحمراء في الواجهة الأمامية للرفع الثنائي بشكل أساسي جودة ناتج خط أنابيب إزالة الإلغاء.
يهدف الإصدار 0.3 إلى تحسين جودة الإخراج LLVM IR من خلال تنفيذ الواجهة الأمامية للرفع الثنائي المدرك.
التركيز الأساسي للإصدار 0.4: تحليل تدفق التحكم .
يجب أن يستعيد Decompilers بدائل تدفق التحكم عالية المستوى.
أحد الاختلافات الأساسية بين التجميع منخفض المستوى ورمز المصدر عالي المستوى هو استخدام بدائل تدفق التحكم عالية المستوى ؛ على سبيل المثال ، شروطتين في اتجاهين ودوريين و n ( if ، if-else and switch ) ، حلقات ما قبل الاختبار وما بعد الاختبار ( while do-while ).
يسعى الإصدار 0.4 لاستعادة بدائل تدفق التحكم عالية المستوى باستخدام خوارزميات تحليل تدفق التحكم القوية.
التركيز الأساسي للنسخة 0.5: التسامح مع الأخطاء .
يجب أن تكون decompilers قوية.
يجب أن تستجيب مكونات إلغاء التجميع جيدًا للحالات غير المتوقعة والتحليل غير المكتمل.
يركز الإصدار 0.5 على الاستقرار ، ويسعى إلى اختبار خط أنابيب فك الإلغاء باستخدام برنامج العالم شبه الحقيقي (انظر سلسلة تحديات التحدي).
التركيز الأساسي للإصدار 0.6: تحليل تدفق البيانات .
التركيز الأساسي للإصدار 0.7: تحليل النوع .