Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DUMP DE FICHIERS [VC++ 6]


Information sur la source

Catégorie :Fichiers / Disque Niveau : Débutant Date de création : 27/03/2003 Date de mise à jour : 27/03/2003 09:26:13 Vu / téléchargé: 2 781 / 205

Note :
Aucune note

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

  Il s'agit de lire un fichier en mode binaire (sans interprétation de son contenu) et d'afficher le tout en hexa, décimal ou binaire et avec un regroupement de 1 à 4 octets. L'affichage se fait sur une console avec de la couleur et l'utilisation de séquences d'échappement.

  Si y a un affichage pourri, place dans config.sys la ligne suivante:
  ( Vérifie le chemin )

       DEVICE=C:\WINDOWS\COMMAND\ANSI.SYS
 

Source

  • /*-------------------------------------------------------------
  • * Fichier : dump.c ( EXTRAIT cf ZIP )
  • * N.P. : 19/11/2001 09:24
  • * Objet : Lecture en mode binaire
  • * ===================================
  • */
  • #include <limits.h>
  • #include <string.h>
  • #include <ctype.h>
  • #include <stdio.h>
  • #define DECAL_ORG 45 //départ colonne ASCII
  • #define color printf("\033[36m") //couleur bleu pour ASCII
  • #define norm printf("\033[37m") //couleur normale (blanc)
  • #define color_2 printf("\033[33m") //couleur jaune pour l'Offset
  • //Prototype(s):
  • void curseur ( int decalage , char valeur );
  • void binaire_char ( unsigned char nbre );
  • void binaire_int ( unsigned int nbre );
  • /*------------------------------------------------------------*/
  • int main( int argc , char *argv[] )
  • {
  • int base = 16;
  • int group = 1; //1 pour char, 4 pour int...
  • int i;
  • //Vérif. des arguments:
  • if (argc == 1)
  • {
  • printf("\nConception: Nicolas PIRAT (R)\n");
  • printf("\nUtilite: afficher en dec/bin/hex un fichier par 1 ou 4 octet(s).\n");
  • printf("\nAppel: DUMP.EXE nom_fichier [/dec] [/bin] [/int] \n");
  • printf(" Par defaut, affichage en hexa et par octet.\n");
  • printf("\nIt's ok ? ");
  • getchar();
  • return 1;
  • }
  • for (i=2; i < argc; i++)
  • {
  • if ( !strcmp( argv[i], "/dec") )
  • base = 10;
  • if ( !strcmp( argv[i], "/int" ) )
  • group = 4;
  • if ( !strcmp( argv[i], "/bin" ) )
  • base = 2;
  • }
  • //Ouverture du fichier:
  • {
  • FILE *f;
  • unsigned char buffer;
  • unsigned int buffer_int;
  • int i,ligne = 0;
  • int decal = DECAL_ORG;
  • if ((f = fopen(argv[1],"rb")) == NULL)
  • {
  • perror("Le fichier ne s'est pas ouvert.");
  • return 1;
  • }
  • else
  • {
  • //Lecture du fichier:
  • do
  • {
  • color_2;
  • printf("%06ld ", ftell( f ) );
  • norm;
  • //Modif. pour affichage des int:
  • if ( (group == 4) && (base == 16) )
  • base = 6;
  • if ( (group == 4) && (base == 10) )
  • base = 4;
  • if ( (group == 1) && (base == 10) )
  • base = 12;
  • if ( (group == 1) && (base == 2) )
  • base = 5;
  • for( i=0 ; i <base ; i++)
  • {
  • //Choix de la taille des données à lire d'un coup:
  • if ( group == 1 )
  • fread( &buffer , sizeof(char) , 1 , f );
  • else
  • fread( &buffer_int, sizeof(int), 1 , f );
  • if ( feof(f) ) //Fin de fichier !
  • {
  • fclose( f );
  • return 0;
  • }
  • //Choix de l'affichage d'apeès la base:
  • if ((base == 16) || (base == 6))
  • {
  • if ( group == 1)
  • printf("%02X ",buffer );
  • else
  • printf("%08X ", buffer_int );
  • }
  • else if (( base == 12) || (base == 4) ) //base 10
  • {
  • if ( group == 1)
  • printf("%03d ",buffer );
  • else
  • printf("%010d ", buffer_int );
  • }
  • else
  • {
  • if ( group == 1)
  • binaire_char( buffer );
  • else
  • binaire_int( buffer_int );
  • }
  • //else ( base == 2 )
  • //Ecrit à droite de l'écran et revient à gauche si CHAR !
  • if (group == 1)
  • curseur(decal,buffer);
  • //Prépa pour prochain décalage:
  • if ( (base == 12) || (base == 4) ) //Correspond à la base 10
  • {
  • if (group == 1)
  • decal -= 3;
  • else
  • decal -= 10;
  • }
  • else if ( (base == 16) || (base == 6)) //base 16
  • {
  • if (group == 1)
  • decal -= 2;
  • else
  • decal -= 8;
  • }
  • else
  • {
  • if (group == 1)
  • decal -= 5;
  • else
  • decal -= 2;
  • }
  • }
  • //Position en bout de ligne pour faire \n:
  • //printf("\0338");
  • printf("\n");
  • decal = DECAL_ORG;
  • ligne++;
  • //Affichage page par page...!
  • if (ligne > 23)
  • {
  • printf("Appuyer sur une touche pour continuer...");
  • ligne = 0;
  • i = getchar();
  • }
  • } while (!feof(f));
  • }
  • fclose( f );
  • }
  • return 0;
  • }
/*-------------------------------------------------------------
* Fichier : dump.c    ( EXTRAIT cf ZIP )
* N.P.    : 19/11/2001 09:24
* Objet   : Lecture en mode binaire
* ===================================
*/

#include <limits.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>

#define DECAL_ORG 45								//départ colonne ASCII

#define color printf("\033[36m")					//couleur bleu pour ASCII
#define norm printf("\033[37m")					//couleur normale (blanc)
#define color_2 printf("\033[33m")				//couleur jaune pour l'Offset


//Prototype(s):
void curseur ( int decalage , char valeur );
void binaire_char ( unsigned char nbre );
void binaire_int ( unsigned int nbre );




/*------------------------------------------------------------*/
int main( int argc , char *argv[] )
{
	int base = 16;
	int group = 1;		//1 pour char, 4 pour int...
	int i;
	
	//Vérif. des arguments:
	if (argc == 1)
	{
		printf("\nConception: Nicolas PIRAT (R)\n");
		printf("\nUtilite: afficher en dec/bin/hex un fichier par 1 ou 4 octet(s).\n");
		printf("\nAppel: DUMP.EXE nom_fichier [/dec] [/bin] [/int] \n");
		printf("       Par defaut, affichage en hexa et par octet.\n");
		printf("\nIt's ok ? ");
		getchar();
		return 1;
	}
	
	for (i=2; i < argc; i++)
	{
		if ( !strcmp( argv[i], "/dec") )
			base = 10;
		
		if ( !strcmp( argv[i], "/int" ) )
			group = 4;
		if ( !strcmp( argv[i], "/bin" ) )
			base = 2;
	}
	
	//Ouverture du fichier:
	{
		FILE *f;
		unsigned char buffer;
		unsigned int buffer_int;
		int i,ligne = 0;
		int decal = DECAL_ORG;
		
		if ((f = fopen(argv[1],"rb")) == NULL)
		{
			perror("Le fichier ne s'est pas ouvert.");
			return 1;
		}
		else
		{
			//Lecture du fichier:
			do
			{
				color_2;
				printf("%06ld ", ftell( f ) );
				norm;

				//Modif. pour affichage des int:
				if ( (group == 4) && (base == 16) )
					base = 6;
				if ( (group == 4) && (base == 10) )
					base = 4;
				if ( (group == 1) && (base == 10) )
					base = 12;
				if ( (group == 1) && (base == 2) )
					base = 5;

				for( i=0 ; i <base ; i++)
				{
					//Choix de la taille des données à lire d'un coup:
					if ( group == 1 )
						fread( &buffer , sizeof(char) , 1 , f );
					else
						fread( &buffer_int, sizeof(int), 1 , f );
					
					if ( feof(f) )	//Fin de fichier !
					{
						fclose( f );
						return 0;
					}

					//Choix de l'affichage d'apeès la base:
					if ((base == 16) || (base == 6))
					{
						if ( group == 1)
							printf("%02X ",buffer );
						else
							printf("%08X ", buffer_int );
					}
					else if (( base == 12) || (base == 4) )	//base 10
					{
						if ( group == 1)
							printf("%03d ",buffer );
						else
							printf("%010d ", buffer_int );
					}
					else
					{
						if ( group == 1)
							binaire_char( buffer );
						else
							binaire_int( buffer_int );
					}
					//else ( base == 2 )
					
					
					//Ecrit à droite de l'écran et revient à gauche si CHAR !
					if (group == 1)
						curseur(decal,buffer);

					//Prépa pour prochain décalage:
					if ( (base == 12) || (base == 4) )		//Correspond à la base 10
					{
						if (group == 1)
							decal -= 3;
						else
							decal -= 10;
					}
					else if ( (base == 16) || (base == 6))			//base 16
					{
						if (group == 1)
							decal -= 2;
						else
							decal -= 8;
					}
					else
					{
						if (group == 1)
							decal -= 5;
						else
							decal -= 2;
					}
					
				}
				//Position en bout de ligne pour faire \n:
				//printf("\0338");
				printf("\n");
				decal = DECAL_ORG;
				ligne++;
				//Affichage page par page...!
				if (ligne > 23)
				{
					printf("Appuyer sur une touche pour continuer...");
					ligne = 0;
					i = getchar();
				}	
			} while (!feof(f));
			
		}
		fclose( f );
	}	
	
	return 0;	
}

Conclusion

J'ai tenté un dump de la mémoire en partant de l'adresse  de la fonction main(). C'est intérresant mais il-y-a-til une solution (sans taper bcp d'asm) pour sortir du cadre de la mémoire allouée à mon processus...?
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de DarkBoss le 20/04/2005 16:09:41

pourquoi ne pas utiliser textcolor(int); ?

signaler à un administrateur
Commentaire de DarkBoss le 20/04/2005 16:18:43

ce n' est pas un dump un dump ne lis pas le fichier il lis la memoire et la sauvegarde dans un fichier

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,27 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.