Newsgroup: it.comp.os.dos
Titolo: [BASIC] Suggerimento

Salve, vorrei creare delle righe di codice in qbasic  o gwbasic in modo che
ogni volta che avvio il programma venga visualizzato un numero che indichi
il n. di volte che è stato eseguito. Il valore però voglio che venga
riscritto sul file .Exe. Sapreste dirmi come si fa?

"Jack" <this_a...@is.invalid> ha scritto nel messaggio
news:4n%%d.6456$IN.1...@twister2.libero.it...

Allora:
Hai un eseguibile che ad ogni avvio vuoi che  registri in un contatore le
volte che è stato avviato, però questo contatore lo vuoi all'interno
dell'eseguibile medesimo.
Lo puoi fare se sei in possesso del file sorgente e del programma per
ricompilare il file exe dopo la modifica.
R

Jack ha scritto:

All'inizio di ogni file EXE c'è un header (intesatazione) di 512 byte.
Spesso di questi solo i primi 28 byte sono usati.
A seconda di come è fatto il tuo eseguibile puoi trovare dei byte
utilizzabili per memorizzare un numero. Per esempio all'offset 24 (18H)
trovi due byte che indicano dove comincia la tabella di rilocazione. I
byte compresi fra l'offset  28 (1CH) e questo numero sono liberi.
Un'altra cosa che puoi fare è appendere in fondo al file exe il dato che
ti interessa. Questo però funziona solo se l'eseguibile non ha già dei
dati appesi (cosa più frequente di quanto si pensi).
Per analizzare l'header puoi usare le classiche utility EXEHDR e EXEMOD
della Microsoft, oppure il TDUMP della Borland. Inoltre un buon HEX-editor
è d'obbligo.
Se posti maggiori particolari magari possiamo aiutarti meglio.
Ciao
---
http://www.mariottini.net/roberto/
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Se posti maggiori particolari magari possiamo aiutarti meglio.
Ciao, guarda, l'idea l'ho avuta scaricando un programmino che molti di voi
probabilmente conosceranno. Si chiama MSGDER, ed è un app dos che, ogni
volta che viene lanciata, scrive un nuovo proverbio senza ricorrere a file
esterni.
P.S. Potrebbe essere che usi algoritmi per controllare il CRC?

 anche altre.
  Questo invece lo vedo  piuttosto `macchinoso', considerato anche che
un file nascosto puo` rivelare il "trucco"... Anche se, volendo... ;)
  Dunque. L'idea del  Mariottini non e` malaccio, pero`  la vedo molto
piu` pericolosa: di toccare l'header non me la sentirei proprio.
  Io  invece avevo  fatto una  cosuccia  del genere  (la spiego  molto
sommariamente, almeno per ora):
1) Si crea un  file di `include', ad esempio "OFFSET.H',  con una sola
   definizione tipo questa:
   CONST MIOOFFSET = 10000
2) All'interno  del   sorgente,  il  piu`  possibile   all'inizio,  si
   definisce una stringa  che sia "unica" in tutto il  sorgente, e che
   magari  sia  pure facilmente  riconoscibile  (per  esempio il  nome
   stesso  del programma,  in modo  che chi  vada a  curiosare con  un
   editor non ci faccia troppo caso) seguita da tanti caratteri quanti
   ne servono per memorizzarci i dati che ci interessano. Per esempio,
   se  il file  si chiama  "MIOPROG.EXE" e  ci servono  tre caratteri,
   possiamo scrivere:
   A$ = "MIOPROG.EXExHf"
3) A  questo punto  bisogna  o scriversi  un  programmino di  ricerca,
   oppure cercare con un editor l'esatta posizione  dei tre  caratteri
   all'interno dei  file EXE.  Una volta  trovato, si  scrive l'offset
   trovato nel file "OFFSET.H".
4) Ci si scrive una  piccola  routine di lettura/scrittura  che con un
   semplice GET# su di un file  binario legga o scriva "solo" quei tre
   byte sull'eseguibile. E il giuoco e` fatto.
  Un  pajo  di considerazioni.  La  cosa  e` fattibilissima,  richiede
solamente  un po'  di  precisione. Non  e` eccessivamente  pericolosa,
perche' si riscrivono solo pochissimi  byte, e non l'intero eseguibile
(tra l'altro,  non so  se qualcuno  di voi  ci ha  mai fatto  caso, ma
WordStar  funzionava  esattamente  cosi`, memorizzando  in  se  stesso
alcuni parametri di configurazione...).
  Ovviamente,  deve essere  effettuata *solo*  quando il  programma e`
in  versione  definitiva. Ad  ogni  eventuale  successiva modifica  e`
necessario  aggiornare il  valore  dell'offset. Per  questo e`  meglio
scriversi  un  miniprogrammino  ad  hoc,  anche  per  controllare  che
l'offset definito in MIOOFFSET corrisponda a quello effettivo.
  Dulcis in fundo, ci sarebbe anche  un'altra cosa da fare: ogni volta
che si riscrivono  i dati, sarebbe opportuno modificare  anche la data
del file in  modo che risulti sempre  quella originale... Quest'ultima
cosa e` possibile pero`  con il Basic 6 o 7, che  hanno le routine per
chiamare gli interrupt del DOS...
  In alternativa,  si puo` tentare  lavorando su di un  file nascosto,
pero` deve essere "proprio  proprio" nascosto... Talmente nascosto che
si  faccia fatica  a  vederlo anche  con le  norton,  per dire...  (ma
occorrono cmq sempre le chiamate agli interrupt del DOS...) ;)))
-- 
Cio` che ho scritto, ho scritto.

 P.S. Potrebbe essere che usi algoritmi per controllare il CRC?
Assolutamente no. MSGDER (a carattere) è ora stato modificato in quanto
con XP non è possibile modificare un file correntemente in esecuzione,
cosa invece consentita dal qualunque dos fino a w98.
La cosa è banale, tu dici che di tratta di un EXE? Ok, è vero,
ma oltre l'estesione OGNI file è solo un'accozzaglia di Bytes.
MSGDER aveva una manciata di bytes alla posizione xxxx, era facile
per egli stesso aprire il file in modo binario, incrementare il
contatore, chiudere e via.
Saluti
Claudio 
