Newsgroup: it.comp.os.linux.sys
Titolo: Scrittura file HEX

Giusto per continuare il reverse engineering di un dispositivo.
Io ho due configurazioni di cui conosco perfettamente i valori, sia in formato HEX, sia in formato ASCII, dato che sono salvati in un file di testo.
 
La configurazione è divisa in due file di testo, un file TXT ed un file XML.
 
Poi ho un tool che mi genera un binario concatenando i due file.
 
Avrei bisogno di poter generare tale binario *senza* passare dal tool.
Dispongo anche del file binario "concatenato" ma non sono pratico di queste cose, quindi non saprei come poterlo leggere o scrivere ex-novo, proprio perchè essendo binario, manipolarlo mi risulta difficile.
 
Molto probabilmente ogni valore del file INI originale viene posizionato in una riga ben precisa del binario, il che mi sta bene, tanto devo modificare solo il primo valore e l'XML a fine file.
 
Qualche dritta? Il file finale dovrò generarlo da un applicativo PHP. pack/unpack non mi aiutano.
 
Lo apro in binario con fopen($filename, "rb") e lo leggo con un fread(), ma poi non saprei come convertire i vari caratteri di controllo in qualcosa di ASCII e viceversa passare da ASCII al rispettivo HEX per ricreare il file.

 ricreare il file.
 
Fossi io spacchetterei con unpack i bytes, e ci costruirei sopra la logica
che serve. Non so se si applica al tuo caso.
 
 
Ciao :)

 che serve. Non so se si applica al tuo caso.
 
Il problema è che anche spacchettando, il risultato è sempre un file illeggibile.
 
Se do un banale "strings miofile.bin" vedo correttamente tutte le stringhe esportate del mio ini, e quelle del file XML.
 
Se apro con "vi" in modalità ascii standard, vedo 1 riga per ciascun valore. Le righe vuote le mette con un semplice ^M (che dovrebbe essere un \r\n windows)
 
I valori, però, sono prefissati da caratteri che non riconosco.
Se riuscissi a decifrare tali caratteri, potrei azzardare la creazione di un binario con 1 parametro per riga, prefissato da tali caratteri. Il problema è l'XML, che contiene un sacco di schifezza:
 
Per intenderci (brutale copia-incolla, quindi spacco tutto, ma rende l'idea):
 
^M[ÿÿþ^E^H^@^@ªUUª
ÿÿþ^F   S^A^X^U^@^A^@<8b>ÿÿþ
 
S^B^@^A^@^@^@^C^A^@#<87>ÿÿþ
^KS^B^A^A^@^A^A
^A^@*<99>ÿÿþ
^LS^B^B^@^A^@^@^@^A^@*<8f>ÿÿþ8^MS^B^C^@^@^A^@^@^A.*Ë¿^M-----------------------------
 
 
 
 
I "-----" sono miei, fanno parte del file XML e sono corretti.

 [...]
 
Ewww....
 
 
Così su due piedi ti consiglierei di scriptare un batch di compilazioni, e
vedere se riesci a identificare in modo automatico l'effetto del cambiare
i vari bit di configurazione. Concentrati sul piccolo e cerca di afferrare
il meccanismo.
 
Assumendo che il PHP non sia il tuo tool di preferenza, ti consiglio di
iniziare a giocarci con qualcosa di più agile, e implementarlo 'giusto'
quando hai capito la logica sotto.
 
Uh, e se è un formato diffuso (spero di no :D) valuta la possibilità di
contribuire al bene comune con un tool libero! Do per assunto che tu abbia
già cercato un tool di scasso appropriato...

 Anche esportando un solo valore del file ini originale (che è ciò che voglio fare per motivi che non sto ad indicare), lui genera sempre vagonate di righe vuote. Probabilmente ha una mappatura riga per riga con il file ini in base alla sezione. Se la sezione del file ini è la 99, FORSE (ma non mi pare combacino) la riga nel file binario è la 99, visto che nonostante la mia esportazione sia di 1 singolo valore, il binario finale contiene centinaia di righe vuote
 
Sembra che ci sia una mappatura 1 a 2. Nel file INI originale, la configurazione alla riga 100, corrisponde alla 200 nel file binario.
 
Credo perchè lui si porti dietro il valore di Command e DataMode, raddoppiando quindi le righe. Boh

 già cercato un tool di scasso appropriato...
 
Non è di uso comune, è un dispositivo cinese con firmware cinese, considerata la mia infrastruttura, devo poter aggiornare in remoto tali dispositivi senza però dover passare dal loro tool windows. 
 
Tutta la parte iniziale del binario può rimanere invariata e generata lato windows, ma io devo poter aggiornare il mio XML e generarlo dinamicamente da PHP, senza dover passare da windows ogni volta manualmente.

 Per la configurazione io devo esportare solo e soltanto 1 valore, che anche nel file INI è il primo, ed indica la versione della configurazione stessa.
 
Ho fatto due dump, uno con i soli valori del file ini (esportando sempre e solo l'unico parametro che serve a me), l'altro con ini+XML
 
Come immaginavo, la parte iniziale è in comune, ed è identica.
Il file XML inizia con un 0xFE mentre la componente INI termina con 0xFF
 
In pratica: 0xFF seguito da 0xFE (ed altra rumenta) in caso di XML presente.

 In pratica: 0xFF seguito da 0xFE (ed altra rumenta) in caso di XML presente.
 
In realtà il file XML non viene salvato (convertito in qualche modo) nel binario, ma viene parsato dallo strumento windows. Nel binario vedo solo il "parsato" dell'XML (tant'è che non ho alcuna corrispondenza dei nodi originali, nemmeno cercando le stringhe)
 
A sto punto forse è più semplice smembrare l'exe dello strumento che effettua tale conversione....

 In pratica: 0xFF seguito da 0xFE (ed altra rumenta) in caso di XML presente.
 
FFFE mi suona tanto da UTF-16 BOM. Per caso l'applicativo Windows è in Java?
 
Bye.
 
 

 FFFE mi suona tanto da UTF-16 BOM. Per caso l'applicativo Windows è in Java?
 
No. Credo .net

 effettua tale conversione....
 
Uh... non penso che tu voglia fare reverse-engineering dell'applicazione.
(Gesticolo come uno Jedi) Questi non sono i droidi che stai cercando. 
 
Se ho capito giusto la cosa che vuoi evitare non è tanto il "compilatore"
in se, quanto il dover avere una macchina Windows che ti fa lo
smandruppamento binario. Hai valutato l'idea di usare Wine/Mono per farlo
girare sulla macchina Unix direttamente? Essendo un "compilatore"
probabilmente è solo un data cruncher, senza librerie particolarmente
complicate.
 
Se l'update rate è basso (una volta al minuto, non mi pare altissimo),
forse l'idea di chiamare l'applicativo in fork/exec dal php non darebbe
brutti risultati.

Scusa il quoting, sono da cellulare su Google gruppi causa portatile scarico e alimentatore rotto, non posso ricaricare.
 
Voglio evitare, oltre ad avere una macchina Windows, il dover tenere un dispositivo connesso al programmino per poter ricompilare il file binario.
Lo stupido applicativo prima flasha il dispositivo, poi salva un dump binario.
Se non collego un dispositivo, non posso nemmeno salvare il binario. 
 
Il che mi fa pensare che sia il dispositivo a generare il tutto e l'applicativo scarica solo dalla flash del dispositivo stesso (però non avrebbe senso inviare dati in file XML per poi salvarsi un binario da poter reinviare. Tanto vale inviare sempre l'xml)
 
Il che peggiora solo le cose.
 
Quindi, per complicare il tutto se no non c'è gusto: uno sniffer seriale per Windows che mi permetta di vedere che diavolo comunicano dispositivo e programmino in fase di flash/dump? 
 
Tanto lui con il dispositivo parla, ma per ora con i vari terminali provati son riuscito solo a mettermi in lettura su una pseudo console e se io ho la COM aperta, l'applicativo non riesce più a collegarsi. O io o lui. Invece mi piacerebbe fare una bella orgia: io, lui, dispositivo, terminale. Tutti felici a vedere chi scrive cosa, dove è quando.

 Il che mi fa pensare che sia il dispositivo a generare il tutto e 
l'applicativo scarica solo dalla flash del dispositivo stesso (però non avrebbe 
senso inviare dati in file XML per poi salvarsi un binario da poter reinviare.. 


 e programmino in fase di flash/dump? 
 
Uh... chissà se Wireshark per Windows supporta lo sniffing seriale. Sotto
Linux vedo che ci sono le porte USB come sniffabili, ma non ho mai provato
a farlo. Sotto Windows... non ho Windows. :D

 a farlo. Sotto Windows... non ho Windows. :D
 
Il top sarebbe sniffare sotto Linux una seriale usata da Windows (dato che sto eseguendo Windows tramite VirtualBox).
 
Adesso provo.

 Uh... chissà se Wireshark per Windows supporta lo sniffing seriale.
 
Lo supporta. Intercetta un mare di porcherie che non riesco a decifrare e dubito abbiano una qualche utilità, sono raffiche di esadecimali (forse uso male wireshark)


saranno i byte del .bin, inframezzati da byte di comando, CRC, lunghezza del pacchetto, ecc.
Tra l'altro come e' configurata la seriale? RTS/CTS, DTR/DSR, XON/XOFF ?
 
Ciao Jack

 Tra l'altro come e' configurata la seriale? RTS/CTS, DTR/DSR, XON/XOFF ?
 
115200/8-N-1, altro non so.