Newsgroup: it.comp.programmare.win32
Titolo: Come posso accorgermi se un programma è stato modificato ?

Buongiorno a tutti,
sto cercando di analizzare/risolvere un problema, ma come lo giro e lo
rigiro non riesco a trovare una soluzione soddisfacente.
Dunque io ho creato un programma (exe) che carica diverse librerie (dll) per
poter funzionare; ogni specifica librerie assolve dei compiti determinati.
Io quindi distribuisco il pacchetto completo; però qualche volta ad alcune
persone consegno anche i sorgenti delle librerie per poter consentire loro
di fare delle modifiche.
A questo punto però vorrei gestire un automatismo nell'eseguibile che carica
le DLL che si accorge che la determinata dll è stata modificata e non è più
quella fornita in origine. In questo modo posso gestire un avvertimento
visibile che informa della modifica.
Questo deve avvenire anche contro la volonta di chi ha modificato la
libreria; questo per spiegare che non posso dire al cliente di aggiungere
una risorsa nella DLL perché potrebbe non farlo.
Se è indicativo, utilizzo Visual C++ 6.0 con MFC.
Accetto qualsiasi suggerimento.
Porlock

 [...]
Questa e' l'unica possibilita' che mi viene in mente:
All'avvio dell'eseguibile, potresti calcolare una checksum delle DLL e
confrontarlo con le checksum calcolate dalla tua versione delle DLL.
Qualsiasi ricompilazione, con o senza modifiche, o anche il cambio di
una risorsa della DLL da editor, altererebbe il checksum e quindi ti
permetterebbe di sapere se il file e' stato modificato.
Questo metodo e' complicato solo se cerchi di applicarlo all'eseguibile
per un controllo sull'eseguibile stesso.
Saluti
Luca

di fare delle modifiche.
beh, potresti fare un sistema per marchiare le routine .. non so...
una fantomatica funzione esportata che in realtà non esiste.
e quindi che il compilatore in fase di creazione di una dll non
inserirà mai nella export table
qualunque sia la soluzione che sceglierai.. la firma della dll dovrà
avvenire esernamente all'ambiente di sviluppo, in modo che il
compiltore non la possa riprodurre..
ti consiglio quindi di studiare il formato eseguibile di windows (PE)
... trovi info su 
http://www.wotsit.org
 oppure sul sito di ms
ciao
Antonio

 Antonio
Mi sono stampanto da MSND tutto il topic sul PE, inizierò a studiarlo !
Grazie
Porlock.

 Luca
Questa è una possibilità che sto valutando. Provo a chiederti un'altra cosa,
se io compilo due volte un progetto in Visual C++ senza aver effettuato
modifiche e confronti i due compilati (nel mio caso sono due dll) mi trovo
che differiscono solo in 2 byte (ho eseguito la verifica con il comando DOS
fc /B). Sai per caso che tipo di dati potrebbero essere (ad esempio una
data)  ?
Grazie
Porlock.

 Porlock.
Non l'avevo mai notato, comunque ho fatto delle prove anch'io e anche a
me cambia.
Mi sembra di vedere, comunque, che quei due bytes (che dovresti avere
trovato agli indirizzi 0xf0 e 0xf1 del file) siano la prima meta' di un
time_t che indica quando il file e' stato compilato (almeno io ho preso
i quattro bytes a partire da 0xF0 e provando a leggerli come time_t ho
trovato la data e l'orario preciso della compilazione).
Questo potrebbe esserti ancora piu' di aiuto, se guardi 4 bytes invece
del file completo, o potresti semplicemente ignorarli nel calcolo della
checksum.
Ciao
Luca