
Mühendis elektrikli scooter’ın yazılımını Rust ile yeniden yazdı
Ben Simms, Egret GT scooter’ının CAN veri yolunu ve USB-C portuna gizlenmiş bağlantıyı çözümledi, açık hata ayıklama portundan yazılımı çekti ve ekran yazılımını Rust ile yeniden yazdı.
Ben adıyla yazan bir mühendis, Egret GT elektrikli scooter’ını tersine mühendislikle çözme sürecini ayrıntılı biçimde anlattı: cihazla konuşan Bluetooth uygulamasından USB-C portuna gizlenmiş CAN veri yoluna, oradan da ekran birimi için Rust ile yazılmış yeni yazılıma kadar.
Geçen yıl alınan scooter 100 km menzil vaat ediyor ve hız, sürüş modu, batarya seviyesi ile menzili gösteren 320x480 çözünürlüklü bir LCD ekran taşıyor. Proje küçük bir rahatsızlıkla başladı: açılış sırasında tuş takımındaki “aşağı” düğmesine basılı tutmak cihazı yazılım güncelleme moduna sokuyordu ve bu menüden çıkmak sürücüyü PIN girmeden normal sürüş moduna alıyordu. “Scooter’ı her zaman iyi bir kilitle bağlıyorum, ama bu yine de beni rahatsız etti” diye yazıyor.
Uygulama, veri yolu ve standart dışı USB-C
Mobil uygulamanın Bluetooth işleyicilerini incelemek, scooter’ın yazılım güncellemelerini Bluetooth üzerinden aldığını ve ekran, kontrolcü ile düğme paneli için ayrı hedefler bulunduğunu gösterdi. Cihaz ayrıca uygulamada ve ekranda görünmeyen verileri aktarıyor — her sürüş modunda geçirilen süre, motor akımı, batarya voltajı ve şarj geçmişi — toplam sürüş süresi, kilometre sayacı ve şarj geçmişini üreticiye gönderip scooter kimliğine bağlı olarak saklıyor; uygulama bunu açıkça belirtmiyor.
Üreticinin telefon şarj portu olarak tanımladığı USB-C çıkışında pimleri osiloskopla inceleyen yazar, iki pimin CAN veri yolu taşıdığını gördü — kendi deyimiyle “korkunç derecede standart dışı” bir kullanım. ESP32-C6, SN65HVD230 ve MCP2515 ile bir kaydedici kurup trafiği haritaladı: 0x300 mesajı sürüş modu ve far durumunu, 0x306 gaz konumu, sinyal lambaları ve hız sınırını, 0x201 ise motor hızı ile durum bayraklarını taşıyor.
Söküm, yazılım çekme ve kimlik doğrulama eksikliği
Yedek kontrolcü ve ekran satın alan yazar, kontrolcüdeki bileşenlerin işaretlerinin silinmediğini fark etti, muhtemel bir SWD başlığı buldu ve yazılımı OpenOCD ile çekti; Ghidra’daki analiz sabit adreslerde bir önyükleyici, bir güncelleyici ve ana uygulamayı ortaya çıkardı. Ekranı açmak daha zordu; kartında AT32F415 ana mikrodenetleyicisi, bir Bluetooth çipi, bir NFC okuyucusu ve yalnızca arayüz görsellerini barındıran bir flaş belleği var.
Güncelleme süreci de aynı ölçüde açıktı: yazılım CAN veri yolu üzerinden hiçbir kriptografi olmadan, dokuz çerçeveye yayılmış 64 baytlık parçalar halinde ve CRC-16-CCITT denetimiyle yazılıyor; ilk parça yalnızca bir dosya adı ve metin olarak yazılım uzunluğunu taşıyor. Bir yazıcı yazdı, çektiği imajla denedi ve ilk seferde çalıştı. “Herhangi bir scooter’ın yazılımını kimlik doğrulama olmadan değiştirmek mümkün” diye not düşüyor.
Rust ile donanım katmanı
AT32F415 tek bir çipin klonu değil, STM32 çevre birimlerinin bir karışımı çıktı; bu yüzden Embassy çatısı yerine kendi donanım soyutlama katmanını, başka bir geliştiricinin stm32-rs çatalı üzerinden yazdı ve saatleri, zamanlayıcıları, ADC’yi, GPIO kesmelerini, UART, CAN ve RTC birimlerini devreye aldı. ST7796 ekranını mipidsi paralel arayüzü sürüyor, özel Bus tipi 16 GPIOB pininin tamamını tek komutla yazmayı sağlıyor ve deku tip tanımları aynı yapıların CAN ile Bluetooth çerçevelerini çözmesine izin veriyor.
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.