Bueno, como esto ya ha quedado parado del todo, para que no se quede el reto sin solución. Aquí os lo dejo. Además n3rud me dijo que postearía el modo en el que él lo solucionó, con un editor hexadecimal.
SI TODAVÍA QUIERES RESOLVERLO POR TÍ MISMO NO LEEAS LO QUE VIENEAquí dejo el código en c de la aplicación que programé para ocultar el texto en la imágen. Es muy cutre puesto que la imágen no se debería borrar al escribir el texto, además se carga alguna cabezera necesaria por lo que algunos programas dán error al abrirla etc... pero vamos, que no me gusta lo suficiente el tema cómo para invertir mas tiempo en él.
Aquí queda para el que tenga curiosidad:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned short int WORD;
typedef unsigned char BYTE;
void CambiaEndian(WORD *Palabra);
int main(void)
{
FILE *Archivo;
WORD Palabra;
BYTE Octeto;
fpos_t Puntf=0;
char Texto[5000];
char NPath[100];
int i=0;
int distrib=2;
char Opt;
printf("\n\n[Demeratus - Esteganografia simple en jpg by MazarD]\n");
printf("[MazarD@gmail.com]\n\n");
printf("[?]Dirección del jpg:");
gets(NPath);
Archivo=fopen(NPath,"r+b");
if (!Archivo) {
printf("[-]No se puede abrir el archivo\n");
return 1;
}
fread(&Palabra,sizeof(WORD),1,Archivo);
if (Palabra!=0xD8FF) { //Si no existe el Start of Imatge marker (FFD8)
printf("[-]El archivo no es jpg\n");
fclose(Archivo);
return 1;
}
fread(&Octeto,sizeof(BYTE),1,Archivo);
Puntf=4;
fsetpos(Archivo,&Puntf);
while (Octeto==0xFF) {
fread(&Palabra,sizeof(WORD),1,Archivo);
CambiaEndian(&Palabra);
fgetpos(Archivo,&Puntf);
Puntf+=Palabra-2;
fsetpos(Archivo,&Puntf);
fread(&Octeto,sizeof(BYTE),1,Archivo);
Puntf+=2;
fsetpos(Archivo,&Puntf);
}
Puntf-=2;
printf("[+]Fin de cabezeras en %.2x\n",Puntf);
printf("[?]Ocultar o Extraer (o/e):");
scanf("%c",&Opt);
if (Opt=='o') {
printf("[?]Mensaje a ocultar:\n");
fflush(stdin);
gets(Texto);
}
printf("[?]Distribucion:");
scanf("%u",&distrib);
while (Texto[i]!=0) {
if (Opt=='o') {
fwrite(&Texto[i],sizeof(BYTE),1,Archivo);
}
else {
fread(&Texto[i],sizeof(BYTE),1,Archivo);
}
Puntf+=distrib;
fsetpos(Archivo,&Puntf);
i++;
}
if (Opt=='o') {
fwrite(&Texto[i],sizeof(BYTE),1,Archivo);
printf("[+]Mensaje ocultado correctamente\n");
}
else {
printf("[+]Mensaje Extraido:\n");
printf("%s\n",Texto);
}
fclose(Archivo);
return 0;
}
void CambiaEndian(WORD *Palabra) {
*Palabra=(*Palabra>> 8) | (*Palabra << 8);
}
I aquí una captura con el resultado del reto:

Un saludo!
