Pubblicità

Attivazione funzioni R&S CMU200

Un altro aspetto dell’articolo Come trasformare un R&S CMU200 in un generatore RF programmabile: la mia avventura di reverse engineering è stato ritrovare nel firmware originale le routine di verifica e abilitazione delle funzionalità aggiuntive.

Premessa

Quando si lavora su strumentazione di test vintage, una delle prime cose che si scopre è che ogni funzionalità extra (GSM, CDMA, WCDMA, generatore RF aggiuntivo, ecc) è bloccata da un license key software. Sui dispositivi Rohde & Schwarz di questa generazione, questi key risiedono in un singolo file chiamato SWOPT.DAT.

All’inizio avevo solo il file, quasi vuoto, ed ero curioso di comprenderne l’utilizzo, ma il firmware stesso contiene tutti gli elementi necessari per decifrare e rigenerare le chiavi, basta saperle trovare.

Il file SWOPT.DAT

Il file si trova in C:\CMU\DATA\SWOPT.DAT. È un semplice file di testo, con una riga per ogni opzione software installata. Ogni riga è una stringa esadecimale di 16 caratteri, ad esempio:

FEEC0364A639F575
A2AF0325E648F54D
4D8CB38F128844B2

Ognuna di queste righe è un record criptato che rappresenta un’opzione attiva (K9, K29, K53, ecc.). Il formato non è documentato da R&S, ed è stato recuperato interamente tramite analisi statica del firmware.

La scoperta: ARC2 con chiave hardcoded

Analizzando il codice del firmware in Ghidra, ho trovato la funzione che verifica le licenze al boot. Quello che mi ha colpito subito è stato il key material: la chiave di crittografia non è memorizzata in un file né letta dall’hardware, ma è semplicemente la stringa

"Revision"

con un byte null terminator: esattamente la stessa stringa che appare nei tag di revisione del firmware ($Revision: /main/5.20/1 $). R&S ha usato il proprio version string come chiave simmetrica. Semplice, ma efficace per lo scopo.

L’algoritmo è ARC2 (RC2), il cifrario a blocchi a 128-bit ampiamente utilizzato negli anni ’90, prima che diventasse obsoleto. Era una scelta normale per l’epoca: non era progettato per resistere ad attacchi deterministici, ma per impedire la copia non autorizzata.

Il formato del record

Ogni riga di SWOPT.DAT cifra un record di 8 byte strutturato così:

struct {
    uint32_t serial_part1;  // prima parte del serial number (NNNNNN)
    uint32_t serial_part2_and_option; // seconda parte + numero opzione
};

La seconda parola è un campo composto:

BitCampoOrigine
0–19serial_part2Parte dopo la barra (XXX del serial NNNNNN/XXX)
20–27optionNumero dell’opzione (es. 29 per K29)
28–31—Sempre zero

Il tutto in little-endian. Quindi per generare la chiave dell’opzione K29 su uno strumento con serial 837109/035:

serial  = 837109            # NNNNNN
serial2 = 35                # XXX, senza zeri iniziali
option  = 29                # K29

record = struct.pack("<II",
    serial,
    serial2 + (option << 20)
)

Il risultato (serial2 + (option << 20)) per K29 diventa: 35 + (29 × 1.048.576) = 30.413.531, che in esadecimale little-endian è 3C 01 00 00 — esattamente il pattern notato dalla community EEVBlog (vedi link: https://www.eevblog.com/forum/testgear/enabling-options-for-rs-test-equipment/), 0xx0003C dove xx è l’opzione in hex.

L’algoritmo completo

Ecco il flusso completo, sia per leggere che per generare le chiavi:

Decrittazione (leggere le opzioni da un file esistente)

1. Leggi ogni riga di SWOPT.DAT 2. Ignora le righe vuote o di lunghezza diversa da 16 3. Converti la stringa hex in 8 byte 4. Deseleziona i 8 byte con ARC2 mode=1, chiave b”Revision\0″ 5. Scompatta i 2 uint32 little-endian 6. Estrai il numero opzione: `(seconda_parola >> 20) & 0xFF` 7. Estrai la seconda parte del serial: `seconda_parola & 0xFFFFF` 8. Stampa: K{opzione} → Serial {prima_parola}/{serie2_formatteggiata}

Crittografia (generare una nuova chiave)

1. Prendi il serial number nello formato NNNNNN/XXX
2. Separa nelle due parti intere
3. Scegli il numero opzione (K9 → 9, K29 → 29, ecc.)
4. Costruisci il record: pack(“<II”, part1, part2 + (option << 20))
5. Cifra con ARC2 mode=1, chiave b”Revision\0″
6. Converti i 8 byte in stringa hex maiuscola
7. Aggiungi la riga a SWOPT.DAT

Lo script: cmuopts.py

Ho implementato l’algoritmo completo in Python, è stato piuttosto facile fare entrambe le cose:

  • Generare tutte le chiavi possibili per un serial number dato (comodo quando si configura uno strumento nuovo)
  • Decodificare un file SWOPT.DAT esistente per vedere quali opzioni sono attive

L’output era circa:

pip install pycryptodome
python utils/cmuopts.py
# S/N: 837109/035
#   K  9 - FEEC0364A639F575
#  K 14 - A2AF0325E648F54D
#  K 29 - DE8BC25F5305D1EB
#  ...

Perché funziona (e i suoi limiti)

ARC2 in mode 1 usa una chiave derivata da 8 caratteri ASCII. La forza di questo sistema di licensing non è la sicurezza crittografica, sarebbe facile da rompere con brute force data la struttura nota del record, ma senza conoscere il formato esatto del record e la chiave, non si può nemmeno iniziare a generare chiavi valide.

Il sistema si basa su tre assunzioni:

  1. Il formato del record non è pubblico
  2. La chiave è hardcodata nel firmware e non facilmente intuibile
  3. Senza il serial number completo, non si può verificare se una chiave generata è corretta

Tutti e tre i punti sono stati violati dall’analisi statica del firmware, ma per un utente medio rappresentano una barriera sufficiente.

Avvertenze importanti

  • Backup di SWOPT.DAT: prima di modificare il file, copialo su un supporto rimovibile. Se si perde il file e non si ha più il serial number, le opzioni sono persi per sempre.
  • Serial number completo: servono entrambe le parti (NNNNNN e XXX). Si trova nello schermo Setup → Options oppure digitando TYPE C:\INTERNAL\LOG\IDENTITY.DAT dalla prompt DOS.
  • Zeri iniziali: la parte XXX va letta come numero intero, non come stringa. 035 diventa 35, non 035. In C e Python 2, un numero con zero iniziale è interpretato in ottale — attenzione.
  • File .dat esistente: se lo strumento ha già un SWOPT.DAT funzionante, non sovrascriverlo. Aggiungi solo le nuove righe.

Curiosi?

Se volete provare ad abilitare opzioni aggiuntive per il vostro strumento, ho scritto una pagina web in cui basta inserire il seriale completo e verranno generate tutte le opzioni note.

Se trovate altri indizi su strumenti di famiglie diverse, sarò felice di aggiungerli alla collezione!

Post Disclaimer

Creative common license BY-NC_SA

Informazioni Importanti

Note generali: Le informazioni contenute in questo articolo sono di carattere informativo e rispecchiano le opinioni personali del autore. Tutte le guide nel sito vengono proposte "as it is" puramente a scopo didattico. L'utente che accetta di seguirne i passaggi si assume ogni responsabilità in caso di guasto/malfunzionamento o altro problema come conseguenza della modifica.

Link di affiliazione e contenuti promozionali: Nei post di iu2frl.it posso includere collegamenti a rivenditori. Posso ricevere una piccola commissione dal rivenditore se effettui un acquisto dopo aver fatto clic su uno di questi link. I post non sono espressamente sponsorizzati da rivenditori, editori, promotori o produttori, se non diversamente specificato chiaramente e tutte le decisioni editoriali sono prese esclusivamente dagli autori dei singoli articoli.

Contenuti riguardanti regolamenti e/o normative: Eventuali riferimenti a normative non costituiscono valore legale, si tratta di libere interpretazioni ed estratti di circolari corredate da eventuali commenti, si invitano tutti gli utenti a verificare la veridicità di tali informazioni sugli organi ufficiali di riferimento, nessuna colpa o responsabilità può essere data agli autori degli articoli.

Licenza di utilizzo: Tutti i contenuti vengono condivisi con licenza CC BY-NC-SA 4.0: Questa licenza consente ad altri di remixare, adattare e sviluppare i contenuti in modo non commerciale, purché accreditino l'autore originale e concedano in licenza le loro nuove creazioni con gli stessi termini. Per maggiori informazioni visitare il sito Creative Commons.

Important Informations

General notes: The information contained in this article is of an informative nature and reflects the personal opinions of the author. All the guides/tutorial on the website are offered "as it is" for educational purposes only. The user who agrees to follow the steps assumes all responsibility in case of failure/malfunctioning or other problem as a result of the modification.

Affiliate links and promotional products: In some posts of iu2frl.it I can include links to resellers. I can get a small commission from the reseller if you make a purchase after clicking on one of these links. The posts are not expressly sponsored by resellers, publishers, promoters or producers, unless otherwise clearly specified and all editorial decisions are made solely by the authors of the individual articles.

Contents about rules and laws: Some articles may contain portions or whole laws or rules regarding specific areas, these kind of content are meant to be indicative only, no responsability can be given to the authors. Always refer to official sources when looking for rules or laws.

Contents licenses: All the contents are published as CC BY-NC-SA 4.0: This license lets others remix, adapt, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms.. For more informations please visit Creative Commons website.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *