ARM, STM, STM32, توصیه شده, مقاله

چطور و چرا پروگرامر ST-Link را هک کنیم؟

پروگرامر ST-Link یکی از اولین ابزارهای لازم جهت شروع کار با انواع میکروکنترلرهاست. امروزه میکروکنترلرهای ARM، یکی از محبوب‌ترین میکروکنترلرهای موجود در بازار پردازنده‌ها هستند. پردازنده ARM را می‌توان در اکثر دستگاه‌های الکترونیکی و هوشمند پیدا کرد. از تلفن‌های همراه تا سیستم‌های ناوبری هواپیما همه از ARM استفاده می‌کنند. اما واقعاً کدام قابلیت موجود در این پردازنده باعث چنین محبوبیتی شده است؟ اگر بخواهیم به‌صورت مختصر اشاره‌ای کنیم باید بگوییم که “توان مصرفی پایین در مقابل سرعت و قابلیت” از عمده‌ترین دلایل محبوبیت این پردازنده است.

پردازنده ARM، کم‌کم وارد بازار میکروکنترلرها نیز شده؛ تا جایی که خانواده Cortex-M به‌صورت اختصاصی برای این بازار تهیه و طراحی شده است. شرکت‌های مختلفی با تهیه مجوزِ تولید این محصول، میکروکنترلر خود را مبتنی بر پردازنده ARM تولید کرده‌اند. شرکت‌های بزرگی چون TI یا NXP یا ST و … همه و همه در محصولات خود از پردازنده ARM بهره گرفته‌اند. با توجه به استانداردسازی هسته میکروکنترلرها توسط شرکت ARM، تقریباً می‌توان گفت که اکثر میکروکنترلرهای تولیدشده، از یک واسط استاندارد برای برنامه‌ریزی و پروگرام شدن استفاده می‌کنند که در این مورد رابط موردنظر، SWD است.

شرکت‌های مختلف، ابزار منحصربه‌فرد خود را برای پروگرام و خطایابی عرضه کرده‌اند. شرکت ST که تولیدکننده میکروکنترلرهای پرطرف‌دار STM32 (حداقل درون ایران) است نیز ابزار انحصاری خود را که ST-Link نامیده می‌شود، برای پروگرام کردن و خطایابی میکروکنترلرها عرضه کرده است.

ST-Link چست؟

پروگرارم St-Link

همان‌طور که توضیح دادیم ST-Link نوعی پروگرامر است که توسط شرکت ST طراحی و عرضه شده است. این پروگرامر واسط‌های SWD و JTag و هم‌چنین SWIM را برای برنامه‌ریزی میکروکنترلرهای 8 بیتی این شرکت (یعنی STM8) دارد. از رابط‌های SWD و Jtag می‌توان برای پروگرام کردن میکروکنترلرهای این شرکت که مبتنی بر هسته ARM هستند (یعنی STM32) استفاده کرد.

این پروگرامر داری قیمت مناسبی است که در مقایسه با پروگرامر J-Link بسیار ناچیز است. البته باید این نکته را در نظر داشت که پروگرامر St-Link تنها قادر به برنامه‌ریزی میکروکنترلرهای STM32 و STM8 است در حالی‌که پروگرامر J-Link قادر به پشتیبانی بیشتر میکروکنترلرهای ARM از شرکت‌های مختلف است.

چرا باید پروگرامر ST-Link را هک کنیم؟

ممکن است بپرسید که چرا باید ST-Link را هک کنیم؟

به این سؤال جواب‌های گوناگونی از زاویه نگاه‌های مختلف می‌توان داد. شاید قانع‌کننده‌ترین جواب، مقوله امنیت باشد. فرض کنید ماه‌ها یا شاید سال‌ها را صرف توسعه یک محصول کرده باشید؛ اگر نکات امنیتی لازم را در خصوص ارتقاء firmware و سخت‌افزار رعایت نکرده باشید، قادر به حفاظت از محصول خود نخواهید بود. همان‌طور که این پروگرامر به‌صورت گسترده کپی شد و در حال حاضر قیمت تهیه یک St-Link کلون، بسیار کمتر از نسخه اصلی است. شاید این مسئله (هک شدن یکی از ابزارهای اساسی) برای شرکتی به بزرگی St که تمرکز خود را بر روی تولید چیپ گذاشته است، چندان هم بد نباشد ولی برای شرکتی که کارش تولید پروگرامر است، این می‌تواند فاجعه‌ای باشد که حتی باعث ورشکست شدن آن شرکت نیز بشود.

ممکن است بپرسید در حال حاضر که فایل هگز پروگرامر St-Link موجود است، چرا باید بخواهیم آن را هک کنیم؟

در جواب می‌توان گفت حالتی را فرض کنید که فایل‌های مربوطه وجود نداشته باشند. یعنی اینکه برای اولین بار چطور این پروگرامر هک شده است؟ و یا این که فرض کنید شما قصد دارید که با استفاده از سخت‌افزار این پروگرامر، فریمورک مختص خود را ایجاد کنید و این امکان را به کاربرها بدهید که با استفاده از امکانِ خود پروگرامر (بوت لودر) firmware موردنظر شما را روی آن برنامه‌ریزی کنند. این بحث، نیاز به درک نحوه برقراری ارتباط بین بوت لودر و نرم‌افزار آپدیتر دارد.

تئوری هک پروگرامر St-Link

برای هک هر سیستمی لازم است از عملکرد آن آگاهی داشته باشیم تا بتوانیم با پیمودن مسیر موردنظر به مقصد برسیم. در این مقاله منظور از هک در واقع خواندن firmware پروگرامر ST-Link است. برای این کار چندین راه وجود دارد که گام‌به‌گام هرکدام را بررسی می‌کنیم. اولین نکته‌ای که باید به آن توجه داشته باشیم این است که پروگرامر St-Link قادر است از طریق بوت لودر و پورت USB به‌روزرسانی شود.

راه‌های ممکن برای خواندن فایل هگز:

1 . خواندن آیسی پروگرامر از طریق یک پروگرامر دیگر

2. هک از طریق SWD

3 . احتمالاً نرم‌افزار بروز رسانی باید حاوی فایل موردنظر جهت به‌روزرسانی پروگرامر باشد

4 . رصد کردن اطلاعات تبادل شده بین کامپیوتر و پروگرامر هنگام به‌روزرسانی

در این مقاله و مقاله بعد به بررسی و تست این 4 راه خواهیم پرداخت.

1.خواندن آیسی پروگرامر از طریق یک پروگرامر دیگر

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

2.هک از طریق SWD

رابط SWD مخصوص پروگرامر پردازنده های ARM

 

همان‌طور که قبلاً هم اشاره کردیم، تمام پردازنده‌های ARM سری Cortex-M داری این درگاه هستند. این درگاه در واقع یک رابط استاندارد است که اجازه دسترسی مستقیم را به رجیسترها و حافظه‌ها می‌دهد. اما چطور می‌توان با استفاده از این درگاه میکروکنترلر را هک کرد؟ خب ایده اولیه بسیار ساده است: وقتی‌که حافظه را قفل می‌کنیم (آن را در مقابل خوانده شدن محافظت می‌کنیم) یعنی ارتباط درگاه SWD را با حافظه Flash قطع می‌کنیم: اما این تنها بخشی از حافظه در دسترس است. ما می‌توانیم برنامه‌ای بنویسیم که از آدرس 0x8000000 (آدرس شروع حافظه فلش در خانواده STM) را به طول موردنظر بخواند و از طریق پورت سریال ارسال کند. بله خیلی زیرکانه است، اما برنامه فوق را چطور و کجا ذخیره و اجرا کنیم؟

به دلیل معماری ARM، این پردازنده قادر است برنامه کاربر را، هم از روی Flash و هم از روی RAM اجرا کند. از آنجایی‌که حافظه Flash قفل شده است و در دسترس نیست، تنها یکجا می‌ماند و آن هم حافظه RAM است؛ یعنی باید برنامه را به نحوی بنویسیم که قادر باشد از آدرس 0x2000000 (آدرس شروع حافظه RAM) اجرا شود. برای این کار باید دو نکته را مد نظر داشته باشیم: اول اینکه آدرس اجرای برنامه را هنگام کامپایل برنامه تغییر دهیم و دوم، آدرس جدول وقفه‌ها را جابجا کنیم؛ این قابلیتی است که میکروکنترلرهای ARM آن را دارند.

پس سناریوی کلی مشخص شد: نوشتن برنامه‌ای که حافظه Flash را بخواند و محتوای آن را از طریق Uart ارسال کند. بعد از آن با استفاده از رابط SWD برنامه را به حافظه RAM میکروکنترلر منتقل می‌کنیم و PC برنامه را به آدرس دلخواه برای اجرا انتقال می دهیم. به همین راحتی!

تمام این اتفاقات در صورتی انجام خواهد شد که بتوانیم از طریق SWD به حافظه‌های میکروکنترلر دسترسی داشته باشیم که متأسفانه امکان اتصال نبود. یعنی علاوه بر قفل بودن حافظه Flash، رایط SWD نیز غیرفعال شده بود.

پس دقت کنید برای محافظت بیشتر، علاوه بر قفل کردن فلش میکروکنترلر، رابط SWD را نیز از کار بیندازید.

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



انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.  همکاری با سیسوگ

 

نوشته های مشابه

8 دیدگاه در “چطور و چرا پروگرامر ST-Link را هک کنیم؟

  1. Avatar پیمان گفت:

    سلام، توی این مقاله نوشتید که:

    “نوشتن برنامه‌ای که حافظه Flash را بخواند و محتوای آن را از طریق Uart ارسال کند. بعد از آن با استفاده از رابط SWD برنامه را به حافظه RAM میکروکنترلر منتقل می‌کنیم و PC برنامه را به آدرس دلخواه برای اجرا انتقال می دهیم. به همین راحتی!”

    اطلاعات بیشتری در این زمینه میخواستم. چون توی سند PM0075 شرکت ST صفحات 17 و 18 نوشته شده
    Main Flash memory read access is not allowed except for the user code (when booting
    from main Flash memory itself with the debug mode not active).
    و همچین
    When booting from the embedded SRAM, Flash memory accesses through the code
    and through data read using DMA1 and DMA2 are not allowed.

    لینک :
    https://www.st.com/content/ccc/resource/technical/document/programming_manual/10/98/e8/d4/2b/51/4b/f5/CD00283419.pdf/files/CD00283419.pdf/jcr:content/translations/en.CD00283419.pdf

    1. زئوس Zeus زئوس Zeus گفت:

      سلام – ببینید این صفحات داره در مورد Read protection صحبت میکنه ! که توسط آپشن بایت RDP قابل تنظیم هست حرف میزنه
      میگه وقتی که Read protection میکنید دیگه حافظه Flash قابل دسترس از طریق SWD نیست و البته User Code و هنگام بوت از حافظه Sram
      اتفاقی که می افته مقداری متفاوته ! ، من میکروی ST رو بررسی کردم ، وقتی که حالت Read protection رو فعال میکنید ، به نحوی حالت Debug از کار می افته ، برای همین نمیشه این بند رو عملی کرد ، در واقع با فعال کردن فلگ Read protectio درگاه SWD تنها قادر به پاک کردن حافظه فلش خواهد بود و دسترسی اتصال به CPU و رجیستر های کنترلر رو از دست می دهد.

      1. Avatar پیمان گفت:

        سلام، در نتیجه اگر read protection فعال باشه نمیشه با بوت کردن میکرو از SRAM و نوشتن کدی که حافظه فلش رو بخونه و به پورت سریال بفرسته به کد دسترسی پیدا کرد. در اینصورت هک از طریق SWD به این صورتی که در مقاله گفتید امکان پذیر نیست حتی اگر SWD فعال باشد.
        البته مقاله ای با عنوان
        “Shedding too much Light on a Microcontroller’s Firmware Protection”
        رو دیدم که مدعی هست علیرغم فعال بودن red protection میکروهای سری F0 شرکت ST تونسته حافظه فلش رو بخونه.

        1. زئوس Zeus زئوس Zeus گفت:

          نه لذوما اینطور نیست ، ببینید الان داریم در مورد یک خانواده از یک شرکت حرف میزنیم ! همونطور که خودتون هم اشاره کردید ظاهرا باگ برای سری F0 وجود داره ، من این قضیه رو با میکروکنترلر شرکت های دیگه ای تست کردم و موفق بودم !
          پس نمیشه کلی نتیجه گرفت ، موردی بله – در خصوص این آیسی خاص از شرکت خاص بله کاربرد نداره – همونطور که ما توی مقاله با درب بسته از این روش مواجه شدیم 🙂

          1. Avatar صدرا گفت:

            سلام دوستان. من یک ایسی دارم میخوام کانتر رو بخونم ، به خاطر تحریم نتونستم بیارم دیگه، میخوام یک نفر معرفی بشه برای اینکار ،یک میکروکنترلر هست از شرکت ti پین ۶۴ ، اگر کسی اینکاره هست معرفی کنید لطفا

          2. زئوس Zeus زئوس Zeus گفت:

            سلام دوست عزیز ؛ با تلگرام سیسوگ در ارنباط باشید
            @sisoogOs

  2. مهدی عبدالهی مهدی عبدالهی گفت:

    کارت عالی دوست عزیزم واقعا بهت افتخار میکنم

    1. زئوس Zeus زئوس Zeus گفت:

      ممنونم آقای عبدالهی شما خیلی لطف دارید 🙂

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *