Tag Archives: Obfuscation

مبهم سازی Obfuscation

مبهم سازی یا Obfuscation چیست؟

مبهم سازی (Obfuscation) در حوزه توسعه نرم افزار به فرایند ایجاد سورس کدهایی گفته می‌شود که درک آن‌ها برای انسان دشوار است. معمولا از روش‌های مبهم سازی برای پنهان کردن هدف و منطق پشت پرده کد یا مقادیر گنجانده شده در آن استفاده می‌کنند و به این ترتیب احتمال مداخله و مهندسی معکوس را کاهش داده یا آن را به یک معما و سرگرمی برای افرادی تبدیل می‌کنند که قصد خواندن آن را دارند.

مبهم سازی ممکن است به صورت دستی یا با کمک ابزارهای مخصوصی موسوم به مبهم ساز (Obfuscator) انجام شود. این ابزارها بسته به زبان های مورد پشتیبانی قادر هستند روی فایل کامپایل شده یا سورس کد با روش های مختلف به ایجاد ابهام بپردازند. فراموش نکنید در هر حال با اِعمال مبهم سازی نباید عملکرد برنامه تغییر پیدا کند. علاوه بر این، تکنیک ها و ابزارهایی نیز وجود دارد که تلاش می‌کنند معکوس عمل مبهم سازی (Deobfuscation) را انجام دهند و از روی فایل اجرایی مبهم شده یا سورس کد مبهم شده به سورس اصلی و قابل درک دست پیدا کنند.

مبهم سازی کد Obfuscation
ایجاد ابهام در سورس کد، درک آن را دشوارتر می‌کند.

جالب است بدانید مسابقات برنامه نویسی معتبری (نظیر International Obfuscated C Code Contest) وجود دارد که در آن‌ها به بهترین کدهای مبهم شده و خلاقانه‌ترین روش‌ها جوایزی داده می‌شود.

در نظر داشته باشید حتی اگر سورس برنامه را منتشر نمی‌کنید در بسیاری از موارد (نظیر برنامه های نوشته شده به زبان های دات نت و اپلیکیشن های اندروید) به راحتی می‌توان با کمک دیکامپایلرها به سورس کد برنامه دست پیدا کرد. از همین رو پیش از انتشار یک نرم افزار اختصاصی، توصیه می‌شود از ابزارهای محافظت از کد استفاده کنید.

تکنیک ها و اهداف مبهم سازی

در مبهم سازی معمولا از عباراتی استفاده می‌شود که به افزایش پیچیدگی سورس کد می‌انجامد. نام گذاری متغیرها و توابع به صورت گمراه کننده یا بی‌معنا، استفاده از کامنت های فریب دهنده یا نگارش بخشی از کد به شکلی که به نظر یک کامنت بیاید، کدگذاری رشته ها، حذف فراداده های راهنمایی کننده، حذف یا افزودن فاصله، ایجاد ابهام در Control Flow، اضافه کردن کدهای بی‌ربط و نوشتن کد با فرم و شکلی جالب از جمله روش‌هایی است که برای این منظور به کار می‌رود.

در تصویر زیر مثالی از انجام یک مبهم سازی ساده به صورت خودکار را مشاهده می‌کنید که در آن صرفا با تغییر نام تابع و برخی از متغیرها همراه با رمزنگاری رشته، درک عملکرد کد دشوارتر شده است.

مبهم سازی Obfuscation
نمونه‌ای از یک قطعه کد ساده قبل و پس از انجام مبهم سازی توسط نرم افزار Dotfuscator

افزون بر جنبه های سرگرمی، چالش های ذهنی، محافظت در برابر مهندسی معکوس (تبدیل فایل کامپایل شده به سورس کد) و جلوگیری از ایجاد تغییرات در سورس کد به منظور استفاده در پروژه‌های نرم افزاری دیگر، مبهم سازی سورس کد در حوزه امنیت نیز مزایایی به همراه دارد. پنهان سازی بخش‌های مهم امنیتی و دشوارسازی کشف آسیب پذیری ها یا راه‌های نفوذ از جمله این مزایا به شمار می‌روند.

از سوی دیگر، مخفی کردن کدهای مخرب در سورس کد یکی از کاربردهای منفی و مهم Obfuscation به شمار می‌رود چرا که در این صورت، شناسایی و درک هدف آن‌ها به مراتب دشوارتر از حالت معمولی خواهد بود. همین موضوع می‌تواند به یکی از معایب کدهای مبهم شده به خصوص در مورد زبان های تفسیری تبدیل شود. برای مثال برخی از نرم افزارهای امنیتی در صورت شناسایی کدهای مبهم شده جاوا اسکریپت در صفحات وب به کاربر هشدار می‌دهند و به این ترتیب اعتبار سایت حاوی این کدها در میان کاربران مخدوش می‌شود.

در سایر حوزه ها

مبهم سازی صرفا به حوزه برنامه نویسی محدود نمی‌شود. به عنوان مثال در مورد ترافیک شبکه، این اصطلاح به روش‌هایی اشاره می‌کند که سعی دارند ترافیک واقعی شما را از دید دیگران پنهان کنند. چنین تکنیک‌هایی به خصوص هنگام اتصال به شبکه هایی کاربرد دارد که دسترسی به آن‌ها از نظر نهادها و ارائه کنندگان خدمات شبکه مجاز نیست یا احتمال مسدودسازی آن‌ها وجود دارد.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

کمینه سازی Minification

کمینه سازی یا Minification چیست؟

کمینه سازی سورس کد یا به اختصار کمینه سازی (Minification) اصطلاحی در حوزه برنامه نویسی است و به فرایندی گفته می‌شود که طی آن تمامی اجزا و کاراکترهای غیرضروری از سورس کد حذف می‌شود. کمینه سازی علاوه بر اینکه در نتیجه اجرای سورس کد اختلال یا تغییری به وجود نمی‌آورد، حجم فایل مربوطه را نیز کاهش می‌دهد. گاهی اوقات از واژه Minimization نیز به عنوان معادلی برای این اصطلاح استفاده می‌شود.

کاراکترهای غیر ضروری (شامل کاراکتر فاصله و خط جدید) و همچنین المان هایی نظیر کامنت ها (که برای توصیف عملکرد قسمت‌های مختلف کد استفاده می‌شوند) در حین انجام فرایند Minification از سورس کد حذف می‌شوند. از آنجایی که این اجزا و کاراکترها غالبا برای خواناتر کردن سورس کد به کار می‌روند حذف آن‌ ها تاثیری روی نتیجه اجرای کد نخواهد داشت.

فرایند کمینه سازی به خصوص در مورد سورس کدهای مرتبط با صفحات وب نظیر فایل های جاوا اسکریپت (JavaScript) به عنوان یک زبان برنامه نویسی تفسیری، شیوه نامه های آبشاری (CSS) و فایل های اچ تی ام ال (HTML) به کار می‌رود. کاهش حجم این منابع باعث می‌شود فایل ها با سرعت بیشتری به دست کلاینت ها (برای مثال مرورگرهای وب) برسد و درنتیجه منجر به کاهش زمان لازم برای لود شدن صفحات وب خواهد شد.

ممکن است کمینه سازی کد تنها چند درصد از حجم یک فایل را کاهش دهد اما همین میزان اندک – به خصوص زمانی که مساله افزایش سرعت بارگیری صفحات وب در میان است – از اهمیت بالایی برخوردار خواهد بود. این افزایش سرعت نه تنها برای کلاینت ها مفید است بلکه میزان مصرف پهنای باند و ازدحام روی سرور را نیز کاهش خواهد داد.

فارغ از روش‌های ساده‌ای نظیر حذف کامنت ها و فاصله ها از سورس کد، ممکن است تکنیک‌های پیشرفته‌تری نیز برای کمینه سازی مورد استفاده قرار گیرد. جایگزینی نام‌های طولانی متغیرها و توابع با نام‌هایی با تعداد کاراکتر کمتر (و حتی تک کاراکتری) در سورس کدهای بسیاری از زبان‌ها (به خصوص JavaScript) و جایگزینی ویژگی‌های مرتبط با یک ویژگی خلاصه شده (Shorthand Property) و حذف قانون‌ها یا ویژگی‌های تکراری در CSS از جمله این موارد هستند.

معکوس این فرایند که به Unminification موسوم است قادر است سورس مینیفای شده را به یک نسخه معمولی و خواناتر تبدیل کند.

ابزارهای Minification

همان طور که انتظار می‌رود انجام فرایند کمینه سازی توسط توسعه دهندگان به صورت دستی نیز امکان‌پذیر است. با اینحال معمولا به دلیل حجم بالای سورس کدها و دشواری انجام این کار توصیه می‌شود از ابزارهای مخصوصی که قادر به انجام خودکار کمینه سازی هستند استفاده شود. به کارگیری این ابزارها علاوه بر سرعت بالاتر مانع از خرابکاری‌هایی می‌شود که ممکن است در اثر مینیفای کردن دستی سورس کدها حاصل شود.

برای برخی از زبان ها ابزارهای نرم افزاری متعددی در دسترس توسعه دهندگان قرار گرفته است که با روش‌های ساده تا پیشرفته به مینیفای کردن سورس کد می‌پردازند. از جمله مشهورترین این ابزارها می‌توان به HTMLMinifier برای اچ تی ام ال، CSSO برای سی اس اس و Google Closure Compiler و UglifyJS برای جاوا اسکریپت اشاره کرد.

هرچند بسیاری از کمینه سازها بخش عمده‌ای از فرایند Minification را به خوبی انجام می‌دهند اما ممکن است تکمیل دستی این فرایند توسط توسعه دهندگان خبره و حتی دقت در به کارگیری مناسب از کدهای با قابلیت استفاده مجدد در هنگام کدنویسی به بهبود قابل توجه خروجی بیانجامد.

کمینه سازی و فشرده سازی

با وجود اینکه کمینه سازی و فشرده سازی (Compression) داده ها هر دو می‌توانند باعث کاهش حجم فایل سورس کد شوند اما نباید آن‌ها را یکسان دانست. در واقع سورس کد کمینه شده می‌تواند بدون نیاز به انجام مرحله‌ای اضافه بلافاصله تفسیر و اجرا شود؛ این در حالیست که سورس کد فشرده شده پیش از اجرا شدن لازم است از حالت فشرده خارج شود. در عین حال مفسر می‌تواند با نسخه اصلی یا نسخه کمینه سازی شده کار کند بدون اینکه تغییری در مفسر ایجاد شود.

جالب است بدانید بسیاری از وبسایت‌ها از هر دو روش کمینه سازی و فشرده سازی فایل ها برای کاهش حجم داده هایی که باید منتقل شود استفاده می‌کنند.

مثال هایی از کمینه سازی

در مثال زیر می‌توانید نمونه‌ای از یک قانون CSS را قبل و پس از انجام Minification مشاهده کنید. همانطور که می‌بینید در این قانون علاوه بر اینکه کامنت، سمی کلن اختیاری انتهایی، کاراکترهای اضافی فاصله و خط جدید حذف شده‌اند، ویژگی خلاصه شده border نیز جایگزین سه ویژگی مجزای border-width و border-style و border-color شده است.

کمینه سازی Minification
نمونه‌ای از انجام Minification روی یک قانون CSS

در مثال زیر نیز یک قطعه کد جاوا اسکریپت و نسخه حاصل از اعمال فرایند Minification توسط Google Closure Compiler را مشاهده می‌کنید:

کمینه سازی Minification
نمونه‌ای از انجام Minification روی یک قطعه کد جاوا اسکریپت

مزایا و معایب Minification

همانطور که پیشتر به آن اشاره شد Minification قادر است با کاهش حجم سورس کد به ویژه در مورد منابع وب به لود شدن سریعتر صفحات وب و کاهش پهنای باند مورد نیاز برای انتقال داده ها منجر شود.

با اینحال کدهای کمینه شده معمولا به اندازه نسخه اصلی خوانا نیستند و به علاوه فاقد مستنداتی هستند که در سورس کدهای معمولی دیده می‌شود. بنابراین نسخه‌هایی که روی آن‌ها فرایند Minification انجام شده است برای مطالعه و بررسی یا ویرایش و تغییر مناسب نیستند. به همین دلیل برخی از توسعه دهندگان، نسخه اصلی سورس کد را نیز به صورت مجزا یا همراه با پکیج اصلی منتشر می‌کنند تا خوانایی و امکان تغییر آسان آن در آینده میسر شود.

برخی از متخصصین معتقدند کمینه سازی را می‌توان روشی برای مبهم سازی (Obfuscation) سورس کد به شمار آورد؛ با این وجود مشابه با ابزارهایی که برای انجام خودکار Minification به کار می‌روند، ابزارهای ویژه‌ای نیز برای Unminification طراحی و منتشر شده است.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا