لوگوی ارتباط افزار افق
بستن

تکنیک مبهم سازی (obfuscation)

تکنیک های مبهم سازی obfuscation

فهرست مطالب

مبهم سازی به چه معناست؟

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

در برنامه نویسی نیز استفاده از تکنیک‌های مبهم سازی برای پنهان نمودن داده‌های حساس همچون کلیدهای امنیتی جهت جلوگیری از حملات مهندسی معکوس در نرم افزارهای انحصاری معمول است. کدگذاری قسمتی یا تمامی کد برنامه یکی از تکنیک‌های مبهم سازی می‌باشد. روش‌های دیگری همچون: حذف متادیتاهای بالقوه آشکار، جایگزین کردن نام متغییر و کلاس‌ها با کلمات بی‌معنی و اضافه کردن تکه کدهای بدون کاربرد و زائد در سورس کد برنامه.

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

Obfuscation چگونه کار می‌کند؟

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

Obfuscation در خصوص تغییر کارکرد برنامه نمی‌باشد بلکه نمایش و ارائه آنها را گیج کننده می‌کند. در واقع در روند اجرای برنامه و خروجی آن تغییری انجام نمی‌گیرد. در اینجا تکه کدی به زبان جاوا اسکریپت داریم:

				
					var greeting = 'Hello World';
greeting = 10;
var product = greeting * greeting;

				
			

حال می‌توانیم با استفاده از روش‌های مبهم سازی اقدام به پنهان نمودن نام متغییر و محتوای آن کنیم:

				
					var _0x154f = ['98303fgKsLC','9koptJz','1LFqeWV',
              '13XCjYtB','6990QlzuJn','87260lXoUxl',
              '2HvrLBZ','15619aDPIAh','1kfyliT',
              '80232AOCrXj','2jZAgwY','182593oBiMFy',
              '1lNvUId','131791JfrpUY'];
var _0x52df = function (_0x159d61, _0x12b953) {
  _0x159d61 = _0x159d61 - 0x122;
  var _0x154f4b = _0x154f[_0x159d61];
  return _0x154f4b;
};
(function (_0x19e682, _0x2b7215) {
  var _0x5e377c = _0x52df;
  while (!![]) {
    try {
      var _0x2d3a87 =
        -parseInt(_0x5e377c(0x129)) * parseInt(_0x5e377c(0x123)) +
        -parseInt(_0x5e377c(0x125)) * parseInt(_0x5e377c(0x12e)) +
        parseInt(_0x5e377c(0x127)) * -parseInt(_0x5e377c(0x126)) +
        -parseInt(_0x5e377c(0x124)) * -parseInt(_0x5e377c(0x12f)) +
        -parseInt(_0x5e377c(0x128)) * -parseInt(_0x5e377c(0x12b)) +
        parseInt(_0x5e377c(0x12a)) * parseInt(_0x5e377c(0x12d)) +
        parseInt(_0x5e377c(0x12c)) * parseInt(_0x5e377c(0x122));
      if (_0x2d3a87 === _0x2b7215) break;
      else _0x19e682['push'](_0x19e682['shift']());
    } catch (_0x22c179) {
      _0x19e682['push'](_0x19e682['shift']());
    }
  }
})(_0x154f, 0x1918c);
var greeting = 'Hello\x20World';
greeting = 0xa;
var product = greeting * greeting;
				
			

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

تکنیک های مبهم سازی

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

  • تغییر نام: مبهم کننده نام متغییرها و توابع را تغییر می دهند به طوری که نام های جدید شامل کاراکتر های غیر قابل نمایش می‌باشند.
  • پکینگ(packing): آرشیو کردن و فشرده سازی کل برنامه به طوری که کد برای انسان غیر قابل درک باشد.
  • کنترل جریان اجرا: کد دیکامپایل شده به طریقی نوشته شده که شبیه به منطق اسپاگتی به نظر برسد که فاقد ساختارمند خاصی می‌باشد  و خط فکری مبهمی دارد. در نتیجه با نگاه کردن به کدهای نوشته شده به سختی می‌توان آنرا درک کرد و هدف از اجرای آن را متوجه شد.
  • تبدیل الگوی دستورالعمل‌ها: در این تکنیک دستورات تولید شده توسط کامپایلر با دستورات پیچیده‌تر و نا معمول‌تری که دقیقا همان کار را انجام می‌دهند جایگزین می‌گردند.
  • افزودن کدهای زائد و بی معنی: کدهایی به سورس برنامه اضافه می شود و تاثیری در روند اجرا و منطق آن نمی گذارند و هدف آنها صرفا سخت کردن فرآیند مهندسی معکوس و تحلیل آن می‌باشد.
  • حذف متادیتاها: متادیتا به تحلیلگران اطلاعات اضافی در خصوص بدافزار می‌دهند که به خواندن و دیباگ کردن آن کمک می‌کند. حذف کردن آنها خواندن و درک بدافزار را سختتر می‌کند.
  • ایجاد وضعیت‌های نامشخص در روند اجرای نرم افزار: وضعیت‌های منطقی که صرفا شامل مقادیر درست یا نادرست می‌باشند قابل پیش بینی است. با ایجاد انشعابات شرطی به طوری که خروجی توسط تحلیل‌های آماری قابل تشخیص نباشد و وضعیت‌هایی که هیچگاه اجرا نمی‌شود تحلیلگر را درگیر یک پازل می‌کند که سعی دارد آن را درک کند در حالی که هیچ تاثیری در روند اجرای کد ندارد.
  • ضد-دیباگ: مهندسین نرم‌افزار و هکرهای کارکشته از ابزارهای دیباگ برای تحلیل بدافزار استفاده می‌کنند، با این ابزار امکان شناسایی کدهای مخرب درون سورس کد میسر می‌شود. هکرها از ابزار ضد-دیباگ برای شناسایی محیط آنالیز و ابزارهای دبیاگ استفاده می‌کنند.
  • ضد-دستکاری: با استفاده از این ابزارها امکان تشخیص دستکاری در کد میسر می‌شود که در نتیجه می تواند مانع از اجرای بدافزار دستکاری شده گردد.
  • کدگذاری رشته های متنی: در این تکنیک رشته های متنی درون فایل های اجرایی کدگذاری می‌شوند و تنها زمانی که به آنها نیاز است رمزگشایی گردیده و مورد استفاده قرار می‌گیرد. یکی از روش‌های تحلیل بدافزار، استخراج تمامی رشته‌های متنی درون آن است که با این تکنیک مبهم سازی، این روش تشخیص بدافزار کارایی نخواهد داشت.
  • جا به جایی تکه کدها: تغییر ترتیب تکه کدها، انشعابات و روتین های برنامه به طوری که تاثیری در روند اجرای آن نمی‌گذارد.

مزایا و معایب

رازداری: Obfuscation اطلاعات با ارزشی که داخل کد می‌باشد را، پنهان می‌سازد. این ویژگی برای تولید کنندگان نرم افزار که سعی در پنهان نگاه داشتن قسمت‌هایی از برنامه خود در برابر رقبا و هکرها دارند بسیار مفید می‌باشد. البته که توسعه دهندگان بدافزار نیز برای پنهان کردن کدهای مخرب خود از مبهم سازی استفاده می‌کنند.

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

امنیت: مبهم سازی یک روش تامین امنیت داخلی است؛ که در بعضی موارد از آن به عنوان محافظت از خود یاد می‌شود. اگر برنامه شما دارای اطلاعات حساسی می‌باشد و محیط اجرا نا‌مطمئن می‌باشد استفاده از Obfuscation بسیار مفید خواهد بود.

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

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

.

0 دیدگاه

دیدگاهتان را بنویسید

Avatar placeholder

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *