در مقاله قبل ( هک پروگرامر ST-Link نفوذ به بوت لودر ) ، با بررسی دیتاهای به دست آمده و آنالیز عملکرد به نتایج خوبی از هک پروگرامر رسیدیم ، نتایج حاکی از آن بود که فایل فریمور پروگرامر ST-Link احتمالا باید درون برنامه آپدیتر باشد و از طرفی به دلیل نمایش ورژن فریمور قابل آپدیت در نرم افزار احتمالا کلید آن باید جایی درون برنامه ذخیره شده باشد. در این قسمت به عنوان آخرین قسمت از سری مقالات هک پروگرامر St-Link قصد داریم نحوه استخراج کد را آموزش دهیم پس با سیسوگ همراه باشد.
دسترسی به سورس نرم افزار
برای استخراج کد از درون برنامه نیاز است که ابتدا سورس کد برنامه آپدیتر را به دست آوریم و بعد از آن با بررسی آن قادر خواهیم بود که کلید مورد نظر را از برنامه اسنخراج کنیم . همانطور که قبلا هم اشاره کردیم، Java یک زبان میانی است که توسط ماشین مجازی Java بر روی سیستم اجرا می شود ، همین قابلیت به برنامه هایی که با استقاده جاوا نوشته می شوند امکان میدهند که بر روی سیستم عامل های مختلف قابل اجرا باشند. البته به ما هم این امکان را می دهند که بتوانیم کدهای نوشته را از دل برنامه اجرایی استخراج کنیم !
برای استخراج کد از فایل اجرایی جاوا نرم افزار های زیادی وجود دارند ، ما از نرم افزار procyon decompiler استفاده کردیم.
شاید برای شما مفید باشد: همه چیز درباره دیکد نرمافزاری MP3 به کمک میکروکنترلر
پیدا کردن کلید رمزگذاری پروگرامر ST-Link
برای پیدا کردن کلید رمز گذاری لازم است که کد های برنامه آپدیتر ST-Link را بررسی کنیم ، معمولا تمام برنامه های از تابع Main شروع به اجرا می کنند و این میشود سرنخ ؛ با بررسی و تحیلی کد Java که بسیار هم به زبان C شبیه است و شاید این هم از اقبال ماست .
بعد از بررسی های طولانی ، بلاخره کلید مذکور را در کد پیدا کردیم ، و کلید چیزی نیست جز “best performance” ، اما از کجا میتوانیم مطمئن باشیم که عبارت درستی را به عنوان کلید انتخاب کرده اینم !
قبلا اشاره کردیم که احتمالا کدگذاری بر اساس AES-128 انجام شده است ، اگر با این روش رمزگذاری آشنایی داشته باشید ، حتما میدانید که 128 بیت کلید برای رمز گذاری لازم است ، که در واقع 128 بیت معادل است با 16 بایت ، و جالب این است که واژه “best performance” نیز 16 بایت یا 128 بیت است.
و البته تنها یک راه برای اطمینان کامل وجود دارد ، و آن هم دکد کردن فایل رمز گذاری شده است ، برای این کار لازم است از ابزار دکدر AES-128 لازم دارید. برای انجام این کار میتونید از ابزار (Sisoog_ST-Link_HackTools.7z) استفاده کنید.
این ابزار با استفاده از جاوا نوشته شده است که هم برای کد کردن و هم برای دکد کردن میتوان از آن استفاده کرد. برای دکد کردن به صورت زیر از آن استفاده خواهیم کرد.
1 | java -jar aes128.jar --key "encryption key" -i firmware.bin -o firmware_decrypted.bin |
بعد از رمزگشایی فایل مروبط به فریمور پروگرامر ST-Link فایل مذکور را با استفاده از روش ذکر شده در مقاله دوم جهت تشخیص این که فایل مذکور فایل اجرایی یک پردازنده است بررسی می کنیم . بله خوشیختانه همه چیز درست است.
روش دیگری که میتوانیم برای اطمینان بیشتر استفاده کنیم این است که فایل فریمور دکد شده را با استفاده از یک ویرایشگر باینری باز کنیم ، معمولا فایل های فریمور حاوی رشته هایی برای نشان دادن خطا به کاربر هستند که در فریمور به صورت رشته ذخیره می شوند ، اگر فایل را درست دکد کرده باشیم ، باید چنین رشته هایی در درون فریمور وجود داشته باشد.
پروگرامر ST-Link به جهان سلام کن !
بعد از کشف نوع و کلید رمز گذاری و همچنین محل قرارگیری برنامه در حافظه (استفاده از آدرس وکتور در فریمور (0x8004000) ) قصد داریم برنامه ای بنویسیم که با استفاده از پایه PA5 یک LED را چشمک زن کنیم. پایه SWD روی این پایه تعریف شده است.
اولین اقدام تنظیم لینکر است که با توجه به آدرس وکتور و مقدار RAM میکروکنترلر به صورت زیر تعریف می شود
1 2 3 4 5 | MEMORY { rom (rx) : ORIGIN = 0x08004000, LENGTH = 64K - 0x4000 ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K } |
و اما برنامه اصلی هم به صورت زیر خواهد بود
1 2 3 4 5 6 7 8 9 10 | void main() { rcc_clock_setup_in_hse_8mhz_out_72mhz(); rcc_periph_clock_enable(RCC_GPIOA); gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO5); while (1) { gpio_toggle(GPIOA, GPIO5); delay_ms(250); } } |
بعد از کامپایل ، یک فایل bin خواهیم داشت که باید قبل از انتقال به پروگرامر St-Link رمزگذای شود. برای رمزگذاری دستور زیر استفاده می کنیم :
1 | java -jar aes128.jar -k "best performance" -i main.bin -o f1_1.bin --encrypt |
بعد از کدکردن با کیلد مروبطه ، فایل جدید را درون برنامه جاوا بروز رسانی می کنیم و ST-Link را با اسنفاده از آن آپدیت می کنیم.
تکمیل فرایند هک پروگرامر ST-Link
تا اینجا از هک پروگرامر توانستیم قفل های موجود در نرم افزار را بشکنیم و برنامه دلخواه خود را بر روی سخت افزار آپدیت کنیم ! اما برای این که بتوانیم یک فریمور کاملا کلون بسازیم نیاز است که علاوه بر داشتن کد برنامه ، کد بوت لودر را نیز داشته باشیم . برای به دست آوردن کد بوت لودر به سادگی برنامه ای بنویسید که حافظه فلش میکروکنترلر را بخواند و داده ها را بر روی پورت سریال ارسال کند. به همین سادگی فرایند های قبل را در کامپایل کد کردن برنامه و آپدیت بر روی پروگرامر ST-Link اجرا کنید ، به محض روشن شد ، برنامه شروع به ارسال داده های (فایل باینری) بوت لودر خواهد کرد. به همین سادگی فرایند هک پروگرامر St-Link را کامل می کنیم.
سلام ، چند عدد از پروگرامر های st-link که مستقیم به usb میخوره را دارم که همشون بعد از 5 یا 6 روز از کار می افتند و هنگام اتصال خطای Not recignized میده ،
آیا راهی داره که اینها رو برگردونم؟
خود به خود این تفاق افتاده ؟
تست کنید اگر میکروشون پروگرام میشه که پروگرام کنید اگر نه که صدمه دیده و نمیشه کاریش کرد
سلام وقت بخیر مطالب بسیار عالی بودن مخصوصا اشاره مستقیم به توجه کردن در بحث امنیت محصولات. به نظر بنده اگر قسمت هایی با تحت عنواینی مثل تبدیل فایل باینری یا هگز به زبان هایی مثل C این سری مقالات تکمیل تر میشه. در کل خیلی عالی بود من که لذت بردم همیشه مطالب سیسوگ اموزنده و زیباس
سلام دوست عزیز
محدودیت هایی وجود داره که نگرانی های قانونی وجود در خصوص اون وجود داره
ممنون از مطلب بسیار مفیدتون ، دست مریزاد. چند سوال برام ایجاد شد که همه را در یک پست میپرسم، هر زمان وقتتون اجازه داد ممنون میشم پاسخ بدید.
سوال اول: آدرس شروع برنامه را چطور پیدا کردید که 0x8004000 هست؟
سوال دوم: اگر فایل bin رمزگشایی شده را با یه پروگرمر دیگه بریزیم روی ST-Link جواب میده؟
سوال سوم: در بخش تکمیل فرایند هک پروگرامر ST-Link اشاره به خواندن کد بوت لودر کردید، میشه توضیح بدید بعد از استخراج بوت لودر چطوری باید با فایل bin دیکد شده ترکیبش کرد که بشه یک firmware کلون خوب؟
سوال چهارم: چرا اگر آدرس شروع برنامه درست باشه ولی فضای اختصاص داده شده به بوت لودر خالی باشه برنامه کار نمیکنه؟
سوال پنجم: نحوه کدنویسی برای اجرا در رم و خواندن فلش چطوریه؟ ممنون میشم در یه پست یک مثال واقعی را مطرح کنید.
سپاس بیکران.
سلام و درود بر شما
جواب یک: از آدرس وکتور اینتراپت که از خود فریمور قابل استخراجه و هم از طریق خود چیپ (یک بار میخواستم آموزش هک STM32 رو بذارم که منصرف شدم)
جواب دوم: اگر این کار رو بکنیم و در ادرس درست بریزیم و بوت لودر وجود داشته باشه بله کار میکنه بله خوبی
جواب سوم: بعد از استخراج محتوای بوت لودر اونو به شکل باینری ابتدای فایل فریمور قرار میدیم به همین سادگی
جواب چهارم: خیلی بستگی به فریمور داره معمولا فریمورها کار تنظیم آدرس وکتور رو به بوت لودر میسپارن اگر خودشون این کار رو انجام بدن و البته حافظه ابتدایی با NOP پر شده باشه مشکلی وجود نخواهد داشت.
سوال پنجم: اول که باید به کامپایلر بگید آدرس فانکشن ها رو برای فضای رم تعریف کنه، بعد با کپی کردن برنامه در رم میتونید اونها رو صدا بزنید.
ایا امکان دراه راهی بگید بتونیم فریمور STLINKاپدیت کنیم و راهی هست مدلی که فریمورش پریده رو دوباره پروگرام و استفادش کنیم؟
خوب آپدیت کردن که خیلی راحت از طریق خود نرم افزار شرکت ST موجود هست و از منو های نرم افزار میتونید پیداش کنید
در خصوص این که اگه فریمور پریده باشه خیلی راحت الان با جستجو توی گیت هاب فایل هگزش هست که بتونید مجددا پروگرامش کنید.
سلام ، ممنون بابت مطالب خوبی که گذاشتید.
من هم مشکلی مثل مشکلی کاربری به نام احسان دارم.
برد دیسکاوری f7 دارم که به اشتباه برنامه ی stlink اونو پاک کردم.
برنامه جدید که میریزم پورت کام ( همون بخش سریال ) رو نداره.
به این روش میتنم از رو برد دیسکاوری مشابه دیگه ای بخونم برنامشو؟
یا راه دیگه ای هست؟
اخرین آپدیت رو از سایت st دانلود کنید – آیا بعد از دریافت آپدیت هم همچنان همین مشکل هست ؟
وقتی ابدیت میکنم همچنان فقط برنامه ساده ی stlink هست.
بخش ارتباط سریال نداره. ( برنامه stlink کلی هست نه مخصوص برد دیسکاوری)
همچنین قبلا برنامه اش جوری بود که تغذیه کل برد از همون کابل تامین میشد. ( یکی از پین های میکرو به عنوان en تغذیه خروجی و high شده بود) ولی در برنامه کلی stlink برای این پین عملکردی قرار داده نشده.
بله هست.
فکر میکنم بله احتمالا بتونید بخونید و دیکدش رو انجام بدید
چطور باید بفهمم کدوم فایل ابدیت هست؟
خوب ساده ترین راه سعی و خطا هست یا این که از اسمش تشخیص بدید
اگر از اسمش نتونستید متوجه بشید میتونید تک تک فایل ها رو تست کنید و ببینید کدوم پورت سریال هم داره و به برد شما میخوره 🙂
سلام
با cubeIDE و پروگرمر st-link میخواستم برد bluepill رو پروگرم کنم. ولی cubeIDE خطا میده که چیپ اصلی نیست!
بنظرتون میشه کاریش کرد؟
سلام من این خطایی رو میگید تا حالا ندیدم – میشه متن کامل رو بذارید ؟
عجیبه برام
ببخشید همش بهم ریخت 🙂
یکی یکی میفرستم
جالبه من تا حالا با این خطا مواجه نشدم
ولی شما میتونید از openocd استفاده کنید برای دیباگ کردن
اینجا هم نوشته که cubeIDE فقط با چیپ های اصلی کار میکنه:
https://community.st.com/s/question/0D50X0000BEY435/cannot-download-code-into-stm32f103-by-stlink-v2-in-stm32cubeide
جالبه تا قبل از این ساز و کار رو نداشت توی نرم افزار خودش حالا چس شده توی این نرم افزار اضافه کرده جالبه برام
سلام
امکانش هست که پروگرمرهای ST link فیک که اکثرا از اون ها استفاده می کنند رو به J link تبدیل کرد؟
سایت شرکت segger میگه نمونه اصلی ST link رو میشه تبدیل کرد.
https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/
نمونه اصلی رو من این کار رو کردم و فکر نمیکنم با نمونه های فیک نشه این کار رو کرد !
احتمالا چون روشی برای تشخصی اصلی یا فیک بودن نداره – احتمالا بشه چنین کرد.
طبق توضیحات سایت عمل کردم ولی در مرحله آخر موقعی که گذینه یک رو برای آپدیت انتخاب می کنم ، همون جا میمونه و جلوتر نمیره.
وقت بخیر سلام
ممنون از پست خوبی که داشتید
راستش برای device هایی که frimware اونا تو ic لود شده و در دسترس نیست چه پیشنهادی دارید؟ سازنده device هم هیچ آپدیتی برای اون درنظر نگرفته.. چطور میشه به فریم ور دست یافت؟ و چطور میشه پسورد upload برنامه رو برداشت؟
خوب در واقع باید ببینید چه دسترسی هایی دارید ! و این قضیه برای هر چیپ میتونه متفاوت باشه – حتی هر طراحی !!!
شنیدم که شرکت هایی هستند که با تراشیدن چیپ سلیکون داده ها رو از توش در میارن !
سلام
خیلی خیلی ممنون از این که پیگیر مشکل من هستید
یه دونه پروگمر آنبورد stm32f429zit هست
بله خواهش میکنم ، بررسی میکنم
سلام ببخشید این سوال رو اینجا مینوسیم
من یه stm32f429i discovery دارم که متاسفانه در یک آپدیت پورت سریال مجازی که پروگرامرش میسازه واسه ارتباط یوزارت از کار افتاده یعنی تو برنامه آپدیتر خود st نیست راه حلی داره که درست بشه بتونم فرمور رو درست کنم که پورت سریال مجازی روی پروگرامر بودر دوباره فعال بشه
ممنون
سلام دوست عزیز خواهش میکنم ، احتمالا راهی وجود داره برای این خطایی که اتفاق افتاده ، قطعا شما بردتون رو با یک ورژن اشتباه بروز کردید
امکان درست کردنش از طریق هک وجود داره ولی بعید می دونم خود شرکت ST راهی براش نداشته باشه ، یک بار سعی کنید با استفاده از آپدیتر خود شرکت آپدیت کنید ببینید مشکل حل میشه یا نه !
سلام
آپدیت کردم با برنامه خود st الان به روزترین برنامه روش هست ولی متاسفان پورت کام رو نداره
سلام
احتمالا قسمتی که نوع برد رو هم مشخص میکنه پاک شده – مدل بردتون چی بود ؟
سلام
discovery stm32f429zi
سلام دوست عزیز
متاسفانه با سرچ هایی که انجام دادم به نتیجه ای نرسیدم و هیچ راهکاری برای حل این مشکل از سوی شرکت ST ارائه نشده ، به نظرم بهترین کار اینه که توی فروم های پشتیبانی ST مشکل رو مطرح کنید.