Newsgroup: it.comp.lang.c
Titolo: Creare patches

Ciao a tutti!
Ho un quesito sul quale vorrei il vostro parere.
Poniamo il caso io desideri sviluppare un sistema di patch per un software
di mia produzione. Poniamo poi il caso che, nel caso voglia far uscire
versioni nuove, non intenda farlo distribuendo il nuovo eseguibile
aggiornato (cosa che ho fatto fino ad ora, visto che i miei programmi non
arrivavamo mai a dimensioni "scomode" da scaricare).
L'idea era creare un programma che applicasse una "patch" (ovviamente
contenuta nel programma stesso) al/ai file(s) del mio software iniziale;
anche perchč talvolta la modifica č una piccola percentuale del totale dei
files da, eventualmente, ridistribuire.
Il punto č: come farlo? Scrivo in Hex nell'eseguibile e modifico stringa
(esadecimale) per stringa? Ma se le modifiche portano ad un "allungamento"
del file? Secondo vuoi, le update di Norton, o di altri software famosi che
si appoggiano alle patch per aggiornare il loro SW, che criterio seguono?
Ciao!!
larss
PS.: So che potrebbe essere una domanda un poco OT, ma visto che il
programma che mi interesserebbe patchare č in C, magari vi viene qualche
idea specificamente dedicata al linguaggio del niusgruppo
--
0110110001100001011100100111001101
1100110111001100110011001100010100
0000011010000110111101110100011011
0101100001011010010110110000101110
011000110110111101101101

larss wrote:
Per patchare i sorgenti ci sono le apposite utiliti (diff e patch della
GNU). Ne esiste anche una versione che lavora con i file binari (su
freshmeat li trovi).
Altrimenti dipende da quali sono le differenze: in genere aggiorni solo
qualche componente, non tutto il programma (il norton aggiorna le
definizioni per i virus e le macro).
Se invece hai un solo eseguibile e vuoi distribuire solo la patch, devi
prendere il vecchio eseguibile, il nuovo, mappare tutte le differenze in un
file e creare un programma che date le differenze ed un indice che spieghi
come trattare il vecchio file e la patch, ricrei il nuovo file.
Non ho idea di quanto questo sia conveniente.
Ti faccio un esempio scemo su una dozzina di bit, con il metodo che ti
dicevo:
                        1
pposizioni:   012345678901
              ------------
V:            001100110000 
N:            011100110110
diff: [111]
Le differenze sono in posizione 1 (memorizzato nella patch in posizione 0) e
nei bit da 9 a 10 (memorizzati nella patch in posizione da 2 a 3).
Con questo indice puoi ricreare il nuovo file partendo dal vecchio e dalle
differenze, copiando dal file indicato la posizione / il range indicata/o
nel nuovo file:
- orig 0
- patch 0
- orig 2->8
- patch 1->2
- orig 11
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 dicevo:
[snip]
Si, č molto vicino all'idea che avevo avuto io.
Perň il punto č, se devo semplicemente sostituire i bit mi sta anche bene.
Ma se il file "nuovo" č piů grande di quello "vecchio"? Temo che, nel caso
anche riuscissi ad "infilare" le parti di codice (binario), lo shifting dei
bit mi faccia saltare tutte le referenze alle chiamate all'interno
dell'eseguibile. Devo farmi una struttura che memoria bit per bit tutti i,
appunto, bit e poi fare l'insert?
Cosě diventa mooolto lunga :)
[Per il programma, mica per me :)]
larss


 appunto, bit e poi fare l'insert?
Non li sostituisci, leggi dal vecchio file nelle posizioni indicate o dalla
patch dalle posizioni indicate dall'indice (tipo quello che ho postato io,
anche se non considerava questa eventualita') e scrivi tutto
sequenzialmente in un nuovo file.
Poi rinomini il file originale in qualcosa come "eseguibile.old" e il nuovo
file appena creato in "eseguibile" (tanto per fare un esempio).
Comunque cerca delle utility per fare diff/patch a livello di file binari e
vedi come si comportano (senz'altro meglio di come posso averti suggerito
io).
Nota: esiste il modo di alterare un file senza cambiarne la dimensione, ma
e' una cosa un po' complicata, richiede di conoscere l'assembly ed esula
completamente dalle tue necessita' :)
