begin process at 2012 05 29 07:52:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

Logiciels & librairies Microsoft: définitivement buggés ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Logiciels & librairies Microsoft: définitivement buggés ?

samedi 31 mai 2003 à 16:28:18 | Logiciels & librairies Microsoft: définitivement buggés ?

BenjZ

Salut à tous,

Je développe depuis 2 jours un petit logiciel de stéganographie tout bête: il code un fichier dans une bitmap sur les bits de poids faible, cela permet de stocker 125Ko dans une image de 1Mo par exemple. L'avantage est de pouvoir y stocker tout type de données (texte, image, logiciel...).

Depuis ces deux mêmes jours, je cherche désespérément le bug dans mon code, qui encode mal ( un fichier texte court fonctionne, mais dès qu'on passe à une jpeg un peu large, tout se met à dysfonctionner.)
Voyant que les fread, fwrite ne réagissent déjà pas comme prévu, je suis obligé de mettre des fseek partout, ce qui comme déjà à me taper sur les nerfs.

Je code sous visual c++, avec les librairies associées.

Ne trouvant pas mon bug, il m'est venu l'idée de tester le soft sous linux red hat: ô magie, tout fonctionne.

D'où la moralité de cette histoire: même la librairie probablement utilisée dans TOUS les logiciels du marché windows, j'ai nommé stdio.h, de GROS bugs subsistent lorsque l'on lit octet par octet.

Est-ce qu'un jour, nous pourrons avoir un environnement de développement stable, pour pouvoir partir sur de bonnes bases et ainsi produire des logiciels stables ?

Je commence sérieusement à désespérer de Micro$oft... Sans bien entendu parler des plantages de mon PC :(

Je vous joins la source pour que vous puissiez vous rendre compte par vous-même
(si vous compilez sous windows, virez la fonction itoa que j'ai réécrite rapidos pour être utilisée en base10, bizarrement sous nux il ne la connaissait pas, je n'ai pas voulu me prendre la tête une fois de plus)

L'utilisation est simple:
stegano --encode image.bmp fichier.xxx
stegano --decode image.bmp fichier.xxx


Faites-moi part de vos commentaires
Je trouve désespérant d'être obligé d'utiliser des moyens détournés (dans la prochaine version, je lirai tout d'un bloc pour stocker ça dans un buffer temporaire) pour arriver à ses fins, surtout que stdio.h est une "vieille" librairie qui ne devrait plus avoir à faire ses preuves.

A bon entendeur...



Benj




#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define ENCODE 0
#define DECODE 1

void ShowUsage (const char *) ;
bool GetBit (char, unsigned short) ;
char *itoa (int, char*, int);
int main (int argc, char *argv[])
{
FILE *pBitmap, *pFile ;
bool action ;
char c, cFile, info[16], temp[16] ;
unsigned short p=0 ;
long i, lFileSize, lBmpSize, pos, posFile ;

// Check action & open [/create] files
if (argc != 4) ShowUsage (argv[0]) ;

if (strcmp (argv[1], "--encode") == 0)
{
action = ENCODE ;
if ((pBitmap = fopen (argv[2], "rb+")) == NULL)
{
printf ("Error opening %s !\n", argv[2]) ;
exit (1) ;
}
if ((pFile = fopen (argv[3], "rt")) == NULL)
{
printf ("Error opening %s !\n", argv[3]) ;
fclose (pBitmap) ;
exit (1) ;
}
}
else
if (strcmp (argv[1], "--decode") == 0)
{
action = DECODE ;
if ((pBitmap = fopen (argv[2], "rb")) == NULL)
{
printf ("Error opening %s !\n", argv[2]) ;
exit (1) ;
}
if ((pFile = fopen (argv[3], "wt")) == NULL)
{
printf ("Error creating %s !\n", argv[3]) ;
fclose (pBitmap) ;
exit (1) ;
}
}
else
ShowUsage (argv[0]) ;

// Getting Bitmap File size
fseek (pBitmap, 0, SEEK_END) ;
lBmpSize = ftell (pBitmap) ;

// Seeking Bitmap to Data Offset (info at Offset 0x000A)
fseek (pBitmap, 0x000A, SEEK_SET) ;
fread (&c, 1, 1, pBitmap) ;
fseek (pBitmap, c, SEEK_SET) ;
pos = c;

switch (action)
{
case ENCODE:
// Getting File to encode's size
fseek (pFile, 0, SEEK_END) ;
lFileSize = ftell (pFile) ;
rewind (pFile) ;

// Merging STG Header to Bitmap File:
strcpy (info, "STG") ;
strcat (info, itoa (lFileSize, temp, 10)) ;
for (i=0; i<=(long)strlen (info); i++)
{
for (p=0; p<8; p++)
{
fseek(pBitmap, pos, SEEK_SET);
fread (&c, 1, 1, pBitmap) ;
if (GetBit (info[i], p) == 1)
c |= 0x01 ;
else
c &= 0xFE ;
fseek(pBitmap, pos, SEEK_SET);
fwrite (&c, 1, 1, pBitmap) ;
pos++;
}
}

// Merging File content to Bitmap
for (i=0; i<lFileSize; i++)
{
fseek (pFile, i, SEEK_SET) ; ///
fread (temp, 1, 1, pFile) ;
cFile = temp[0]; ///^cFile
for (p=0; p<8; p++)
{
fseek(pBitmap, pos, SEEK_SET);
fread (&c, 1, 1, pBitmap) ;
//printf ("%d\n", c); ///
if (GetBit (cFile, p) == 1)
c |= 0x01 ;
else
c &= 0xFE ;
fseek(pBitmap, pos, SEEK_SET);
fwrite (&c, 1, 1, pBitmap) ;
pos++;
}
}
printf("Coded file size: %d\n", lFileSize);
break ;

case DECODE:
posFile = 0 ; ///
// Looking for STG Header
for (i=0; i<3; i++)
{
cFile = 0x00 ;
for (p=0; p<8; p++)
{
fseek (pBitmap, pos, SEEK_SET) ; ///
fread (&c, 1, 1, pBitmap) ;
pos++ ; ///
if ((c & 0x01) == 0x01)
cFile |= (1 << p) ;
}
temp[i] = cFile ;
}
temp[3] = 0 ;
if (strcmp (temp, "STG") != 0)
{
printf ("Error: cannot find STG Header in Bitmap.\n") ;
fclose (pBitmap) ;
fclose (pFile) ;
exit (1) ;
}
// Getting merged file size
for (i=0; cFile!=0x00; i++)
{
cFile = 0x00 ;
for (p=0; p<8; p++)
{
fseek (pBitmap, pos, SEEK_SET) ; ///
fread (&c, 1, 1, pBitmap) ;
pos++ ; ///
if ((c & 0x01) == 0x01)
cFile |= (1 << p) ;
}
temp[i] = cFile ;
}
temp[i] = 0 ;
lFileSize = atoi (temp) ;

printf("FZ: %d\n", lFileSize) ;

// Extracting file
for (i=0; i<lFileSize; i++)
{
cFile = 0x00 ;
for (p=0; p<8; p++)
{
fseek (pBitmap, pos, SEEK_SET) ; ///
fread (&c, 1, 1, pBitmap) ;
pos++ ; ///
if ((c & 0x01) == 0x01)
cFile |= (1 << p) ;
}
fseek (pFile, posFile, SEEK_SET) ; ///
fwrite (&cFile, 1, 1, pFile) ;
posFile++ ; ///
}
}

fclose (pBitmap) ;
fclose (pFile) ;

printf ("Done.\n") ;

return 0 ;
}


void ShowUsage (const char *szFilename)
{
printf ("Usage: %s <option> <bitmap file> <non-coded file>\n", szFilename) ;
printf ("\t--encode\tEncode <non-coded file> into <bitmap file>\n") ;
printf ("\t--decode\tDecode <bitmap file> into <non-coded file>\n") ;
printf ("\tText file lTextSize must be at max 1/8 bitmap file size\n") ;
exit (1) ;
}

bool GetBit (char c, unsigned short b)
{
return (((c & (0x01 << b)) == (0x01 << b)) ? 1 : 0) ;
}

char* itoa (int i, char* buffer, int x)
{
int j=0;
while (i!=0)
{
buffer[j] = 48 + i%10 ;
i/=10;
j++;
}
buffer[j] = 0 ;
return buffer;
}
samedi 31 mai 2003 à 17:04:51 | Re : Logiciels & librairies Microsoft: définitivement buggés ?

BruNews

Administrateur CodeS-SourceS
Elle n'a surtout rien a faire dans un prog win32, le kernel fournissant des fonctions de fichiers autrement + puissantes.
BruNews, ciao...


-------------------------------
Réponse au message :
-------------------------------

> Salut à tous,
>
> Je développe depuis 2 jours un petit logiciel de stéganographie tout bête: il code un fichier dans une bitmap sur les bits de poids faible, cela permet de stocker 125Ko dans une image de 1Mo par exemple. L'avantage est de pouvoir y stocker tout type de données (texte, image, logiciel...).
>
> Depuis ces deux mêmes jours, je cherche désespérément le bug dans mon code, qui encode mal ( un fichier texte court fonctionne, mais dès qu'on passe à une jpeg un peu large, tout se met à dysfonctionner.)
> Voyant que les fread, fwrite ne réagissent déjà pas comme prévu, je suis obligé de mettre des fseek partout, ce qui comme déjà à me taper sur les nerfs.
>
> Je code sous visual c++, avec les librairies associées.
>
> Ne trouvant pas mon bug, il m'est venu l'idée de tester le soft sous linux red hat: ô magie, tout fonctionne.
>
> D'où la moralité de cette histoire: même la librairie probablement utilisée dans TOUS les logiciels du marché windows, j'ai nommé stdio.h, de GROS bugs subsistent lorsque l'on lit octet par octet.
>
> Est-ce qu'un jour, nous pourrons avoir un environnement de développement stable, pour pouvoir partir sur de bonnes bases et ainsi produire des logiciels stables ?
>
> Je commence sérieusement à désespérer de Micro$oft... Sans bien entendu parler des plantages de mon PC :(
>
> Je vous joins la source pour que vous puissiez vous rendre compte par vous-même
> (si vous compilez sous windows, virez la fonction itoa que j'ai réécrite rapidos pour être utilisée en base10, bizarrement sous nux il ne la connaissait pas, je n'ai pas voulu me prendre la tête une fois de plus)
>
> L'utilisation est simple:
> stegano --encode image.bmp fichier.xxx
> stegano --decode image.bmp fichier.xxx
>
>
> Faites-moi part de vos commentaires
> Je trouve désespérant d'être obligé d'utiliser des moyens détournés (dans la prochaine version, je lirai tout d'un bloc pour stocker ça dans un buffer temporaire) pour arriver à ses fins, surtout que stdio.h est une "vieille" librairie qui ne devrait plus avoir à faire ses preuves.
>
> A bon entendeur...
>
>
>
> Benj
>
>
>
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
>
> #define ENCODE 0
> #define DECODE 1
>
> void ShowUsage (const char *) ;
> bool GetBit (char, unsigned short) ;
> char *itoa (int, char*, int);
> int main (int argc, char *argv[])
> {
> FILE *pBitmap, *pFile ;
> bool action ;
> char c, cFile, info[16], temp[16] ;
> unsigned short p=0 ;
> long i, lFileSize, lBmpSize, pos, posFile ;
>
> // Check action & open [/create] files
> if (argc != 4) ShowUsage (argv[0]) ;
>
> if (strcmp (argv[1], "--encode") == 0)
> {
> action = ENCODE ;
> if ((pBitmap = fopen (argv[2], "rb+")) == NULL)
> {
> printf ("Error opening %s !\n", argv[2]) ;
> exit (1) ;
> }
> if ((pFile = fopen (argv[3], "rt")) == NULL)
> {
> printf ("Error opening %s !\n", argv[3]) ;
> fclose (pBitmap) ;
> exit (1) ;
> }
> }
> else
> if (strcmp (argv[1], "--decode") == 0)
> {
> action = DECODE ;
> if ((pBitmap = fopen (argv[2], "rb")) == NULL)
> {
> printf ("Error opening %s !\n", argv[2]) ;
> exit (1) ;
> }
> if ((pFile = fopen (argv[3], "wt")) == NULL)
> {
> printf ("Error creating %s !\n", argv[3]) ;
> fclose (pBitmap) ;
> exit (1) ;
> }
> }
> else
> ShowUsage (argv[0]) ;
>
> // Getting Bitmap File size
> fseek (pBitmap, 0, SEEK_END) ;
> lBmpSize = ftell (pBitmap) ;
>
> // Seeking Bitmap to Data Offset (info at Offset 0x000A)
> fseek (pBitmap, 0x000A, SEEK_SET) ;
> fread (&c, 1, 1, pBitmap) ;
> fseek (pBitmap, c, SEEK_SET) ;
> pos = c;
>
> switch (action)
> {
> case ENCODE:
> // Getting File to encode's size
> fseek (pFile, 0, SEEK_END) ;
> lFileSize = ftell (pFile) ;
> rewind (pFile) ;
>
> // Merging STG Header to Bitmap File:
> strcpy (info, "STG") ;
> strcat (info, itoa (lFileSize, temp, 10)) ;
> for (i=0; i<=(long)strlen (info); i++)
> {
> for (p=0; p<8; p++)
> {
> fseek(pBitmap, pos, SEEK_SET);
> fread (&c, 1, 1, pBitmap) ;
> if (GetBit (info[i], p) == 1)
> c |= 0x01 ;
> else
> c &= 0xFE ;
> fseek(pBitmap, pos, SEEK_SET);
> fwrite (&c, 1, 1, pBitmap) ;
> pos++;
> }
> }
>
> // Merging File content to Bitmap
> for (i=0; i<lFileSize; i++)
> {
> fseek (pFile, i, SEEK_SET) ; ///
> fread (temp, 1, 1, pFile) ;
> cFile = temp[0]; ///^cFile
> for (p=0; p<8; p++)
> {
> fseek(pBitmap, pos, SEEK_SET);
> fread (&c, 1, 1, pBitmap) ;
> //printf ("%d\n", c); ///
> if (GetBit (cFile, p) == 1)
> c |= 0x01 ;
> else
> c &= 0xFE ;
> fseek(pBitmap, pos, SEEK_SET);
> fwrite (&c, 1, 1, pBitmap) ;
> pos++;
> }
> }
> printf("Coded file size: %d\n", lFileSize);
> break ;
>
> case DECODE:
> posFile = 0 ; ///
> // Looking for STG Header
> for (i=0; i<3; i++)
> {
> cFile = 0x00 ;
> for (p=0; p<8; p++)
> {
> fseek (pBitmap, pos, SEEK_SET) ; ///
> fread (&c, 1, 1, pBitmap) ;
> pos++ ; ///
> if ((c & 0x01) == 0x01)
> cFile |= (1 << p) ;
> }
> temp[i] = cFile ;
> }
> temp[3] = 0 ;
> if (strcmp (temp, "STG") != 0)
> {
> printf ("Error: cannot find STG Header in Bitmap.\n") ;
> fclose (pBitmap) ;
> fclose (pFile) ;
> exit (1) ;
> }
> // Getting merged file size
> for (i=0; cFile!=0x00; i++)
> {
> cFile = 0x00 ;
> for (p=0; p<8; p++)
> {
> fseek (pBitmap, pos, SEEK_SET) ; ///
> fread (&c, 1, 1, pBitmap) ;
> pos++ ; ///
> if ((c & 0x01) == 0x01)
> cFile |= (1 << p) ;
> }
> temp[i] = cFile ;
> }
> temp[i] = 0 ;
> lFileSize = atoi (temp) ;
>
> printf("FZ: %d\n", lFileSize) ;
>
> // Extracting file
> for (i=0; i<lFileSize; i++)
> {
> cFile = 0x00 ;
> for (p=0; p<8; p++)
> {
> fseek (pBitmap, pos, SEEK_SET) ; ///
> fread (&c, 1, 1, pBitmap) ;
> pos++ ; ///
> if ((c & 0x01) == 0x01)
> cFile |= (1 << p) ;
> }
> fseek (pFile, posFile, SEEK_SET) ; ///
> fwrite (&cFile, 1, 1, pFile) ;
> posFile++ ; ///
> }
> }
>
> fclose (pBitmap) ;
> fclose (pFile) ;
>
> printf ("Done.\n") ;
>
> return 0 ;
> }
>
>
> void ShowUsage (const char *szFilename)
> {
> printf ("Usage: %s <option> <bitmap file> <non-coded file>\n", szFilename) ;
> printf ("\t--encode\tEncode <non-coded file> into <bitmap file>\n") ;
> printf ("\t--decode\tDecode <bitmap file> into <non-coded file>\n") ;
> printf ("\tText file lTextSize must be at max 1/8 bitmap file size\n") ;
> exit (1) ;
> }
>
> bool GetBit (char c, unsigned short b)
> {
> return (((c & (0x01 << b)) == (0x01 << b)) ? 1 : 0) ;
> }
>
> char* itoa (int i, char* buffer, int x)
> {
> int j=0;
> while (i!=0)
> {
> buffer[j] = 48 + i%10 ;
> i/=10;
> j++;
> }
> buffer[j] = 0 ;
> return buffer;
> }
>



Cette discussion est classée dans : int, char, argv, encode, pbitmap


Répondre à ce message

Sujets en rapport avec ce message

char **argv [ par iam_myst ] bonjour je pense que c'est vraiment un problème de débutant mais la je suis perplexe :( si on a un programme pricipal de ce type :     int main(int a Conversion de char en int ? [ par jnbrunet ] Salut,Je débute en c++... dans mon programme j'aimerai additionner les valeurs entrées en argument dans le main (argv). Le problème est que la variabl char**, pointeur et fonction [ par psykocrash ] Salut,Je bosse sur un petit programme et je butte sur un problème de pointeurs. Voici le code source qui pose problème :--------------------#include # int main(int argc, char ** argv) [ par agent 047 ] Bonjour,mon probleme se porte sur le paramètre "char **argv" de la fonction principale utile pour connaître les adresses de chaque argument.Par exempl Problème en tête bitmap [ par piroman14 ] Slt tt le monde!Je rencontre un petit problème dans mon algorithme. En effet, je n'arrive pas à coder l'en-tête d'une image bitmap correctement. J'obt Afficher un Int dans une ListBox ? [ par KroOon ] Bonjour alors je vous explique mon petit Probléme je débute en Programmation Pour lla Creation d' Applications Windows.Je souhaiterais A partir d' un matrice de caractere en c [ par flofloo ] slt tout le monde voici mon probleme : char **Init_Matrice_IrcMSG(int ligne,int colone){     char **mat = NULL;     int i;     mat = Objet : ajout et taille [ par scorpion077 ] Bonjour,j'essai de corriger un DS portant sur la POO. voici mon code:--------------------------------------------------------------------------------# simplifier prog. [ par F0ra ] Bonjour,Je cherche de l'aide pour simplifier mon programme au maximumVoici, le contenu du fichier txt :0 1 2 5 3 4 . 1 2 51 1 5 2 2 6 . 9 2 3 2 5 9 8 Sélection d'octet [ par dayvid75014 ] Bonjour à tous, Je récupère les octets de mon fichier vidéo dans un buffer "Buffer[]" et je voudrais sélectionner les octets 0x47 et je n'y a


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales