مبهم کردن چیست؟ (What is Obfuscation)
مطابق فرهنگ لغت obfuscation بیانگر مبهم ساختن، نامشخص و نامفهومسازی چیزی میباشد. در نرم افزار مبهمسازی کد، فرآیند اصلاح و تغییر سورس کد اپلیکیشن است تا افراد غیر مجاز مانند هکرها امکان سوءاستفاده از سورس کد اپلیکیشن را نداشته باشند. در واقع میتوان گفت مبهمسازی، نوعی مکانیزم دفاعی برای امنیت اپلیکیشن در مقابل مهندسی معکوس اپلیکیشن است.
تمامی کدها را میتوان با تلاش و وقت کافی معکوس کرد. با این حال اکثر پلتفرمها از جمله اندروید، iOS، جاوا و .NET هرکدام decompilerهای مخصوص به خود را دارند و میتوان بدون صرف وقت و تلاش زیاد، از آنها برای مهندسی معکوس، برای به دست آوردن سورس کد از فایل اجرایی اپلیکیشنها و کتابخانهها استفاده کرد.
در این مقاله بر روی تکنیکهای مبهمسازی و روشهایی که کمک میکند تا کد شما در اپلیکیشنهای اندروید نامفهوم شود و امنیت اپلیکیشن برقرار شود، تمرکز میکنیم.
اهمیت مبهمسازی
هر فردی که دانش برنامهنویسی داشته باشد، به راحتی میتواند تصویر کلی و ایده کد شما را هنگامی که اجراکننده شما (به عنوان مثال apk در اندروید) دیکامپایل (decompile) شد، به دست آورد. قطعا این گزینه یک خطر برای امنیت اپلیکیشن ها محسوب می شود.
با این حال از طریق فرآیند مبهمسازی میتوانید کد خود را امنتر کنید تا درک آن برای افراد غیرمجاز به خصوص هکرها سختتر شود. برای محافظت از اسرار تجاری، فرآیندها، دسترسی غیرمجاز، کشف آسیب پذیری و دور زدن لایسنس یا سایر کنترلها با استفاده از مبهمسازی انجام میشود.
مبهمسازی همانند رمزنگاری نیست. هدف اصلی رمزنگاری تبدیل دادهها و اطلاعات، به داده غیر قابل تشخیص برای افراد غیرمجاز، برای مخفی نگه داشتن آنها از طرفهای خارجی است. اما هدف اصلی مبهمسازی، مشکل ساختن کد برای فهمیدن و درک آن میباشد. کد رمزنگاری شده بایستی قبل از اجرا رمزگشایی شود، اما کدهای مبهمسازی شده نیازی به تغییر برای اجرا ندارند.
تکنیکهای مبهمسازی (Obfuscation) برای امنیت اپلیکیشن
تعدادی تکنیک در مبهمسازی کدهای برنامه نویسی قابل اجراست که در زیر به آنها میپردازیم.
- مبهمسازی با روش تغییر اسم
تبدیل و دگرگونی توسط خیلی از مبهمکنندهها در اندروید، جاوا و iOS استفاده میشود. این کار توسط تغییر متغیرها و اسم توابع انجام میشود. از رشتهها، حروف، اعداد، حروف غیرقابل چاپ و کاراکترهای نامرئی برای این فرآیند استفاده میشود.
- رمزنگاری رشتهها
تمامی رشتهها در مدیریت اجراکنندهها قابل کشف و خواندن هستند. حتی اگر متد و متغیرها تغییرنام داده باشند، از طریق جستجوی منابع رشته در داخل فایلهای باینری، میتوان از رشتهها برای هدایت در بخشهای حیاتی کد استفاده کرد. به عنوان مثال، پیامهایی که به کاربر نمایش داده میشوند (پیامهای خطا) با حمله میتوانند تاثیر قابل توجهی بر روی کاربر داشته باشد. بنابراین رمزنگاری رشته میتواند برای مخفی کردن رشتهها در فایل اجرایی مورد استفاده قرار بگیرد. به عنوان نمونه الگوریتم رمزنگاری Caesor برای انجام مبهمسازی تحت اللفظی رشته به عنوان یک روش مبهمسازی ساده استفاده میشود.
- مبهمسازی در روند کنترل
این روش باعث میشود کد decompile شده از طریق منطق، درهم ریختهتر شود که درک آن را برای هکرها بسیار دشوار میکند. به عبارت دیگر مبهمسازی در روند کنترل، ساخت و ساز را به صورت شرطی، شاخهای و تکرار شونده ترکیب میکند که قابل اجراست. این تکنیکها ممکن است برای عملکرد زمان اجرای یک روش استفاده شوند.
- تبدیل الگوی دستورالعمل
از الگوهای دستورالعمل میتوان برای تبدیل دستورالعملهای متداول ایجاد شده توسط کامپایلر به دستورالعملهای دیگر که کمتر آشکار هستند، استفاده کرد. این موارد نوعی دستورالعملهای سطح بالا زبان ماشین هستند که ممکن است به فرمت زبانهای سطح بالا مثل C# و یا جاوا نباشند.
- درج کد ساختگی
درج کردن کدهای ساختگی داخل اجراکنندهها که هیچ تاثیری در منطق محوریت برنامه ندارند باعث دشواری در تجزیه و تحلیل در کدهای decompile می شود. درنتیجه مهندسی معکوس آنها را سختتر و امنیت اپلیکیشن را بیشتر می کند.
- حذف کدهای استفاده نشده و متادیتاها (Metadata)
حذف اطلاعات مربوط به دیباگ، شامل لاگها، metadata های غیرضروری و کدهای برنامههایی که کوچکتر شدهاند باعث کم شدن اطلاعاتی میشود که در معرض حمله کنندهها قرار میگیرد. این رویکردها ممکن است در بهبود عملکرد اپلیکیشن، تاثیر بهسزایی داشته باشند.
- اتصال و ادغام باینری (Binary)
در این تکنیک که چندین اجراکننده ورودی و کتابخانه را در یک یا چندین باینری به صورت خروجی ترکیب میکند، برای کوچک کردن برنامه میتوان از متصلسازی استفاده کرد. این کار به ساده کردن سناریوهای پیادهسازی کمک میکند و ممکن است اطلاعات در دسترس را برای هکرها کاهش دهد.
- درج کردن اطلاعات مبهم
در این روش با اضافه کردن شاخهها به صورت شرطی که همیشه نتیجه معلوم را ارزیابی میکنند و از طریق تجزیه و تحلیل ایستا تعیین نمیشوند، میتوان مبهمسازی کرد. این راهی است برای معرفی کردن کد نادرست که در حقیقت هرگز اجرا نخواهد شد اما در گیج کردن خروجی decompile شده برای حمله کنندهها بسیار کمک خواهد کرد.قطعا این یکی از بهترین راه ها برای بالابردن امنیت اپلیکیشن های اندرویدی است.
- ضد دستکاری
یک مبهم کننده میتواند نوعی self-protection را برای تایید اینکه برنامه ما به هیچ وجه دستکاری نشده است، به کد اضافه کند. که در صورتی که دستکاری شدن شناخته شد، میتواند برنامه را ببندد، عملکرد را محدود کند، از کرشهای تصادفی استفاده کند یا هر عملکرد سفارشیای انجام دهد. همچنین ممکن است به یک سرویس، پیامی ارسال کند تا جزییات مربوط به اطلاعات دستکاری شده را برای صاحبان اپلیکیشن ارسال کند تا آنها به موقع، اقدامات لازم را انجام دهند.
- ضد اشکال زدایی
هنگامی که یک هکر در تلاش است تا اطلاعات برنامه شما را به سرقت ببرد، جعل کند یا رفتاری از زیرساخت یک بخش مهم را تغییر دهد، تقریبا با مهندسی معکوس و وارد شدن به برنامه شما از طریق یک اشکال زدا، این کار را شروع میکند. یک مبهمکننده میتواند با تزریق کد، یک لایه به بخش self-protection برنامه شما اضافه کند که این امکان را به شما میدهد که بررسی کنید که آیا اپلیکیشن شما با یک اشکال زدا درحال اجرا هست یا خیر. اگر اشکال زدا استفاده شود، میتواند اطلاعات حساس را (برای محافظت از سرقت) خراب کند و یا هر عملکرد سفارشی دیگری انجام دهد. همچنین ممکن است به یک سرویس، پیامی ارسال کند تا جزییات مربوط به اطلاعات دستکاری شده را برای صاحبان اپلیکیشن ارسال کند.
جوانب مثبت و منفی مبهم کردن
- امنیت اپلیکیشن (مثبت)
- قابلیت نگه داری (منفی)
- کد بهینه شده (مثبت)
- رخ دادن باگ (منفی)
- ردیابی کپیهای غیرقانونی (مثبت)
ابزارهای مبهمسازی برای افزایش امنیت اپلیکیشن
در اینجا سعی میکنیم شما را با ابزارهایی آشنا کنیم که برای مبهمسازی اپلیکیشن به شما کمک میکنند.
برای پلتفرم اندروید ابزارهایی مانند ProGuard و DexGuard وجود دارند که میتوانند در این مسیر به شما کمک کنند.
ProGaurd یک ابزار رایگان است که به صورت پیشفرض در اندروید استودیو وجود دارد ولی DexGuard یک نسخه تجاری از Proguard میباشد که در سایت https://www.guardsquare.com قابل دسترس است. هنگامی که از Proguard استفاده میشود، متغیرها تغییرنام داده میشوند ولی ساختار کد هنوز قابل مشاهده است. این درحالی است که DexGuard نه تنها متغیرها را تغییر نام میدهد، بلکه کنترل و مبهم کردن بسیار بیشتری انجام میدهد.
توسعه دهندگان .NET نیز میتوانند از نسخه تجاری ArmDot استفاده کنند. ArmDot از روشهای مختلفی برای مبهم کردن استفاده میکند: مبهمسازی اسمها، مبهمسازی در روند کنترل و مجازیسازی. روش مجازیسازی به نحوی است که کد اصلی را به دستورالعملهای برخی از ماشین مجازی یکتا تبدیل میکند که این کار توسط یک ماشین مجازی اجرا میشود بنابراین کد اصلی قابل اصلاح و یا بازیابی نمیباشد.
برخی از ابزارهای مبهمسازی به شرح زیر است:
- .NET : Dotfuscator، ILProtector، ArmDot
- جاوااسکریپت: Javascript Obfuscator، Jscrambler
- اندروید: Proguard، DexGuard
نحوه مبهمسازی کد در اندروید
ابتدا باید در فایل Gradle قسمت app مقدار minifyEnabled را به حالت true دربیاوریم:
اگر شما مایل به اضافه نمودن قوانین مخصوص ProGuard هستید، کد شما باید به حالت زیر تغییر پیدا کند:
برای جزییات بیشتر در مورد نحوه استفاده از ProGuard، و مبهمسازی بیشتر در اندروید میتوانید به این لینک یا این لینک نیز مراجعه کنید.
ادتریس به عنوان پلتفرم شخص ثالث، خود را در برابر دادههای کاربران خود و امنیت اپلیکیشن این دادهها، مسئول میداند. تمام تلاش ادتریس این است که صاحبان اپلیکیشنی که از ادتریس استفاده میکنند هیچ دغدغهای بابت امنیت داده خود نداشته باشند. در همین راستا در کلیه مراحل مبهمسازی، تیم فنی ادتریس میتواند به شما کمک کند تا امنیت اپلیکیشن خود را بالا ببرید. همچنین ادتریس با استفاده از لایههای رمزنگاری شده و امنیتی مختلف در زمان ارسال دادههای اپلیکیشن شما به سرورهای ادتریس، به افراد غیرمجازی که به اپلیکیشن شما نفوذ میکنند اجازه هیچگونه سوءاستفادهای از دادهها را نمیدهد و حتی در صورت نفوذ هکرها نیز، ادتریس تلاش آنها برای دستیابی به دادهها یا ارسال دادههای تقلبی را خنثی میکند. هدف ترکر ادتریس این است که شما بدون نگرانی از سایر مسائل امنیتی، تنها به فکر بهبود مستمر اپلیکیشن خود باشید و امیدواریم در این راه بتوانیم کمکی هر چند کوچک به شما کرده باشیم.
منبع: https://levelup.gitconnected.com/android-obfuscation-e608f79f0d09