+2 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

آیا راهی وجود دارد که از decompile شدن برنامه های جاوا جلوگیری کرد؟

2 پاسخ

+1 امتیاز
قبل توسط (2.2هزار امتیاز)

حفظ امنيت کدهاي نوشته شده به زبان جاوا

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

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

رفتار متد رمزگذاری

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

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

نحوه پیاده‌سازی

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

برای پنهان ماندن الگوریتم کدبرداری کلاس‌ها نیز می‌توانید از فایل‌های کتابخانه‌ای پویا و استاندارد (برای ویندوز پسوند dll و برای گنولینوکس پسوند so) نوشته‌شده با زبان C استفاده کنید. البته در این حالت پیاده‌سازی الگوریتم رمزگشایی باید در همین کتابخانه‌ها انجام شود و همین‌طور برای حفظ قابلیت اجرا و انتقال روی سایر پلتفرم‌ها نیز باید کتابخانه‌های مورد نیاز و قابل استفاده روی سایر پلتفرم‌ها را هم ایجاد کرده و همراه با دیگر منابع به پروژه بیفزایید تا بتوانید با توجه به نوع سیستم‌عامل، فایل کتابخانه مورد نظر را بارگذاری کرده و توابع مورد نیاز برای رمزگشایی را از داخل این فایل‌ها فراخوانی کنید.

نتیجه‌گیری

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

+1 امتیاز
قبل توسط (778 امتیاز)
به نظر بنده راه 100 درصد وجود ندارد و به نظرم شاید راهی برای جلوگیری از decompile وجود ندارد (البته تا اون جا که می دونم)

خودم از yguard و proguard استفاده کردم با ant و maven هم inegrate می شوند و کد رو به هم می ریزن و تا حدی نا خواناش می کنن اما جلوی decompile شدن آن را نمی گیرند.

سوالات مشابه

+4 امتیاز
1 پاسخ 682 بازدید
0 امتیاز
0 پاسخ 329 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط amin_y64 (50 امتیاز)
+1 امتیاز
1 پاسخ 1.5هزار بازدید
+1 امتیاز
1 پاسخ 5.3هزار بازدید
0 امتیاز
1 پاسخ 1.3هزار بازدید
0 امتیاز
1 پاسخ 534 بازدید
0 امتیاز
1 پاسخ 1.4هزار بازدید
...