Wiki do André

Partilha de conhecimento

Esconder ficheiros RAR em imagens

É possível esconder alguns ficheiros RAR dentro de imagens. Os ficheiros RAR, por si, também podem conter outros ficheiros. Por isso, um simples ficheiro JPEG pode conter mais do que uma imagem.

Material necessário

  • Um ficheiro .rar com os conteúdos que queremos esconder
  • Um ficheiro .jpg de uma imagem qualquer
  • Programa que descompacte ficheiros RAR
  • Conhecimentos básicos de consola (Windows ou Linux)

Esconder ficheiros num JPEG

Em Windows:

  • Abrir a consola (Iniciar > Executar > cmd)
  • Ir para a pasta onde estão os ficheiros JPEG e RAR (cd c:\Caminho\Para\A\Pasta)
  • Executar o comando:
copy /b imagem.jpg + segredo.rar novaimagem.jpg

Em Linux:

  • Abrir a consola (bash ou similar)
  • Ir para a pasta onde estão os ficheiros JPEG e RAR (cd /caminho/para/pasta/)
  • Executar o comando:
cat imagem.jpg segredo.rar > novaimagem.jpg

Em ambos os casos, deve aparece um novo ficheiro chamado “novaimagem.jpg”, que é a imagem, com o RAR escondido. O que foi feito foi uma concatenação do conteúdo dos ficheiros par um novo, colocando o ficheiro RAR no fim do ficheiro de imagem.

Aceder aos ficheiros escondidos

Quando abrem a imagem num visualizador de imagens, ela aparece normalmente. No entanto, para aceder aos ficheiros, devem abrir a imagem com o WinRAR ou outro programa similar. Os ficheiros do RAR escondido devem aparecer normalmente.

Extrator de imagens

Deixo como contribuição um código que realizei para extrair ficheiros RAR de uma imagem:

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

int main(int argc, char** argv)
{
    if (argc != 2) {
        printf("Usage: %s filename.jpg\n", *argv);
        return EXIT_FAILURE;
    }

    FILE* jpeg = fopen(*++argv, "r");
    if (jpeg == NULL) {
        perror("Cannot open file");
        return EXIT_FAILURE;
    }

    // looking for Rar!
    int seq[] = {
        0x52 , 0x61 , 0x72 , 0x21 , 0x1A , 0x07 , 0x00
    };
    int seqSize = 7;
    int seqPos = 0;
    int fpos = 0;
    int found = 0;
    int c;

    while ((c = fgetc(jpeg) ) != EOF) {
        fpos++;

        if (c == seq[seqPos])
            seqPos++;
        else
            seqPos = 0;

        if (seqPos >= seqSize) {
            found = 1;
            fpos -= seqPos;
            break;
        }
    }

    if (found == 0) {
        printf("Nothing found...\n");

    } else {
        printf("Found Rar! at %X\nExtracting... ", fpos);
        char rarname[255];
        strcpy(rarname, *argv);
        strcat(rarname, ".rar");
        FILE* rar = fopen(rarname, "w");

        if (rar == NULL) {
            perror("Unable to extract file");
            fclose(jpeg);
            return EXIT_FAILURE;
        }

        fseek(jpeg, fpos, 0);

        int c;
        while ((c = fgetc(jpeg)) != EOF)
            fputc(c, rar);

        fclose(rar);
        printf("Done!\n");
    }

    fclose(jpeg);

    return EXIT_SUCCESS;
}

Para usarem, compilem no GCC

gcc fatjpeg.c -o fatjpeg

e usem o programa assim:

./fatjpeg novaimagem.jpg

Se for encontrado um RAR dentro da imagem, ele é extraído com o nome da imagem, seguido da extensão .rar.