Conversione numero in base 24

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Conversione numero in base 24

Messaggio da joe »

Probabilmente mi sto perdendo in un bicchier d'acqua, ma sospetto che la soluzione non sia così immediata perchè ho scandagliato google per diverso tempo.

Problema:

Convertire in base 24 il seguente numero esadecimale...

7300790053005C0074006F006F0052

Se usassi "bc":

Codice: Seleziona tutto

$ echo "obase=24; ibase=16; ${HEX_NUMB}" |bc
otterrei il seguente numero:

Codice: Seleziona tutto

1815162314170019121810100912061204080604051213010018
Però in realtà quello non è in base 24 come ci si attenderebbe, ma in una notazione base24 particolare che impiega dei decimali o giù di lì... insomma da quanto ho capito io, bc ha qualche limitazione se deve rendere i numeri in output in base maggiore di 16.
Pertanto mi chiedo cosa potrei utilizzare per convertire l'esadecimale in input, nel corrispondente base-24.

Va bene anche se fosse necessario fare due passaggi, tipo passare prima dal binario e poi al base24.
Per il base64 c'è per esempio il comando omonimo.... ma per base24 non ho trovato nulla di pronto.

Vorrei anche evitare di dover scrivere qualcosa io di troppo elaborato, speravo vi fosse un programmello da linea di comando o anche una serie di comandi da utilizzare insieme con pipe o cose del genere...
Ne sapete più di me? (ci vuole davvero poco... ;) ).

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6566
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Conversione numero in base 24

Messaggio da targzeta »

In realtà il numero tirato fuori da bc è corretto (non poteva essere altrimenti) però tu cosa ti aspettavi? Lui non sa rappresentare i numeri nella base24, cioé, dopo il 9 che ci deve mettere?

Questo comando ti mostra il numero tirato fuori da bc a pezzetti (il primo tirato fuori è l'ultimo di bc e così via):

Codice: Seleziona tutto

base=24; num=$(echo "obase=10; ibase=26; 7300790053005C0074006F006F0052" | bc); while (( $num != 0 ));do rest=$(echo ${num}%${base} | bc); echo $rest; num=$(echo ${num}/${base} | bc); done
però come vanno scritti i numeri dal 10 al 23 lo sai solo tu. Qualcosa tipo dalla A-N o giù di lì?

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

hashbang
Packager
Packager
Messaggi: 2000
Iscritto il: ven 4 giu 2010, 10:27
Nome Cognome: Luca De Pandis
Distribuzione: macOS | OpenBSD

Re: Conversione numero in base 24

Messaggio da hashbang »

joe ha scritto:Pertanto mi chiedo cosa potrei utilizzare per convertire l'esadecimale in input, nel corrispondente base-24.
Usare ruby?
Il metodo to_s() della classe Integer è nativamente in grado di effettuare conversioni fino alla base 36.

Codice: Seleziona tutto

$ ruby -e 'puts "7300790053005C0074006F006F0052".to_i(16).to_s(24)'

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Re: Conversione numero in base 24

Messaggio da joe »

Inizio con il problema sollevato da targzeta:
  • Base-24 di fatto significa notazione posizionale in cui i numeri sono composti da 24 simboli.
    A questa definizione però non si accompagna una convenzione che stabilisce univocamente quali sono questi simboli.
Quello è il punto. Personalmente lo ignoravo e davo per scontato che vi fosse una notazione base24 standardizzata composta da 24 simboli:
- cifre numeriche da 0 a 9
- lettere dell'alfabeto inglese da A ad N
In pratica quello che davo per scontato era:
  • Base-24 = 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N
Per quanto riguarda bc dunque, leggendo anche dal man, si evince che il numero ottenuto è composto da delle coppie di cifre: ciascuna copia indica la posizione del simbolo della notazione base24 definita da noi, facciamo un esempio:

Codice: Seleziona tutto

MAP24=0123456789ABCDEFGHIJKLMN
HEX = 7300790053005C0074006F006F0052
BC 24 = 18 15 16 23 14 17 00 19 12 18 10 10 09 12 06 12 04 08 06 04 05 12 13 01 00 18
BASE-24 = IFGNEH0JCIAA9C6C48645CD10I
Imponiamo intanto una mappatura dei simboli che andranno a formare la notazione base24 definita da MAP24.

Il numero esadecimale HEX di partenza viene convertito in base24 col comando:

Codice: Seleziona tutto

echo "obase=24; ibase=16; $HEX" | bc |tr -d '\\' |tr -d '\n'
Si ottiene così il secondo numero che ho indicato come "BC 24", ovvero il base 24 nella notazione a coppie decimali ottenuta con bc.

Per passare al numero finale convertito nella base24 definita da MAP24, basta leggere le coppie numeriche di "BC 24" e ad ognuna sostituirvi il simbolo in posizione corrispondente pescato da MAP24.
Ad esempio la prima coppia numerica di "BC 24" è "18".
Pertanto il primo simbolo del numero finale base24 sarà il 18esimo della notazione MAP24: ovvero "I" di Imola.
La seconda coppia è "15", pertanto il secondo simbolo sarà il 15-esimo di MAP24 cioè F.
E così via.

In pratica è come se il numero ritornato da bc sia il cifrato del nostro base24 finale e per appunto decifrarlo è sufficiente definire "l'alfabeto" che ci interessa.

Alla fine capita questa cosa ho condensato il tutto in uno script bash:

Codice: Seleziona tutto

#!/bin/sh
                                                                                                                                                                                                             
MAP24=0123456789ABCDEFGHIJKLMN
HEX=$1
B24=$(echo "obase=24;ibase=16;$HEX" |bc |tr -d '\\' |tr -d '\n')
for i in $B24
do
        i=$(echo $i|bc)
        echo $i ${MAP24:$i:1}
        OUT24=${OUT24}${MAP24:$i:1}
done
echo
echo HEX = $HEX
echo BC 24 = $B24
echo BASE-24 = $OUT24

Facciamo una prova:

Codice: Seleziona tutto

$ b24.sh 7300790053005C0074006F006F0052
18 I
15 F
16 G
23 N
14 E
17 H
0 0
19 J
12 C
18 I
10 A
10 A
9 9
12 C
6 6
12 C
4 4
8 8
6 6
4 4
5 5
12 C
13 D
1 1
0 0
18 I

HEX = 7300790053005C0074006F006F0052
BC 24 = 18 15 16 23 14 17 00 19 12 18 10 10 09 12 06 12 04 08 06 04 05
12 13 01 00 18
BASE-24 = IFGNEH0JCIAA9C6C48645CD10I
Quindi alla fine tutto piuttosto semplice anche in bash col vantaggio che possiamo definire la notazione base24 che ci serve.
In ogni cso il comando in ruby precotto fornito da "hashbang"dimostra che in effetti una notazione base24 predefinita più standard di altre esiste. Tanto che il comando proposto da lui ritorna il risultato ottenuto anche da me con lo script, minuscole a parte:

Codice: Seleziona tutto

$ ruby -e 'puts "7300790053005C0074006F006F0052".to_i(16).to_s(24)'
ifgneh0jciaa9c6c48645cd10i
E questo è utile anche come verifica che il procedimento è effettivamente valido.
Vi proporrei una questione a cui questa conversione si può applicare, ma prima chiudo questo post perchè già lungo.
Scrivo in un nuovo messaggio.

hashbang
Packager
Packager
Messaggi: 2000
Iscritto il: ven 4 giu 2010, 10:27
Nome Cognome: Luca De Pandis
Distribuzione: macOS | OpenBSD

Re: Conversione numero in base 24

Messaggio da hashbang »

joe ha scritto:Tanto che il comando proposto da lui ritorna il risultato ottenuto anche da me con lo script, minuscole a parte:

Codice: Seleziona tutto

$ ruby -e 'puts "7300790053005C0074006F006F0052".to_i(16).to_s(24)'
ifgneh0jciaa9c6c48645cd10i
E questo è utile anche come verifica che il procedimento è effettivamente valido.
Se vuoi usare il comando di ruby come metodo di controllo, magari con l'uso di test(1) per il confronto tra stringhe, basta chiamare il metodo upcase() per mettere tutto in maiuscolo.

Codice: Seleziona tutto

$ ruby -e 'puts "7300790053005C0074006F006F0052".to_i(16).to_s(24).upcase'
In questo modo dovresti avere due righe perfettamente identiche.

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Re: Conversione numero in base 24

Messaggio da joe »

Buono a sapersi. Grazie, dopo tanto cercare è il comando più semplice che abbia trovato.

Tutta sta cosa è abbastanza inutile, ma a qualcuno potrebbe anche servire.
Allora, a questa pagina si chiedevano come ottenere la sigla con qui il proprio sistema a finestre di qualche anno fa fosse stato attivato. Niente di fuori legge.

Offtopic: A me ha incuriosito la cosa, perchè a volte mi è capitato che amici mi portassero un PC con sistemi attivati senza però l'adesivo.
Per esempio spesso danno insieme al pc un CD con la versione upgrade di un nuovo sistema, l'utente fà l'upgrade, attiva col codice appiccicato all'adesivo e poi puntualmente perde CD e adesivo. Poi quando deve reinstallare da zero non ha più il codice di attivazione...
Problemi che sul pinguino non abbiamo per fortuna! :D
Ebbene se il sistema si avvia ci sono strumenti software precotti che trovano il codice con cui si è attivato il prodotto.
Ma se il sistema non si avvia e possiamo collegare il disco al nostro PC con linux, ecco che si potrebbe reperire lo stesso codice seguendo la procedura anche dal pinguino.
Bisogna aggiungere che spesso specie su portatili ma anche su PC fissi di marca, abbiamo a che fare con sistemi preinstallati e preattivati di fabbrica. In questi casi il codice usato per la preattivazione non coincide con quello dell'adesivo appiccicato al PC e non funzionerebbe per attivare manualmente un sistema reinstallato pulito


Tornando in topic, mi sa che il tizio, commetta un errore, o sono io che non ho capito qualcosa:
In Hex, it's a 30 digit number: A2 23 51 D0 2A 38 5D 22 C4 41 6B 87 43 C1 00

In Binary, a 120 digit number: 10100010 00100011 ... 11000001 00000000

Converted to base 24: 751AA001EHCCLAB3JH8KDIGAG

Mapped to Microsoft's custom base24 alphabet "BCDFGHJKMPQRTVWXY2346789" and a hyphen every 5 chars:

KHCQQ-BBCW2-TT7QR-F42M6-V3YQY
Se prendiamo il numero esadecimale sopra, togliamo gli spazi e convertiamo in base24 "standard":

Codice: Seleziona tutto

$ ruby -e 'puts "A22351D02A385D22C4416B8743C100".to_i(16).to_s(24).upcase'
12751AA001EHCCLAB3JH8KDIGAG
Confermato anche dal mio script:

Codice: Seleziona tutto

HEX = A22351D02A385D22C4416B8743C100
BC 24 = 01 02 07 05 01 10 10 00 00 01 14 17 12 12 21 10 11 03 19 17 08 20 13 18 16 10 16
BASE-24 = 12751AA001EHCCLAB3JH8KDIGAG
Al tizio invece risulta:

Codice: Seleziona tutto

Converted to base 24: 751AA001EHCCLAB3JH8KDIGAG
Cioè si mangia le prime 2 cifre (12).
È un errore grossolano secondo voi o ha un qualche senso?

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Re: Conversione numero in base 24

Messaggio da joe »

Sono abbastanza convinto che sia un errore grossolano.
Sono anche convinto che il metodo descritto faccia acqua e non porti al risultato sperato, almeno nel mio caso.
Oppure posso aver anche sbagliato io qualcosa, ma direi di aver seguito il metodo descritto.

Ricordo, per riprendere il post precedente che l'obbiettivo era:
  1. Vogliamo/dobbiamo lavorare dal nostro sistema Linux
  2. Abbiamo un sistema windows XP installato su un PC, non necessariamente il PC in uso, ma ovviamente dobbiamo avere accesso almeno al disco che ospita l'installazione di xp
  3. Si vuole determinare il Product Key di quel sistema
I. Background:
Il prooduct key è il seriale di 25 caratteri alfanumerici riportato sull'adesivo COA, quello che si deve inserire per attivare il prodotto. Se il sistema è preinstallato di fabbrica dalla casa produttrice "Royalty OEM". Allora il product key con qui risulta attivato il sistema (e che determineremo con la procedura in oggetto) non coinciderà con quello dell'adesivo e non si potrà utilizzare per eventuale attivazione manuale.

Dove si trova il prductkey all'interno del sistema operativo XP:
Si trova in formato codificato in una voce del registro:

Codice: Seleziona tutto

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId
Se lavorassimo in windows avremmo vari tool per accedervi e decifrarlo automaticamente vedi i vari EKeyfinder ecc ecc.
Ma noi vogliamo lavorare da linux e quei tool non ci servono.

Che cos'è "HKLM\SOFTWARE"?
Ok è una sottodir del registro, ma è anche fortunatamente un banale file. Quale di preciso?
Se abbiamo montato la partizione di XP in /mnt/tmp

Codice: Seleziona tutto

/mnt/tmp/WINDOWS/system32/config/software
Che roba è, che tipo di file?

Codice: Seleziona tutto

/mnt/tmp/WINDOWS/system32/config/software:         MS Windows registry file, NT/2000 or above
II. Procedura

Codice: Seleziona tutto

$ cp /mnt/tmp/WINDOWS/system32/config/software .
$ chntpw -l software
chntpw version 0.99.6 110511 , (c) Petter N Hagen
Hive <software> name (from header): <emRoot\System32\Config\SOFTWARE>
ROOT KEY at offset: 0x001020 * Subkey indexing type is: 686c <lh>
File size 33554432 [2000000] bytes, containing 7571 pages (+ 1 headerpage)
Used for data: 584839/32933192 blocks/bytes, unused: 5487/223320 blocks/bytes.

Simple registry editor. ? for help.

> dpi Microsoft\Windows NT\CurrentVersion\DigitalProductId
Value <Microsoft\Windows NT\CurrentVersion\DigitalProductId> of type REG_BINARY, data length 164 [0xa4]

Decoded product ID: [PXQ**********************]

> q
$
Banalmente la riga di nostro interesse è:
Decoded product ID: [PXQ**********************]
Nel mio caso ho verificato leggendo il COA sul cassone ed effettivamente è proprio lo stesso.

Se cercate in rete "come ottenere il il product key di xp da linux"... Saltano fuori una marea di risposte che esortano ad usare BootCD particolari e spessissimo risposte ridicole del tipo: leggilo sull'adesivo.
Cose del genere capitano quando si ha a che fare con software chiuso e con licenze a dir poco pittoresche.
Però purtroppo si può avere a che fare con una situazione del genere, come dicevo ad esempio capita il tizio con sistema installato PC non avviabile CD perso e adesivo sul CD pure: niente paura un boot cd linux con chntpw e via product key ritrovata e reinstallazione/attivazione possibile.

A me di tutto ciò non è che poi interessasse troppo. Ero solo curioso di trovare il mio product key in modo più laborioso più che altro per sfida.
E comunque si può fare anche se ha poco senso, infatti chntpw puà stamparci il contenuto codificato della voce "Microsoft\Windows NT\CurrentVersion\DigitalProductId".
Il contenuto appare come quando si accede ad un binario con hexedit o hexdump.
Si tratta di capire dove sono posizionate le cifre corrispondenti al product key. Ci si può arrivare penso perchè quel file è piccolo, sono 10 righe di numeri esadecimali didposti su 6 colonne.

Penso che non ci siano dubbi sul fatto che il tutto sia perfettamente legale.
Vi aggiornerò nel caso riuscissi a decodificare quella roba.
Alla prossima.

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Re: Conversione numero in base 24

Messaggio da joe »

Ho fatto confusione io, ho interpretato male il post del tizio cui ho fatto riferimento.

In pratica il procedimento è i seguente:

  1. Prendo il file registro WINDOWS/system32/config/software
  2. Ne estraggo il contenuto della chiave di registro HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId
  3. Leggo questa roba in formato esadecimale.
  4. Ne estraggo 15 bytes a partire dall'offset "0x34 - 0x42" (sono numeri esadecimali e corrispondono ai bytes da 52 a 66 incluso).
  5. Ottengo un numero esadecimale costituito da 15 coppie di cifre separate da spazio
  6. Inverto il numero senza però invertire le single coppie: AB CD EF diventerebbe EF CD AB per capirci
  7. Questo è l'esadecimale a cui togliere gli spazi per poi convertirlo in base24 con bc: otterrò il formato base24 costituito da coppie di decimali (il formato base24 che ci ritorna bc di cui abbiamo parlato prima)
  8. A questo punto bisogna decodificare questo numero usando come chiave la notazione base24 di casa redmond: "BCDFGHJKMPQRTVWXY2346789"
  9. Quello che ne uscirà sarà il product key cercato
[/i]

Il tizio che indica questa procedura a link sopra, omette l'inversione del punto (6) e inoltre aggiunge la conversione da esadecimale a base24 in notazione "standard"... cosa che non serve a nulla in questo caso e che per di più è anche ceffata perchè si mangia le prime due cifre... sarà una svista, ad ogni modo è un passaggio inutile.
Quello che invece sbagliavo io era prendere l'offset iniziale 0x34 direttamente dal file "software" cioè dal file di registro intero piuttosto che dalla chiave di registro "DigitalProductId".

E d'altra parte non ho trovato un metodo per estrarre in un colpo solo il contenuto di quella chiave in formato binario su un file, per poi passarlo ad hexdump ed estrarre solo i bytes che interessano.
In altre parole i punti (2) e (3) restano da fare interattivamente...

Ad ogni modo quello che mi premeva era capire il meccanismo.
Certo sarebbe carino fare uno script bash o giù di lì che trovi la nostra Product key, Ma considerate le utility già bell'eppronte... Vedremo insomma.
Per fare una cosa del genere a me manca ancora qualche tassello, soprattutto per fare in modo non interattivo alcune operazioni... Magari vi rompo le scatole prossimamente! :D

Rispondi