دیکامپایلر
دیکامپایلر (به انگلیسی: Decompiler)ها برنامه هایی هستند که کد های اجرایی(فایل با پسوند هایی مانند .exe) را به عنوان وردودی دریافت میکنند و آن را به سورس کد برنامه تبدیل میکنند به طوری که این کد قابلیت کامپایل شدن را داشته باشد. عملکرد دیکامپایلر ها دقیقا برعکس کامپایلر ها میباشد. کامپالرها سورس کد را به فایل اجرایی تبدیل میکنند ولی دیکامپایلر ها برعکس.
به طور کلی کامپایلر ها قادر به بازگرداندن یک فایل اجرایی به سورس کد آن به شکل دقیق و بی نقص نیستند و در اکثر مواقع کدهایی مبهم(obfuscated code) میسازند. با این حال دیکامپایلرها هنوز ابزاری بسیار مهم در مهندسی معکوس به شمار میروند.
معرفی
دیکامپایلر(مترجموارون) معمولاً کد اجرایی را به کد منبع در زبان برنامهنویسی سطح بالا ترجمه میکند به طوری که اگر کد جدید دوباره ترجمه گشت در اجرا مانند کد اجرایی اصلی عمل کند.
از دیکامپایلر برای مباحث امنیت کامپیوتر ، تصحیح خطاها و... استفاده می شود. زبان های کامپایلری مفسری که از کد میانی و ماشین مجازی استفاده می کنند معمولاً به صورت کامل قابل برگشت هستند ، یعنی حتی شماره ی خطوط و نام متغییرهای کد اصلی هم قابل برگشت است.از این دست زبانها می توان به جاوا و .net اشاره کرد. به عنوان مثال دیکامپایلر jd-gui برای جاوا وجود دارد که کد را به صورت کامل برمی گرداند. برای جلوگیری از دیکامپایل برنامه ها ابزاری با عنوان مبهم کننده ی کد( obfuscated code) وجود دارد که عملیات مهندسی معکوس را مشکل تر می کند.
طراحی
دیکامپایلرها در پروسه تبدیل یک فایل اجرایی به سورس کد فاز های مختلفی را طی میکنند که در ادامه فازهای مختلف آن را بررسی میکنیم.
بارکننده(loader)
اولین فاز در دیکامپایل عمل بارگزاری و تجزیه کد ورودی که به زبان ماشین است را انجام میدهد. این مرحله باید قسمت های مختلفی را مشخص کند. از جمله معماری و همچنین کد معادل تابع main در زبان c که در واقع شروع کدیست که توسط برنامه نویس ها نوشته شده است.
جداسازی قطعات(disassembly)
فاز منطقی بعدی در عملیات دیکامپایل کردن عبارت است از جداسازی قطعات(disassembling) کد ماشین و تبدیل آن به یک کد machine independent intermediate representation (IR) به طور مثال دستورالعمل ماشین پنتیوم را در قسمت زیر مشاهده میکنید.
mov eax, [ebx+0x04]
به کد زیر ترجمه خواهد شد.
eax := m[ebx+4];
بعد از این مراحل به ترتیب idioms, program analyses, dataflow analyses, type analyses, structuring و در نهایت code generation انجام میشود که توضیحات کامل تر آن ها را به همراه مثال میتوانید در لینک مربوط به مقاله اصلی مشاهده نمایید.
ابزارها
دیکامپایلر ها معمولا یک فرمت به خصوص از باینری ها را مورد هدف قرار میدهند. برخی مانند Intel x86, ARM, MIPS از دستورالعمل های معمولی استفاده میکنند و برخی دیگر نیز بایت کدهایی مانند(Dalvik, Java class files, WebAssembly, Ethereum) مخصوص به ماشین های مجازی میباشد.
اخیرا برنامه گیدرا(ghidra) نیز توسط سازمان اطلاعات آمریکا به شکل open-source در آمده و یک ابزار بسیار قدرتمند و پیشرفته محسوب میشود.
جستارهای وابسته
- پیوند دهنده
- مفسر (رایانه)