قبلاً از اینکه میکروکنترلرهای ARM عمده بازار میکروکنترلرایران را بهدست بگیرند، میکروکنترلرهای AVR برای کار مرسومتر بودند و در صنعت بیشتر از آنها استفاده میشد. این مقدمه را به این جهت گفتم که ابتدا بهصورت مختصر بگویم که محافظت از برنامه در میکروکنترلرهای AVR چگونه میسر بود، سپس این موضوع را با چند روش مختلف در میکروکنترلرهایSTM32توضیح بدهم.
محافظت از برنامه
در نظر بگیرید که برنامهای نوشتید و بنا به دلایلی مثل تجاری بودن محصول یا الگوریتمخاصی که دوست ندارید فاش شود، نمیخواهید که کسی بتواند کد برنامه شمارا از میکروکنترلر بخواند، آیا این امکان وجود دارد؟ بله.
سازندگان میکروکنترلرها راههای متفاوتی با دسترسیهای مختلف برای این کار پیش روی ما گذاشتهاند و ما بسته به نیاز
میتوانیم از این راهها استفاده کنیم.
اگر با میکروکنترلرهای AVR کارکرده باشید میدانید که قبل از برنامهریزی باید فیوز بیتها را تنظیم کنید و با توجه به این تنظیمات میکروکنترلرپروگرام میشود. همچنین با استفاده از همین فیوزبیتها میتوانیم تنظیماتی را انجام بدهیم که دیگر نتوان برنامه را از میکروکنترلر خواند.
در میکروکنترلرهای STM32 هم با استفاده از نرمافزار STM32 ST-LINK Utility و پروگرامر ST_LINK میتوان تنظیماتی را انجام داد که برنامه دیگر قابل خواندن نباشد.
برای این کار ابتدا وارد نرمافزار شوید و پسازاینکهپروگرامر و چیپ موردنظر شناسایی شد، همانند تصویر زیر از منوی Target گزینهی Option Bytes را انتخاب کنید.
پس از کلیک بر روی این گزینه با صفحهی زیر مواجه میشوید:
Read Out Protection
همانطور که در تصویر مشاهده میکنید میتوانید 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 غیرممکن خواهد بود.