قبلاً از اینکه میکروکنترلرهای ARM عمده بازار میکروکنترلر ایران را بهدست بگیرند، میکروکنترلرهای AVR برای کار مرسومتر بودند و در صنعت بیشتر از آنها استفاده میشد. این مقدمه را به این جهت گفتم که ابتدا بهصورت مختصر بگویم که محافظت از برنامه در میکروکنترلرهای AVR چگونه میسر بود، سپس این موضوع را با چند روش مختلف در میکروکنترلرهای STM32 توضیح بدهم.
محافظت از برنامه
در نظر بگیرید که برنامهای نوشتید و بنا به دلایلی مثل تجاری بودن محصول یا الگوریتم خاصی که دوست ندارید فاش شود، نمیخواهید که کسی بتواند کد برنامه شما را از میکروکنترلر بخواند، آیا این امکان وجود دارد؟ بله.
سازندگان میکروکنترلرها راههای متفاوتی با دسترسیهای مختلف برای این کار پیش روی ما گذاشتهاند و ما بسته به نیاز میتوانیم از این راهها استفاده کنیم.
اگر با میکروکنترلرهای AVR کارکرده باشید میدانید که قبل از برنامهریزی باید فیوز بیتها را تنظیم کنید و با توجه به این تنظیمات میکروکنترلر پروگرام میشود. همچنین با استفاده از همین فیوزبیتها میتوانیم تنظیماتی را انجام بدهیم که دیگر نتوان برنامه را از میکروکنترلر خواند.
در میکروکنترلرهای STM32 هم با استفاده از نرمافزار STM32 ST-LINK Utility و پروگرامر ST_LINK میتوان تنظیماتی را انجام داد که برنامه دیگر قابل خواندن نباشد.
برای این کار ابتدا وارد نرمافزار شوید و پسازاینکه پروگرامر و چیپ موردنظر شناسایی شد، همانند تصویر زیر از منوی Target گزینهی Option Bytes را انتخاب کنید.
پس از کلیک بر روی این گزینه با صفحهی زیر مواجه میشوید:
همانطور که در تصویر مشاهده میکنید میتوانید Read Out Protection را فعال کنید تا دیگر برنامه قابل خواندن نباشد، همچنین میتوانید سکتورهایی را هم غیر قابل نوشتن کنید.
ما Read Out Protection را فعال کردیم تا برنامه قابل خواندن نباشد و 4K از حافظه را نیز غیر قابل نوشتن کردیم. در میکروکنترلری که ما از آن استفاده میکنیم (F103C8T6) حداقل مقدار انتخابی 4K خواهد بود که این مورد در انواع میکروکنترلرها متفاوت است.
حال اگر شما قصد داشته باشید که برنامه را بخوانید یا در سکتورهایی که علامت زدیم بنویسید با خطا مواجه خواهید شد.
شما این پروسه را در کد برنامه هم میتوانید اعمال کنید که در این صورت از انعطاف بیشتری نیز برخوردار میشوید. حالتهای مختلفی برای محافظت از کد شما در میکروکنترلرهای STM32 در نظر گرفته شده است که در ادامه به آنها اشاره میکنیم و سپس هر کدام از آنها را مفصلاً توضیح میدهیم.
- محافظت در برابر عملیات خواندن (RDP)
- محافظت در برابر عملیات نوشتن یا پاک کردن ناخواسته
- محافظت در برابر عملیات خواندن و نوشتن (PCROP)
RDP
این نوع محافظتها باعث میشود که کپی کردن فریمور از طریق مهندسی معکوس با استفاده از ابزارهای دیباگ یا راههای دیگر غیر ممکن باشد و حالتهای زیر برای آن وجود دارد:
no readouy protection
به طور پیشفرض این سطح فعال میباشد و حافظه FLASH کاملا باز است و تمامی عملیات قابل انجام بر روی حافظه در دسترس است. در این حالت هیچ نوع حفاظتی وجود ندارد و این حالت برای توسعه و دیباگ در نظر گرفته شده است.
memory readout protection
در این حالت هیچ دسترسی اعم از خواندن، پاک کردن و برنامهریزی یا نوشتن به حافظه FLASH یا backup SRAM از طریق امکانات دیباگ مانند Serial Wire یا JTAG وجود ندارد. این امکان حتی هنگام بوت شدن از طریق SRAM یا بوتلودر سیستم نیز وجود ندارد. اما هنگام بوت شدن از حافظه FLASH میتوانید به این حافظه دسترسی پیدا کنید و backup SRAM از کد کاربر مجاز است. هرگونه درخواست دسترسی به حافظهی FLASH محافظت شده یک خطای بأس را به دنبال خواهد داشت. همچنین برای غیرفعال کردن این سطح با دوباره برنامهریزی کردن بایت RDP میتوانید به سطح 0 بازگردید.
chip readout protection
هنگامی که سطح 2 فعال است، تمامی محافظتهای ارائه شده در سطح 1 فعال میباشد و چیپ کاملاً محافظت شده است. در این سطح بایت RDP و همهی گزینههای مرتبط با این بسته خواهند شد و قابل اصلاح نخواهند بود. همچنین برگشت از این سطح به سطح 1 یا 0 غیرممکن خواهد بود.
سلام با j link امکان قفل کردن وجود دارد ؟ اگر دارد چطور ؟
با تشکر
سلام بسیار ممنون مقاله مفیدی بود
ایا مقاله قسمت دوم داره ؟
“شما این پروسه را در کد برنامه هم میتوانید اعمال کنید که در این صورت از انعطاف بیشتری نیز برخوردار میشوید”
متوجه جمله بالا نشدم ایا بااستفاده از مکانیزمی uid منظورتونه؟
سلام دوست عزیز
نه متاسفانه نویسنده ادامه نداده
اون پاراگراف داره میگه شما میتونید توی برنامه میکروکنترلر موارد امنیتی رو نیز اوکی کنید. صرفا UID نیست
ممنون بابت مطلب
فک کنم Read protection روب رای همه گزینه ها نوشتید
باید تصحیح بشه
سلام
خیلی ممنون از توضیحات خوبت
سه عنوان محافظت در متن اشتباه شده
منظورتون رو متوجه نشدم میشه بیشتر توضیح بدین کجا اشتباهه؟