در بسیاری از موارد ما وقت و هزینه و حتی علم خودمون رو صرف برنامه نویسی یک میکروکنترلر میکنیم و طبیعتا دوست نداریم که برنامه نوشته شده به سادگی قابلیت کپی شدن و استفاده توسط بقیه افراد رو داشته باشه. در اکثر موارد مهندسی معکوس کردن سخت افزار بردهای الکترونیکی امکان پذیره اما برد مهندسی معکوس شده نیاز به قطعه آخر پازل یعنی برنامه یا کد هگزی داره که تکمیل و قابل استفاده باشه.
در این موارد خاص اولین قدمی که هر کسی برمیداره قفل کردن میکروکنترلر از طریق فیوزبیت های اون هست و راه خوندن رو به کاربر عادی میبنده. چه بسا در مواردی، حتی راه نوشتن روی میکروکنترلر هم بسته بشه! این که فیوزبیت های میکروکنترلر STM32 چه جوری باید تغییر کنه و حالت های قفل این میکروها چی هست تو چهارچوب این مقاله نمیگنجه و توضیح اختصاصی خودش رو می طلبه! بنابراین ما تو این جلسه صرفا بحث شناسه یکتا رو با هم پیش میبریم.
خب فرض کنیم ما میکروکنترلر خودمون رو قفل کردیم، آیا میشه مطمئن بود که برنامه دیگه قرار نیست کپی بشه؟ طبیعتا خیر!
راه دور زدن و برداشتن برنامه از روی میکرو هنوزم بازه. چجوری؟ کارخونه های زیادی مثلا در چین وجود دارند که میتونن فیوز بیت های میکرو رو بسوزونن و کد هگز رو با دریافت مبلغی در اختیار ما بذارن! اینجاست که مرزهای اخلاقی زیر پا گذاشته میشه و زحمت ما ممکنه به باد بره!!
خب چیکار باید کرد؟ هر میکروکنترلر STM32 یک شناسه یکتای 96 بیتی داره که منحصرا به همون میکرو اختصاص داره! حالا اگه ما این شناسه یکتا رو در ابتدای برنامه بخونیم و شرط هر بار اجرا شدن برنامه رو روی این شناسه یکتا بذاریم، حتی با فرض این که کد هگز نوشته شده میکرو به نحوی استخراج بشه، برنامه برای میکروکنترلرهای دیگه بلا استفاده میشه!
البته که ممکنه بازم راهی برای دور زدن این قضیه در آینده پیدا بشه اما با این روش با اطمینان بسیار زیادی برنامه شما دیگه قابل استفاده روی میکروکنترلرهای دیگه نخواهد بود!!
خب چه اتفاق جالبی! حالا دقیقا چجوری این شناسه رو ما استخراج کنیم؟
خود شرکت ST، توی کتابخونه HAL انجام قضیه رو برای ما خیلی ساده کرده. ما این مسئله رو با میکروکنترلر STM32F030R8 خودمون بررسی میکنیم. نیازی به انجام تنظیمات خاصی نیست و هیچ واحد جانبی ای رو هم نیاز نداریم. تنها کاری که ما در این پروژه انجام میدیم، کلاک میکرو رو روی حداکثر اون یعنی 48 مگاهرتز تنظیم میکنیم و حالت دیباگ رو هم فعال میکنیم. بنابراین ما توضیحات مربوط به این قسمت رو به جهت طولانی نشدن مقاله توضیح نمیدیم.
مطابق با برنامه نوشته شده در زیر، صرفا کافی هست از سه تابع ()HAL_GetUIDw1()، HAL_GetUIDw0 و ()HAL_GetUIDw2 استفاده کنیم تا آی دی 96 بیتی میکرو رو به دست بیاریم. با استخراج UID به راحتی ما قادر خواهیم بود تموم تمهیدات لازم رو برای اهداف امنیتی خودمون درنظر بگیریم!
سورس کد
نتیجه اجرای برنامه
دانلود پروژه
امیدواریم از این آموزش استفاده برده باشید!
با سایر آموزش های اصفهان درایو همراه باشید!