دیکامپایلر
دیکامپایلر (به انگلیسی: 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 در آمده و یک ابزار بسیار قدرتمند و پیشرفته محسوب میشود.