نحوه حفاظت از برنامه در برابر کپي غيرمجاز
سلام دوستان عزیز در این سری از آموزش برنامه نویسی اندروید به نحوه حفاظت از برنامه در برابر کپي غيرمجاز می پردازیم هرچقدر شما ایده جالبی داشته باشید و خیلی هم شیک و تمیز برنامه را به اتمام برسانید نیاز دارید که اپلیکیشن خود را کد کنید و مانع از مهندسی معکوس (reverse-engineering) جلوگیری کنید. البته هیچ وقت یک ادم تمامی بخش های امنیتی رو نمی داند و هر چقدر شما در بخش امنیت افرادی هستند که به قول گفتنی اپ شما را کرک کنند بهترین کار ایجاد obfuscation (مبهم کردن) با استفاده از ابزار ProGuard است . شاید بپرسید Proguard چیست ؟
proguard یک کلاس آزاد جاوا است که optimizer (بیهنه ساز کننده) , preverifier (تاییئد کننده) shrinker و obfuscator (مبهم سازی) وجود دارد.proguard یک کلاس بسیار کاربردی است که کلاس های استفاده نشده فیلد ها متود ها و هر چیزی که در برنامه استفاده نشده باشد را تشخیص و حذف می کند. از کار های دیگه که proguard انجام می دهد تغییر نام کلاس ها , متد ها و بهینه سازی bytecode ها برنامه است
اگر بخواهیم Proguard را دقیق تر بررسی کنیم باید سه عبارت زیر را بررسی کنیم.
Shrinker :تشخیص و حذف کلاس ها و فیلد ها متود ها و ویژگی هایی (attributes) که در برنامه از آن استفاده نشده است.
Optimization : آنالیز کردن و بهینه سازی bytcode های متد شما.
Obfuscation : تغییر نام کلاس ها فیلد ها متود ها و به جای اسم های خودشان از اسم های تغییر داده شده استفاده می شود.
نحوه فعال سازی Proguard در اندروید استودیو
وارد فایل Build.Gradle بخش moudle :app وارد شوید در بخش buildTypes باید کد های زیر را قرار دهیم ممکن است این بخش وجود داشته باشد ولی شما باید تغییرات را اعمال کنید.
1 2 3 4 5 6 | buildTypes { debug { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } |
شاید این کار بسیار ساده باشد ولی هم اکنون اگر گد خود را decompile کنید می بینید که فقط اعداد و abc تحویل خواهید گرفت !
این سری از آموزش های برنامه نویسی هم به پایان رسید.
موفق باشید.
با عرض سلام و تشکر نسبت به آموزش مفیدتان
یه سوال داشتم
فرض کنید که یک اپلیکشین نوشته باشیم و فعال سازی درون برنامه ای به آن اضافه کرده باشیم حال پس از اینکه کاربر پرداخت را با موفقیت انجام داد. چه روشی برای فعال سازی اپلیکیشن پیشنهاد می کنید که امن تر باشد. مثلا اطلاعات فعالسازی را کجا ذخیره کنیم تا اپلیکیشن به راحتی کرک نشود.
سلام
استفاده از بخش server side رو بهتون پیشنهاد می کنم تنها چیزی که نمی توان آن را کرک کرد بررسی سمت سرور است یک مثال ساده میزنم بخش پیشرفته آن بر عهده خودتان فکر کنید ما یک دیتابیسی داریم که شامل یک آیدی منحصر به فرد برای هر شخص است هرکس که به طور مثال بخش پرداخت برنامه شما را می خواهد انجام دهد یک token برای خرید دارد حالا شما می تونید توکنی که هر شخص دارد رو بعد از پرداخت به سرور ارسال کنید یعنی تا زمانی که خرید به درستی انجام نشده باشد کاربر نتواند از برنامه استفاده کند اگر بخش پرداخت رو کابر دور زد یعنی یک بخشی از اپ رو کرک کرد باید توی سرور بررسی شود که ایا کاربر به درستی خرید کرده است یا خیر در صورتی که خرید نکرده بود نمی تواند از برنامه استفاده کند.
موفق باشید.
متشکرم از پاسخ های با حوصله شما
ایده سمت سرور شما عالی است و حتما روی آن کار خواهم کرد. نگرانی اصلی من از سمت کلاینت می باشد اولا ما چگونه باید نرم افزار را فعال کنیم مثلا آیا در بانک اطلاعاتی سمت کلاینت فیلدی را true می کنیم تا بفهمیم نرم افزار فعال شده یا مثلا در یک فایل رمزگذاری شده(اگر در این زمینه بیشتر توضیح دهید ممنون میشم نمی دانم پس از پرداخت چگونه باید نرم افزار را فعال کرد) و مهم تر از اینها اگر مراحل فعالسازی آنطوری باشد که در بالا نوشتم یعنی مثلا مقداری را true کند چگونه از این مقدار محافظت کرد تا به سادگی کرک نشود
همانطور که عرض کردم بررسی نباید در گوشی کاربر صورت بگیرد باید بروی سرور یعنی یک فایل php باشد تا این شرط را چک کند.
کاری که باید شما بکنید به این صورت هست
زمانی که هر کاربر اپ را نصب کرد باید در سمت سرور یک token توسط php ایجاد شده و برای برنامه ارسال شود (هر کاربر باید یک token خاص داشته باشند)
دوم token ساخته شده در هر دو طرف باید ذخیره شود .
این token یک state یا حالت دارد در ابتدای کار (باید یک متغیر از نوع boolean در سمت سرور در نظر بگیرد) مقدار آن False است در صورتی که کاربر برنامه را خرید و سمت سرور boolean برابر با true می شود.
و دقت کنید این boolean نباید به صورت ساده باشد باید ابتدا کد شده و سپس دریافت و ارسال شود.
موفق باشید.
با سلام مجدد
جناب آقای جعفری پور شاید سوال قبلی من کمی گنگ باشد که ناشی از آشنایی کم من نسبت به برنامه نویسی اندروید است. آیا signature کردن نوعی قفل است یا فقط مربوط به شناسایی مالک برنامه است. در برنامه نویسی ویندوزی همانطور که می دانید یک روش قفل گذاری تولید کدی بر اساس مشخصات سخت افزاری برای هر سیستم می باشد و … آیا این موارد در برنامه نویسی اندروید نیز موضوعیت دارد.
signature یک نوع کلید نرم افزاری است یعنی توسط یک شخص یک signature ایجاد می شود اگر نام آن را کلید بزاریم هرشخصی برای خود یک کلید دارد این کلید می تواند قفل برنامه را باز کند اگر دقیق بگم زمانی که می خواید اپ خودتان رو برای مارکت ها ارسال کنید قبل از آن برنامه را sign می کنید این کار باعث می شود یک کلید منحصر به فرد براساس مشخصاتی که برنامه نویسی به آن میدهد ایجاد شود علت این کار فراتر از چیزی که تصور می کنید یک اینکه به طور مثال نام شما در آن اپ گنجانده می شود ولی کار اساسی کلیک رمز نگاری است که توسط sign کردن ایجاد می شود یعنی براساس سیستم و فیلد هایی که شما پر می کنید یک کلید برای اپ شما ایجاد می شود که با آن کلیک فقط می شود برنامه را decompile کرد. قفل گذاری خاصی در اندروید وجود دارد به نام proguard برای محافظت از محتوا و کد برنامه می توانید از آن استفاده کنید و در جواب سوال دومتان شاید signature را بتوان نوعی کلید سخت افزاری نام برد.
در نتیجه کار اصلی signature در برنامه متاقبت دادن هر بایت از برنامه با یک الگوریتم خاص است و این الگوریم خاص همان sign کردن یا کلیدی است که شما برای اپ خود ایجاد می کند.
موفق باشید.
سلام ببخشید داخل buildtype من اینجوریه می خواد تغییرش بدم؟
بله باید minifyEnabled false را مثل زیر تغییر بدید.
موفق باشید.
نمی خواد قسمت دیباگش هم تغییر بدم ؟ چون شما تو قسمت دیباگ نوشتین
می توانید تغییر دهید.
ببخشید یک سوال دیگه من از پرداخت درون برنامه ای استفاده می کنم توبازار نوشته
اگر از Proguard برای مبهم کردن کد استفاده میکنید، بایستی خط زیر را به فایل تنظیمات Proguard اضافه کنید:
keep class com.android.vending.billing
فایل تنظیمات progurd کجاست؟
خب باید اضافه کنید دیگه
فکر کنم در قسمت Gradle
و proguard-rules.pro
باید اضافه شود.
یک خط هم اضافه شود
keep class com.android.vending.billing-
سلام هروقت
minifyEnabled true
انجام میدم برنامه اجرا میشه ولی موقعی که می خوام فایل apk بگیرم خطا میده باید چیکار کنم؟
سلام و درود شاید از یکسری کتاب خانه استفاده کرده باشید که نیاز داشته باشند بخشی از کد را برای نگه داشتن کلاس های آن در proguard قرار دهید.
یعنی اگر بخوام از اون کتابخانه ها استفاده کنم نمیشه پنهان سازی کد رو انجام داد؟
چرا میشه
ببخشید چطور؟
باید نام کتاب خانه ها رو بگید تا بهتون بگم چه چیزی به Proguard اضافه کنید.
فکر کنم مشکل از کتابخانه itextpdf باشه چون بیشتر اسم این کتابخونه رو تو logcat نوشته
خط های زیر را به Proguard اضافه کنید.
موفق باشید.
این کدها رو به فایل proguard-android.txt که در sdk قرار داره اضافه کردم ولی مشکل حل نشد بیشتر می نویسه dont find itextpdf…
سلام برای این کتابخونه چه کدی اضافه کنم … فایل کتابخونه به برنامه اضافه شده compile files(‘libs/poi-3.7.jar’)
سلام
من یه فایل jar تو پروژم استفاده کردین چ جوری میتونم به پروگارد بگم و اصلا بیخیال این فایل بشه یعنی نادیده بگیره؟
باسلام
من میخام اینتنت رو ضد ویرایش بشه
هرچی می کنم نم ش
لطفا راهنمایی کنید