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

BenjZ Messages postés 6 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 3 juin 2003 - 31 mai 2003 à 16:28
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 31 mai 2003 à 17:04
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> <non-coded file>\n", szFilename) ;
printf ("\t--encode\tEncode <non-coded file> into \n") ;
printf ("\t--decode\tDecode 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;
}

1 réponse

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
31 mai 2003 à 17:04
Elle n'a surtout rien a faire dans un prog win32, le kernel fournissant des fonctions de fichiers autrement + puissantes.
BruNews, ciao...
0