Microdenetleyicilerde Kodların Şifrelenmesi

fide

Meraklı ve "nasıl" sorusunu seven biri
Katılım
8 Eylül 2021
Mesajlar
1,654
ESP32 yada Pi pico için kodların (Micropython çalışırken) görünmesi büyük sıkıntı. Ne yapabilirim diye düşünüyorum ama şimdiye kadar çıkar yol bulamadım. thonny ile Pi Pico/ESP32 açınca kodların hepsi ortaya dökülüyor. Şifre falan yazmak yada login bilgileri saklamak mesele. Sanırım en güzel yol ESP ve Pi Pico iiçin seri port ve usb pinlerini bloke etmek yada kart üzerinden ulaşılmasını engellemek. Benim aklıma başka yol gelmedi.
 
Son düzenleme:
ESP32 yada Pi pico için kodların (Micropython çalışırken) büyük sıkıntı. Ne yapabilirim diye düşünüyorum ama şimdiye kadar çıkar yol bulamadım. thonny ile Pi Pico/ESP32 açınca kodların hepsi ortaya dökülüyor. Şifre falan yazmak yada login bilgileri saklamak mesele. Sanırım en güzel yol ESP ve Pi Pico iiçin seri port ve usb pinlerini bloke etmek yada kart üzerinden ulaşılmasını engellemek. Benim aklıma başka yol gelmedi.
pico usb msc olarak programlanıyıor.
ama picolar'da da chipID'var.
ne kadar izole edip emniyete almaya çalışssak'da bir yolu oluyor biz sadece ihtimal azaltabiliriz.

esp32 için 2 seri bağlı(ve) if izolesi yapabiliriz.
chipID == xx && MacAdres == xx

ama en doğru yol usb ve uart köprülerini erişilemez kılmak.
veya cihazlarda olduğu gibi işlemciyi tamamen dijital entegreye dönüştürmek okuma ve yazmayı devre dışı bırakmak bu işin en sağlam çözümü gibi duruyor.
 
Kodun ele geçmesi yada başka birinin benim donanımı hackleyip kendi kodu ile kullanmaını engellemek. Donanım olarak port erişimini engellemekten başka yol göremedim ama bu defa da benim donanıma erişimim ve güncellemem sıkıntı. Ya Esp32/ Pi Pico'ya her açılışta şu siteden şu kodu çek diyecez yada lokalde bir yere bağlan, kodları çek sonra da bu kodları yürüterek devam et diyecez. Başka yol benim aklıma gelmedi.
 
Kodun ele geçmesi yada başka birinin benim donanımı hackleyip kendi kodu ile kullanmaını engellemek. Donanım olarak port erişimini engellemekten başka yol göremedim ama bu defa da benim donanıma erişimim ve güncellemem sıkıntı. Ya Esp32/ Pi Pico'ya her açılışta şu siteden şu kodu çek diyecez yada lokalde bir yere bağlan, kodları çek sonra da bu kodları yürüterek devam et diyecez. Başka yol benim aklıma gelmedi.
ben chipID olayının farkına vardığımdan beri işin içine biraz kansızlık kattım.

diyelim sistemimde lcd ekran, sensör vs. var ben yine chipID ile izole ediyorum eğer chipID eşleşmediyse lcd ekrana sensör hatası yazdırıyorum bu aklıma gelecek en güzel yöntem kodu çekebiliyorlar sorun yok çektikleri kod hex oluyor hexi okuyup benim bu izole yöntemimi görecek birisi zaten benim yaptığım cihazıda yapabilir o yüzden en güzel hem çıldırtma hemde kodunu emniyete alma için güzel yöntem.
ama replika chip üreticisinin milyonlarca çipe aynı chipID'yi yazıp satması hiç hoş bir durum olmaz.
 
thony ile biraz çalıştım sanırım thony'de okuma yapınca direkt karşıma python kodları çıkıyor yani hex değil anlayacağımız şekild ascii formatında görüyoruz programı.

o zaman emniyet almak çok zor.
 
thony ile biraz çalıştım sanırım thony'de okuma yapınca direkt karşıma python kodları çıkıyor yani hex değil anlayacağımız şekild ascii formatında görüyoruz programı.

o zaman emniyet almak çok zor.
Evet sıkıntım tam da bu zaten. Kodlar ayan beyan ortada.
Arduino ide kullanmak hem hoşuma gitmiyor hem de python/micropython getrdiği birçok komut/kolaylık/avantaj varken Arduino ile satır satır o işi yapacak komutları yazmak işime gelmiyor.
GPS verisi alacağım. Bu saniyede 470-480 karakter gelmesi demek. Micropython ile verileri önce $ işaretlerinden sonra da , (virgül) lerden böl demek 4-5 satır ama bunu arduino ile nasıl yazarım bilmiyorum. Bir şekilde yazılır yine ama can sıkar.

Diğer bir konu (Arduino ve Micropython için ortak) verinin bittiğini anlamak.
Arduino'da Serial.available<>0 ise
Micropython'da Serial.any() > 0 komutu var. Bu komutlar seri port bufferdaki veri miktarını veriyor. Veri almak için bu değerlerin 0'dan büyük olmasını kontrol ediyoruz ama bu alınan verinin bittiği anlamını taşımıyor.

Örnek:
$GPGGA,210230,3855.4487,N,09446.0071,W,1,07,1.1,370.5,M,-29.5,M,,*7A

Yukardaki satır gibi yaklaşık 10 satır veri 80-100ms aralığında geliyor. Veri gelmeye başladıktan sonra her halükarda bufferdaki sayı 0'dan büyük oluyor. Yani veriyi almak için şart sağlanıyor ama verinin tamamı gelmemiş oluyor.
Bu noktada ben şöyle bir yapı kullanıyorum.
micropython / python için şunu kullanıyorum:

if seri.any()>0:
x = seri.any()
sleep(0.01)
while (x <> seri.any()):
x = seri.any()
sleep(0,001)
data = seri.read(seri.any())

Bu şekilde veri gelmeye devam ediyorsa while'dan önceki ve sonraki satırdaki kontrol ve bekleme satırına takılıyor. Bu rutin sistemin çalışma hızını düşüreceği için thread olarak çalıştırılabilir yada bekleme yerine While döngüsü içinde bir sonraki çalışmada tekrar kontrol sağlanabilir ama veriyi almak için verinin tamamının gelmiş olmasından emin olmak önemli.

Siz kontrol için nasıl yöntem/ teknik kullanıyorsunuz?
 
C'de farklı farklı veri bölme işlemi yapabiliyoruz bir tanesini de forumda incelemiştik;

Tabii senin gelen lenght standart uzunlukda değilse bu konuda incelediğimiz şekil senin işine yaramaz.

birkaç veri bölme methodu deneyip yazarım forumda ben hem substring ve length ile bölüyorum

virgül tespit etme ile ilgili şöyle birşey buldum;
C++:
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    string str = "1,2,3,4,5,6";
    vector<string> v;
 
    stringstream ss(str);
 
    while (ss.good()) {
        string substr;
        getline(ss, substr, ',');
        v.push_back(substr);
    }
 
    for (size_t i = 0; i < v.size(); i++)
        cout << v[i] << endl;
}
 
Son düzenleme:
Tek sıkıntı o da değil. Hem gps hem de gsm modül olacak. Veri uzunluğu ve veri yapısı haliyle değişken. Bunun Ortak bir yolu yok. Ya tek tek kontrol yada içinde "AT" varsa, "ERROR" varsa gibi kontrollerle yapıyorum. Micropythonın küçük komutları burada hayati derecede önem kazanıyor.
Aşağıdaki namedtuple tanımla ve kullanımı ise gsm modül için hayat kurtarıcı oluyor.

NamedTuple örneği:
#namedTuple defines
atCmd = namedtuple('atCmd', ['cmdText','timeout','responses'])
at = atCmd("AT\r", 300, ["OK", "ERROR"])  # AT
atE0 = atCmd("ATE0\r", 300, ["OK", "ERROR"])  # Command Echo
atQGSN = atCmd("AT+QGSN\r", 3000, ["OK", "ERROR"])  # Gsm Serial Number
atCCID = atCmd("AT+CCID\r", 300, ["OK", "ERROR"])  # Sim Abone No
atQNITZ = atCmd("AT+QNITZ=1\r", 300, ["OK", "ERROR"])  # Network Time Sync Enable
atCTZU = atCmd("AT+CTZU=3\r", 300, ["OK", "ERROR"])  # Localized Time Sync
atCTZR = atCmd("AT+CTZR=1\r", 300, ["OK", "ERROR"])  # Time Sync Bildirimi
atCCLK = atCmd("AT+CCLK?\r", 1000, ["OK", "ERROR"])  # Saat?
atQGNSSC = atCmd("AT+QGNSSC=1\r", 300, ["OK", "ERROR"])  # GNSS Power On
atQGNSS = atCmd("AT+QGNSS=0\r", 300, ["OK", "ERROR","+CME ERROR:"])  # GNSS NMEA Tipi
atCMGF = atCmd("AT+CMGF=1\r", 300, ["OK", "ERROR","+CME ERROR:"])  # SMS Format
atCNMI = atCmd("AT+CNMI=2,1\r", 300, ["OK", "ERROR","+CME ERROR:"])  # SMS Notification Type
atQNSTATUS = atCmd("AT+QNSTATUS\r", 1000, ["OK", "ERROR"])  # Network Status
atCSQ = atCmd("AT+CSQ\r", 300, ["OK", "ERROR", "+CME ERROR:"])  # Signal Quality
atCREG = atCmd("AT+CREG?\r", 300, ["OK", "ERROR","+CME ERROR:","+CREG:"])  # Signal Quality
atCMGL = atCmd("""AT+CMGL="REC UNREAD"\r""",3000, ["OK", "ERROR"])
atCMGD = atCmd("AT+CMGD=1,4\r",3000, ["OK", "ERROR"])
atQGNSSRD = atCmd("AT+QGNSSRD?\r",3000,["OK", "ERROR"])
atCSMP = atCmd("AT+CSMP=17,167,0,0\r",1000,["OK", "ERROR"])
atCSCS = atCmd("""AT+CSCS="GSM"\r""",1000,["OK", "ERROR"])
atCMGS = atCmd("""AT+CMGS="{}"\r""",5000,["OK", "ERROR"])
atQIFGCNT = atCmd("AT+QIFGCNT=0\r",1000,["OK", "ERROR"])
atQICSGP = atCmd('AT+QICSGP=1,"INTERNET","",""\r',1000,["OK", "ERROR"])
atQIREGAPP=atCmd("AT+QIREGAPP\r",5000,["OK", "ERROR"])
atCGATT = atCmd("AT+CGATT?\r",5000,["OK", "ERROR"])
atQIACT = atCmd("AT+QIACT\r",5000,["OK", "ERROR"])
atQLOCCFG = atCmd("AT+QLOCCFG?\r",5000,["OK", "ERROR"])
atQCELLLOC = atCmd("AT+QCELLLOC\r",5000,["OK", "ERROR"])

C dilindeki Struct yapısının Python Port edilmiş hali
Kodun Linki
https://www.picproje.org/index.php/topic,77665.0.html
 
Tek sıkıntı o da değil. Hem gps hem de gsm modül olacak. Veri uzunluğu ve veri yapısı haliyle değişken. Bunun Ortak bir yolu yok. Ya tek tek kontrol yada içinde "AT" varsa, "ERROR" varsa gibi kontrollerle yapıyorum. Micropythonın küçük komutları burada hayati derecede önem kazanıyor.
Aşağıdaki namedtuple tanımla ve kullanımı ise gsm modül için hayat kurtarıcı oluyor.

#namedTuple defines atCmd = namedtuple('atCmd', ['cmdText','timeout','responses']) at = atCmd("AT\r", 300, ["OK", "ERROR"]) # AT atE0 = atCmd("ATE0\r", 300, ["OK", "ERROR"]) # Command Echo atQGSN = atCmd("AT+QGSN\r", 3000, ["OK", "ERROR"]) # Gsm Serial Number atCCID = atCmd("AT+CCID\r", 300, ["OK", "ERROR"]) # Sim Abone No atQNITZ = atCmd("AT+QNITZ=1\r", 300, ["OK", "ERROR"]) # Network Time Sync Enable atCTZU = atCmd("AT+CTZU=3\r", 300, ["OK", "ERROR"]) # Localized Time Sync atCTZR = atCmd("AT+CTZR=1\r", 300, ["OK", "ERROR"]) # Time Sync Bildirimi atCCLK = atCmd("AT+CCLK?\r", 1000, ["OK", "ERROR"]) # Saat? atQGNSSC = atCmd("AT+QGNSSC=1\r", 300, ["OK", "ERROR"]) # GNSS Power On atQGNSS = atCmd("AT+QGNSS=0\r", 300, ["OK", "ERROR","+CME ERROR:"]) # GNSS NMEA Tipi atCMGF = atCmd("AT+CMGF=1\r", 300, ["OK", "ERROR","+CME ERROR:"]) # SMS Format atCNMI = atCmd("AT+CNMI=2,1\r", 300, ["OK", "ERROR","+CME ERROR:"]) # SMS Notification Type atQNSTATUS = atCmd("AT+QNSTATUS\r", 1000, ["OK", "ERROR"]) # Network Status atCSQ = atCmd("AT+CSQ\r", 300, ["OK", "ERROR", "+CME ERROR:"]) # Signal Quality atCREG = atCmd("AT+CREG?\r", 300, ["OK", "ERROR","+CME ERROR:","+CREG:"]) # Signal Quality atCMGL = atCmd("""AT+CMGL="REC UNREAD"\r""",3000, ["OK", "ERROR"]) atCMGD = atCmd("AT+CMGD=1,4\r",3000, ["OK", "ERROR"]) atQGNSSRD = atCmd("AT+QGNSSRD?\r",3000,["OK", "ERROR"]) atCSMP = atCmd("AT+CSMP=17,167,0,0\r",1000,["OK", "ERROR"]) atCSCS = atCmd("""AT+CSCS="GSM"\r""",1000,["OK", "ERROR"]) atCMGS = atCmd("""AT+CMGS="{}"\r""",5000,["OK", "ERROR"]) atQIFGCNT = atCmd("AT+QIFGCNT=0\r",1000,["OK", "ERROR"]) atQICSGP = atCmd('AT+QICSGP=1,"INTERNET","",""\r',1000,["OK", "ERROR"]) atQIREGAPP=atCmd("AT+QIREGAPP\r",5000,["OK", "ERROR"]) atCGATT = atCmd("AT+CGATT?\r",5000,["OK", "ERROR"]) atQIACT = atCmd("AT+QIACT\r",5000,["OK", "ERROR"]) atQLOCCFG = atCmd("AT+QLOCCFG?\r",5000,["OK", "ERROR"]) atQCELLLOC = atCmd("AT+QCELLLOC\r",5000,["OK", "ERROR"])

Kodun Linki
https://www.picproje.org/index.php/topic,77665.0.html
bunları tespit edecek bir cpp kütüphanesi oluşturulabilir aslında.
zor değil bu komutları ayıklamak.
üstte attığım gibi + ve , ayıklayarak arada kalanları yorumayacağız sadece.
mp bunu pratik olarak yapıyor olabilir ama projeye birkaç saat fazla zaman ayırıp kod eminyetini hat safaya çıkarabilirisin.

biraz datasheet okuyarak kod çekme ve yüklemeyi nası pasif konuma alacağız onuda görebilriz.
 
GPS parse işlemini CCS ile pic için yazmıştım. Çalıştı ama beni benden etti.
Pcb çizimi bitsin bol bol kafa kıracağız bu kodlarla:dusun2::dusun2::kizgin3::kizgin3::kotek1::kotek1::bilmem1::bilmem1::dans1::dans1::cheeky5::cheeky5:
 
Son düzenleme:
Pico ve ESP32 için kodların dışardan görülmemesi için yöntem w25q16 nor flash dışarda programlanıp karta monte edilebilir ama aynı işlem tersine çevrilirse kodlar yine gözükür.
 
Pico ve ESP32 için kodların dışardan görülmemesi için yöntem w25q16 nor flash dışarda programlanıp karta monte edilebilir ama aynı işlem tersine çevrilirse kodlar yine gözükür.
bu çok zevkli bir hırsızlık projesi olur abi.
lojik analizörümü alıp spi bus'a paralel olup senin bütün flashı okuyup çekip giderim.
 
Micropython ESP32 nin içine sığacak kadar micro değil mi? :) Size herhalde picopython falan lazım :katil2:
 
Micropython ESP32 nin içine sığacak kadar micro değil mi? :) Size herhalde picopython falan lazım :katil2:


Abi sıkıntı Micropython değil, thonny vb tarayıcı ile çalışan kodların doğrudan görülmesi/manipule edilmesi

bu çok zevkli bir hırsızlık projesi olur abi.
lojik analizörümü alıp spi bus'a paralel olup senin bütün flashı okuyup çekip giderim.
Tersine mühendislik diyoruz buna.
 
Abi sıkıntı Micropython değil

Python yorumlayıcıyı, python script ile beraber ESP32 ye yükleyebiliyor olsaydın, normal bir firmware'den farkı kalmazdı ve çipi protect yapar işi bitirirdin doğru değil mi?
 
Python yorumlayıcıyı, python script ile beraber ESP32 ye yükleyebiliyor olsaydın, normal bir firmware'den farkı kalmazdı ve çipi protect yapar işi bitirirdin doğru değil mi?
mp çok basitleştiriyor abi program yazmayı.
çoğu detaya müdahale edemiyorsun ama çok basit yazdırıyor.
neye derlediğini bende bilmiyorum
 
Python yorumlayıcıyı, python script ile beraber ESP32 ye yükleyebiliyor olsaydın, normal bir firmware'den farkı kalmazdı ve çipi protect yapar işi bitirirdin doğru değil mi?
@taydin yorumlayıcı zaten esp32 üzerine yükleniyor. Kodlar derlenmiyor. Bildiğim kadarıyla (çok derin araştırmadım) çip protect gibi bir olay yok. Bu yüzden esp32 / pi pico türü mücropython çalışan heryerde kodlar açıkta. Herhangi hevesli biri modüle seri port ile bağlanıp kodları değiştirebilir kopyalayabilir yada hackleyebilir.
 
@taydin yorumlayıcı zaten esp32 üzerine yükleniyor. Kodlar derlenmiyor. Bildiğim kadarıyla (çok derin araştırmadım) çip protect gibi bir olay yok. Bu yüzden esp32 / pi pico türü mücropython çalışan heryerde kodlar açıkta. Herhangi hevesli biri modüle seri port ile bağlanıp kodları değiştirebilir kopyalayabilir yada hackleyebilir.
pico'da usb data pinleri IO'lara bağlı degil.
direkt chip üstünden kazınıp alınabilir.

ama almak isteyen biri swd arayüzünden de alabilir
 
Yalnız Pi Pico da şöyle bir durum var: Program çip üzerinde değil NOR flaşta saklanıyor. Herhangi bir şekilde RP2040 değiştirilince yeni RP2040 hiçbir yükleme ayar yapmadan önceki Pi Pico'ya yüklü kodları çalıştırıyor. Bu da kodların RP2040'a değil NOR Flasha yüklü olduğunu gösteriyor.
nor flaş yoksa rp2040 içindeki rom'a yazamıyor muyuz?
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,785
Mesajlar
98,952
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top