Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - programma in C per leggere/scrivere binary files
Forum - C/C++ - programma in C per leggere/scrivere binary files

Avatar
danrevella (Normal User)
Newbie


Messaggi: 7
Iscritto: 05/04/2008

Segnala al moderatore
Postato alle 18:21
Sabato, 05/04/2008
Buona giornata a tutti!!
Una doverosa premessa: ho qualche minima nozione di programmazione, ma risale a quasi 30 (purtroppo è vero... :-(() anni fa..... quindi perdonatemi...
Che cosa dovrebbe fare il mio programma?
>myprog /?
Sintassi myprog nome_file indirizzo_iniziale indirizzo_finale chiave
Ovvero il programma prende un file .bin oppure exe e a partire dall'indirizzo_iniziale all' indirizzo finale (valori espressi in esadecimale della posizione assoluta del file) effetua uno xor utilizzando il valore "chiave" (sempre in esadecimale) che è stato fornito dalla linea di comando.
si supponga un file binario lungo 13 bytes così strutturato:
prova.bin
0000: 3e f2 00 00 00 00 00 00 00 10 00 00 00
dopo l'esecuzione diventa:
>myprog prova.bin 000a 000c 3e
prova.bin
0000: 3e f2 00 00 00 00 00 00 00 10 3e 3e 3e
Il programma vorrei farlo in C (non C++) nel modo piu' semplice e banale possibile, mi è sufficiente che giri sotto xp da linea di comando, e se il farlo in dos significa che posso utilizzare ad es. il Turbo C 2.01 della Borland con il buon vecchio Turbo debugger, evitando dei template piuttosto complicati, forse sarebbe l'ideale.
Se invece avete altri software (freeware per favore....) da consigliarmi, vi ringrzio, tenete però presente che per me sarebbe fondamentale comunque poter usufruire di uno strumento di debugging come Turbo debugger che linea dopo linea mi faccia vedere e capire come procedere.
Ho cercato di documentarmi un po': ho capito che per leggere un file in modo binario si devono utilizzare fread, fwrite, e nel mio caso forse è utile fseek; inoltre ho provato (senza successo) a capire come funziona il passaggio dei parametri da linea di comando.....
Per favore, se avete qualche piccolo template per aiutarmi, io poi farò tutte le prove e sperimentazioni possibili, vorrei usare questo programma come stimolo e come trampolino di lancio per tornare a fare un po' di programmazione, ma da solo non ce la faccio proprio...

Grazie a chiunque vorrà darmi una mano.

Danrevella

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 12:10
Lunedì, 07/04/2008
Prima di darti una mano sul codice, e' bene che tu sappia che non e' possibile piu' utilizzare gli strumenti di sviluppo di cui parli, per una questione di efficienza e di obsolescenza (sono veramente troppo vecchi ...).

Scarica una versione Express di Visual Studio (magari non l'ultimissima 2008 ma basta la 2005) e utilizzala ... al limite (forse e' piu' semplice) scarica DevC++.

PM Quote
Avatar
danrevella (Normal User)
Newbie


Messaggi: 7
Iscritto: 05/04/2008

Segnala al moderatore
Postato alle 15:38
Lunedì, 07/04/2008
Salve!!!
Sto utilizzando ( e mi pare che funzioni bene) con soddisfazione LCC-Win32 e tenuto conto che la mia è un'applicazione "win32-console" mi pare che vada benissimo.
Potrei inviare qui il sorgente del programma?
Preciso che ancora non funziona...... :d

Grazie!!

Danrevella

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:11
Lunedì, 07/04/2008
Ciao...
allora il codice qui lo puoi postare per provare a chiedere a qualcuno di correggertelo se invece vuoi postarlo per metterlo a disposizione di tutti dovresti essere un member e per avere questo grado devi sostenere un piccolo esame...
per quanto riguarda l'IDE da usare nonostante non abbia mai provato il tuo io consiglio dev-C++ che è molto buono (penso uno tra i migliori con turbo C )...

PM Quote
Avatar
danrevella (Normal User)
Newbie


Messaggi: 7
Iscritto: 05/04/2008

Segnala al moderatore
Postato alle 18:28
Lunedì, 07/04/2008
Grazie, alora posterò qui il codice non appena lo avrò messo un po' a posto......
Se qualcuno che sia membro poi volesse riciclarlo per metterlo a disposizione di tutti, io ne sarei felice, anche se non credo proprio che ciò possa avvenire: io programmavo circa 30 anni fa, ora non mi ricordo piu' nulla.....:d:d:d
A risentirci domani o dopodomani con il codice del programma.

Danrevella

PM Quote
Avatar
danrevella (Normal User)
Newbie


Messaggi: 7
Iscritto: 05/04/2008

Segnala al moderatore
Postato alle 21:11
Martedì, 08/04/2008
Buona serata a tutti!!!
Posto qui di seguito il codice del programma, che SEMBREREBBE funzionare, ma in realtà nella routine che esegue lo xoring di un byte alla volta, qualcosa non funziona, ma io non riesco proprio a capire cosa sia...:d:d:d
Il programma è stato debuggato e compilato con LCC-win32 che ho trovato davvero stupendo: leggerissimo, efficiente e molto vicino al buon vecchio Turbo debugger per dos
Ovviamente il programma è penoso, malfatto e con buona probabilità infrange innumerevoli regole di programmazione, e forse anche nelle parti in cui funziona, è solo per una fortunata coincidenza....
Perdonatemi ed aiutatemi, vi prego...:):)
Codice sorgente - presumibilmente Delphi

  1. //xora.exe  05/04/2008
  2. //programma in C per leggere/scrivere binary files
  3. //Uso: xora.exe input_file indirizzo_iniziale indirizzo_finale chiave
  4. //Ovvero il programma prende un file .bin oppure exe e a partire dall'indirizzo_iniziale
  5. //all' indirizzo finale (valori espressi in esadecimale della posizione assoluta del file)
  6. //effettua uno xor utilizzando il valore "chiave" (sempre in esadecimale)
  7. //che è stato fornito dalla linea di comando.
  8. // Il programma accetta un massimo di 4 parametri,
  9. // di cui il primo deve essere il file binario da elaborare,
  10. // il secondo deve essere l'indirizzo iniziale in HEX
  11. // il terzo l'indirizzo finale in HEX
  12. // il quarto il valore da usare per lo XOR in HEX
  13. //si supponga un file binario lungo 13 bytes così strutturato:
  14. //prova.bin
  15. //0000: 3e f2 00 00 00 00 00 00 00 10 00 00 00
  16. //>xora.exe prova.bin 000a 000c 3e prova2.bin
  17. //prova2.bin dopo l'esecuzione
  18. //0000: 3e f2 00 00 00 00 00 00 00 10 3e 3e 3e
  19.  
  20.  
  21.  
  22. /* --- The following code comes from d:\lcc\lib\wizard\textmode.tpl. */
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. void Usage(char *programName)
  27. {
  28.         fprintf(stderr,"%s usage:\n",programName);
  29.         /* Modify here to add your usage message when the program is
  30.          * called without arguments */
  31. }
  32.  
  33. /* returns the index of the first argument that is not an option; i.e.
  34.    does not start with a dash or a slash
  35. */
  36. int HandleOptions(int argc,char *argv[])
  37. {
  38.         int i,firstnonoption=0;
  39.  
  40.         for (i=1; i< argc;i++) {
  41.                 if (argv[i][0] == '/' || argv[i][0] == '-') {
  42.                         switch (argv[i][1]) {
  43.                                 /* An argument -? means help is requested */
  44.                                 case '?':
  45.                                         Usage(argv[0]);
  46.                                         break;
  47.                                 case 'h':
  48.                                 case 'H':
  49.                                         if (!stricmp(argv[i]+1,"help")) {
  50.                                                 Usage(argv[0]);
  51.                                                 break;
  52.                                         }
  53.                                         /* If the option -h means anything else
  54.                                          * in your application add code here
  55.                                          * Note: this falls through to the default
  56.                                          * to print an "unknow option" message
  57.                                         */
  58.                                 /* add your option switches here */
  59.                                 default:
  60.                                         fprintf(stderr,"unknown option %s\n",argv[i]);
  61.                                         break;
  62.                         }
  63.                 }
  64.                 else {
  65.                         firstnonoption = i;
  66.                         break;
  67.                 }
  68.         }
  69.         return firstnonoption;
  70. }
  71.  
  72. int main(int argc,char *argv[])
  73. {
  74.         if (argc == 1) {
  75.                 /* If no arguments we call the Usage routine and exit */
  76.                 Usage(argv[0]);
  77.                 return 1;
  78.         }
  79.         /* handle the program options */
  80.         HandleOptions(argc,argv);
  81.         /* The code of your application goes here */
  82. //Da qui inizio io: prima tutto il lavoro lo ha fatto LCC_win32
  83.  
  84.  
  85. //#include <stdio.h>
  86. //int main(int argc, char **argv);
  87. {
  88.     // Verifica che il numero di parametri sia corretto.
  89.     if( argc != 5 ) {
  90.         printf("Errato numero di parametri!\n");
  91.         printf("Uso:xora.exe input_file indirizzo_iniziale indirizzo_finale chiave\n");
  92.                 printf("valori i esadecimale\n");
  93.                 system ("pause");
  94.         return 1;
  95.  
  96.                   }
  97.     //Assegna alle variabili i dati provenienti dalla linea di comando
  98.         //Lo scopo è quello di ottenere i valori decimali che da command line vengono dati in hex
  99.     char *stopstring;// questo puntatore serve per strtol per convertire da esadecimale
  100.  
  101.     char *input_file;
  102.     input_file=argv[1];
  103.  
  104.         char *indirizzo_iniziale;
  105.         indirizzo_iniziale=argv[2];
  106.         long indirizzo_inizialeD; //valore in decimale
  107.         indirizzo_inizialeD=strtol(indirizzo_iniziale,&stopstring,16);
  108.  
  109.  
  110.     char *indirizzo_finale;
  111.         indirizzo_finale=argv[3];
  112.     long indirizzo_finaleD; //valore in decimale
  113.         indirizzo_finaleD=strtol(indirizzo_finale,&stopstring,16);
  114.  
  115.  
  116.     char *chiave;
  117.         chiave=argv[4];
  118.         int chiaveDL; //valore in decimale ma qui è un LongINT mentre serve un INT per lo xor successivo
  119.     chiaveDL=strtol(chiave,&stopstring,16);
  120.         int chiaveD= (int)chiaveDL;
  121.  
  122.         //qui richiamo la command line per copiare il file "original" in "original.ori"
  123.         //in quanto poi tutte le operazioni vengono effettuate sul file "original" e se
  124.         //qualcosa dovesse andare storto possiamo sempre ripartire dal file .ori
  125.         char comando_dos[100]="copy ";
  126.         strcat(comando_dos,input_file);
  127.         strcat(comando_dos," ");
  128.         strcat(comando_dos,input_file);
  129.         strcat(comando_dos,".ori");
  130.  
  131.         system (comando_dos);
  132.  
  133.  
  134.  
  135.     FILE *fp_input_file;
  136.  
  137.     // Apre il file di input in modalità "binaria a lettura/scrittura su file già esistente".
  138.     fp_input_file = fopen(input_file, "r+b");
  139.     if( fp_input_file == NULL ) {
  140.         printf("Il file %s specificato come input non esiste!\n",input_file);
  141.         return 2;
  142.                                                         }
  143.  
  144.  
  145.         //Adesso a partire da indirizzo_iniziale e sino ad "indirizzo_iniziale" si legge un byte, o forse
  146.         //dovrei dire meglio un carattere ascii alla volta, si esegue uno xor e poi lo si riscrive xorato
  147.  
  148.         long byte_seek=0;
  149.  
  150.         //for (i=1; i< argc;i++) {
  151.         //qui casca l'asino: mentre utilizzando un editor esadecimale il byte seek 0 sarebbe il primo byte
  152.     //ossia: nel file ci sono ad es. 13 bytes numerati da 0 a 12(hview..), qui l'accesso avviene invece
  153.         //con i bytes numerati da 1 a 13..... insomma sempre 13 bytes sono, ma se non si sta attenti
  154.         //si corre il rischio di xorare quelli sbagliati....
  155.         for (byte_seek=(indirizzo_inizialeD); byte_seek<(indirizzo_finaleD+1); byte_seek++) {
  156.         fseek(fp_input_file,byte_seek,SEEK_SET);
  157.         if( fseek == NULL ) {
  158.         printf("Seek non riuscito sul file %s specificato come input!\n",input_file);
  159.         return 3;
  160.                                                         }
  161.  
  162.  
  163.     char leggi_char[1];
  164.     int scrivi_char;
  165.     char scrivi_xor_char;
  166.         fread  (leggi_char,1,1,fp_input_file);
  167.  
  168.         fseek(fp_input_file,byte_seek,SEEK_SET);//dopo ogni operazione di read o write serve una nuova seek
  169.  
  170.         scrivi_char=atoi(leggi_char);
  171.         scrivi_char=(scrivi_char ^ chiaveD);//operazione di xor eseguita tra due interi
  172.  
  173.         scrivi_xor_char= (char) scrivi_char;
  174.  
  175.         fwrite (&scrivi_xor_char,1,1,fp_input_file);
  176.  
  177.                                                    }//fine ciclo for
  178.  
  179.  
  180.     fclose(fp_input_file);
  181. }
  182.  
  183.  
  184.  
  185.         /* The code of your application ends here */
  186.         return 0;
  187. }


Ultima modifica effettuata da danrevella il 08/04/2008 alle 21:15
PM Quote
Avatar
iaia (Normal User)
Newbie


Messaggi: 2
Iscritto: 28/05/2008

Segnala al moderatore
Postato alle 14:01
Mercoledì, 28/05/2008
aiutoooooooooooo mi servirebbe un programma in c# che mi apre legge e salva un file binario...

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 14:30
Mercoledì, 28/05/2008
Questo e' il forum di C non di C# ... devi scrivere nel forum per .NET ...

PM Quote