E' un programma di steganografia, tramite il quale si inseriscono dei messaggi all'interno di immagini, senza che queste appaiano modificate in alcun modo.
Per capire il funzionamento basta vedere il pezzo di codice sotto //heart.
Considerate che sono un elettronico, quindi il mio codice puo' sembrare zozzo ai puristi :P
Il programma funziona con jpeg che impacchettano l'info ad 8 bit, quindi se non funziona con una immagine...provate con un'altra (magari vecchiotta gh), tanto internet e' piena di immagini da poter usare
[code type="markup"]
/* This program shadows a message in an image (i prefer jpeg)
* If you have problems with an image, try with another one
*
* shadow-ass.c
* Coded by:
* TheAlchemist -> http://thealchemist-geek.tk
* I.M.G. Member -> http://www.inside-me.org
*
* Usage:
* o) 2 code: shadow-ass -c message.txt image.jpeg
* o) 2 decode: shadow-ass -d image.jpeg
*
* See you
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int lunghezza_mess(char *filem);
long lunghezza_ima(char *filei);
int preleva_dim(int *imm, int *st);
int code(int carattere, int state, int *imm, char *chiam, char *text, char *ack);
int decode(int *imm, int *st);
void usage(char *argom);
main(int argn, char **argv)
{
FILE *ima,*mes;
int a,stato,j,lenm,decchar;
long len;
char azione[2];
int *mess_bis, *imm_bis, car;
if(argn<3)
{
usage(argv[0]);
exit(-1);
}
strncpy(azione, argv[1], 3);
if(strstr(azione,"-c"
{
lenm = lunghezza_mess(argv[2]);
len = lunghezza_ima(argv[3]);
if(len<(lenm*8 + 300))
{
printf("\nImage is too little!"
printf("\nTheAlchemist\n"
}
printf("\nImage lenght: %d",len);
printf("\nMessage lenght: %d",lenm);
stato=300;
if(argn<4)
usage(argv[0]);
imm_bis = malloc( (len * sizeof(int)) + 1 );
ima = fopen(argv[3], "r"
printf("\nImage %s opened in read mode",argv[3]);
for(j=0;j<len;j++)
{
imm_bis[j] = fgetc(ima);
if(imm_bis[j]==EOF)
break;
}
fclose(ima);
mess_bis = malloc( (lenm * sizeof(int)) + 2 );
mess_bis[0]=lenm;
mes = fopen(argv[2], "r"
for(j=1;j<len;j++)
{
mess_bis[j] = fgetc(mes);
if(mess_bis[j]==EOF)
break;
}
fclose(mes);
printf("\nMessage 2code: "
for(j=1;j<=lenm;j++)
printf("%c",mess_bis[j]);
printf("\nI'm coding:"
for(a=0;a<lenm+1;a++)
{
car=mess_bis[a];
stato=code(car, stato, imm_bis, argv[0], argv[2], argv[3]);
}
printf("Coded!\nTheAlchemist\n"
}
else if(strstr(azione,"-d"
{
stato=300;
len = lunghezza_ima(argv[2]);
imm_bis = malloc( (len * sizeof(int)) + 1 );
ima = fopen(argv[2], "r"
printf("\nImage %s opened in read mode",argv[2]);
for(j=0;j<len;j++)
{
imm_bis[j] = fgetc(ima);
if(imm_bis[j]==EOF)
break;
}
fclose(ima);
lenm = preleva_dim(imm_bis, &stato);
printf("\nMessage lenght: %d",lenm);
printf("\nIm going to decode: %s",argv[2]);
printf("\nMessage decoded:\n\n"
for(j=0;j<lenm;j++)
{
decchar=decode(imm_bis, &stato);
printf("%c",decchar);
}
printf("\n\nTheAlchemist\n"
}
else if(strstr(azione,"-h"
{
usage(argv[0]);
}
else
{
printf("\nScelta non valida!\n"
usage(argv[0]);
}
}
int code(int carattere, int state, int *imm, char *chiam, char *text, char *ack)
{
FILE *fw;
char *afterfile, temp;
int namelen=strlen(ack),j,t;
long imagelen;
unsigned char mask;
afterfile = malloc( (namelen * sizeof(char)) + 6 );
strcpy(afterfile,"coded-"
strncat(afterfile, ack, namelen);
fw = fopen(afterfile, "w"
imagelen = lunghezza_ima(ack);
for(j=0;j<imagelen;j++)
{
fputc(imm[j],fw);
}
fseek(fw,(state * sizeof(int)),SEEK_SET);
//heart
mask=128;
t=0;
temp=0;
for(j=0;j<8;j++)
{
printf("."
temp = carattere & mask;
temp = temp>>(7-t);
mask = mask>>1;
if(mask==0)
mask=80;
t++;
if(t==8)
t=0;
imm[state] = imm[state] & 254;
imm[state] = imm[state] | temp;
fputc(imm[state],fw);
state++;
}
fclose(fw);
return state;
}
int decode(int *imm, int *st)
{
int m, k, t, sum, temp, car;
unsigned char mask;
mask=01;
temp=0;
sum=0;
t=8;
for(m=0;m<8;m++)
{
temp = imm[(*st)] & mask;
t--;
temp = temp<<t;
if(t==0)
t=7;
sum = sum | temp;
(*st)++;
}
return sum;
}
void usage(char *argom)
{
printf("Usage: %s [option] <file> {image}", argom);
printf("\n\nOptions are:"
printf("\n\t-c\t: code a message => file is a textfile, image is the image where will be inserted the message"
printf("\n\t-d\t: decode a message => file is an image"
printf("\n\t-h\t: print this help"
printf("\n\nExample:"
printf("\ncoding a message: %s -c message.txt image",argom);
printf("\ndecoding a message: %s -d image",argom);
printf("\n\nTheAlchemist\n"
exit(-1);
}
int lunghezza_mess(char *filem)
{
FILE *mes;
int lenm;
mes = fopen(filem, "r"
if (fseek (mes,0L,SEEK_END) == 0)
{
lenm = ftell (mes);
rewind (mes);
}
fclose(mes);
return lenm;
}
long lunghezza_ima(char *filei)
{
FILE *ima;
long len;
ima = fopen(filei, "r"
if (fseek (ima,0L,SEEK_END) == 0)
{
len = ftell (ima);
rewind (ima);
}
fclose(ima);
return len;
}
int preleva_dim(int *imm, int *st)
{
int m, k, t, sum, temp, car;
unsigned char mask;
mask=01;
temp=0;
sum=0;
t=8;
for(m=0;m<8;m++)
{
temp = imm[(*st)] & mask;
t--;
temp = temp<<t;
if(t==0)
t=7;
sum = sum | temp;
(*st)++;
}
return sum;
}
[/code]
Esempio di utilizzo:
$ ./shadow-ass -h
Usage: ./shadow-ass [option] <file> {image}
Options are:
-c : code a message => file is a textfile, image is the image where will be inserted the message
-d : decode a message => file is an image
-h : print this help
Example:
coding a message: ./shadow-ass -c message.txt image
decoding a message: ./shadow-ass -d image
TheAlchemist
Metto il testo da iniettare nell'immagine in prova.txt ed effettuo la codifica:
$ ./shadow-ass -c prova.txt im-orig.jpg
Image lenght: 266876
Message lenght: 79
Image im-orig.jpg opened in read mode
Message 2code: Questo e' un fottuto messaggio di prova da inserire nell'immagine allora snado
I'm coding:.................................................................................................................................
.............................................................................................................................................
.............................................................................................................................................
.............................................................................................................................................
................................................................................Coded!
TheAlchemist
Il programma crea un clone dell'immagine im-orig.jpg, della stessa dimensione e con il prefisso "coded-"
$ ls -l
totale 932
-rw-r--r-- 1 x x 266876 2005-07-20 19:23 coded-im-orig.jpg
-rw-r--r-- 1 x x 266876 2005-07-19 14:11 im0000853xr.jpg
-rw-r--r-- 1 x x 266876 2005-07-19 13:47 im-orig.jpg
-rw-r--r-- 1 x x 79 2005-07-20 16:24 prova.txt
-rwxr-xr-x 1 x x 15599 2005-07-20 12:34 sa
-rwxr-xr-x 1 x x 15900 2005-07-20 16:33 sa2
-rw-r--r-- 1 x x 4970 2005-07-20 16:32 sa2.c
-rwxr-xr-x 1 x x 15911 2005-07-20 16:11 shadow-ass
-rw-r--r-- 1 x x 4571 2005-07-20 12:52 shadow-ass_0.5.c
-rw-r--r-- 1 x x 4942 2005-07-20 15:34 shadow-ass_0.6.c
-rw-r--r-- 1 x x 4673 2005-07-20 15:47 shadow-ass_1.0.c
-rw-r--r-- 1 x x 4968 2005-07-20 16:11 shadow-ass_1.1.c
-rwxr-xr-x 1 x x 15911 2005-07-20 16:33 shadow-ass_1.2
-rw-r--r-- 1 x x 4970 2005-07-20 16:33 shadow-ass_1.2.c
-rwxr-xr-x 1 x x 3997 2005-07-19 22:54 shadow-ass.c
-rwxr-xr-x 1 x x 3255 2005-07-19 20:20 shadow-ass.c.orig
-rw-r--r-- 1 x x 92 2005-07-20 15:55 voting_bar.gif
Potete vedere la straordinaria somiglianza tra le due foto, l'aver inserito il messaggio non si nota affatto!
(man display)
Effettuo ora la decodifica del messaggio, estraendo quest'ultimo dall'immagine:
$ ./shadow-ass -d coded-im-orig.jpg
Image coded-im-orig.jpg opened in read mode
Message lenght: 79
Im going to decode: coded-im-orig.jpg
Message decoded:
Questo e' un fottuto messaggio di prova da inserire nell'immagine allora snado
TheAlchemist
L'ho provato solo da Linux. Da win non so se funziona.
Bella