Como ocultar arquivos ou dados em uma imagem JPEG

Imagem da capa de Como ocultar arquivos ou dados em uma imagem JPEG
Abdulmumin Yaqeen
Abdulmumin Yaqeen

postado em â€˘ Publicado originalmente em yaqeen.me

192533

Como ocultar arquivos ou dados em uma imagem JPEG

Os cavalos de TrĂłia tĂŞm sido uma das maneiras mais eficazes de obter cargas Ăşteis no dispositivo de um alvo. Se vocĂŞ nĂŁo sabe o que ĂŠ um cavalo de TrĂłia, a ideia por trĂĄs disso ĂŠ ocultar a carga Ăştil atrĂĄs do que o alvo considera legĂ­timo.

Recentemente descobri coisas legais sobre imagens JPEG e imaginei que poderíamos anexar informaçþes adicionais ou armazenar dados dentro do JPEG, sem distorcer a imagem.

Neste tutorial, aprenderemos como usar Python como linguagem de programação, como podemos ocultar dados em imagens JPEG e tambÊm como você pode ler os dados armazenados na imagem.

Isenção de responsabilidade: este tutorial não tem nada a ver com a criação de cavalos de Tróia.

O que ĂŠ FFD9;

FFD9 ou x0FFx0D9É um dos muitos marcadores em imagens JPEG que marca o final da imagem (EOI). Outros marcadores incluem FFD8o inĂ­cio da imagem, FFFEum comentĂĄrio e muito mais. vocĂŞ pode procurar todos os marcadores disponĂ­veis na pĂĄgina da Wikipedia .

Estaremos aproveitando o marcador final, ou seja, FFD9, e adicionaremos o que quisermos por trás dele, qualquer coisa, desde outras imagens, vídeos, áudios, executáveis ​​​​ou qualquer dado que você possa imaginar.

Primeiro, vamos tentar adicionar um hello world a uma imagem. Usarei esta imagem de exemplo (prometo que nĂŁo estĂĄ bugada 😀, vocĂŞ pode confiar em mim 🙂) para esta demonstração. Ă‰ seguro fazer download.

Naruto e seu professor Jiraiya compartilham um doce.  Abdulmumin Yaqeen

Crie um novo arquivo Python.

app.py

def inject(image, data):
    image_file = open(image, 'ab')
    image_file.write(data)
    image_file.close()

Aqui, temos uma função simples que leva a imagem e os dados que queremos anexar ao JPEG. Coisas muito diretas; abrimos o abmodo Imagem em, anexando o modo bytes.

Adicionando olĂĄ mundo;

Podemos chamar nossa função e adicionar:

inject('demo.jpg', b'Hello world')

É isso! OlĂĄ mundo agora em nossa imagem, e se vocĂŞ reabrir sua imagem, nenhum dano foi causado a ela. AlĂŠm disso, estamos adicionando um byte sequenceem vez de uma string.

É bom saber : em Python, quando vocĂŞ vĂŞ uma string precedida por a b , como b'Hello world' , significa que a string ĂŠ representada como uma sequĂŞncia de bytes em vez de uma sequĂŞncia de caracteres.

VocĂŞ pode estar pensando: “É simples assim”! Bem, sim! Escrever os dados ĂŠ muito fĂĄcil, mas faremos um pouco mais para tirar nossos dados da imagem.

Lendo nossos dados armazenados;

Em outro lugar, para escrever uma função que retornarĂĄ nossos dados armazenados, ĂŠ aqui que FFD9entraremos em ação.

  • Leremos a imagem para localizar a posição deFFD9

  • Em seguida, busque esse Ă­ndice (coloque o cursor no local, para que a leitura da imagem comece a partir daĂ­).

Aqui estå como serå a função:

def get_end_flag(image):
  image_file = open(image, 'rb')
  content = image_file.read()
  end_flag_index = content.indexof(bytes.fromhex('FFD9'))
  end_flag_offset = end_flag_index+2
  image_file.close()
  return end_flag_offset

A razĂŁo pela qual estamos adicionando 2 (dois) ĂŠ para pular o marcador para ler a prĂłxima seção dos dados. Nesse caso, adicionar 2 end_flag_indexposicionaria nosso ponteiro logo apĂłs o FFD9marcador, pronto para processar a prĂłxima parte dos dados.

Nossa função para ler os dados ficarå assim:

def read_injected_data(image):
  image_file = open(image, 'rb')
  image_file.seek(get_end_flag(image))
  data = image_file.read()
  image_file.close()
  return data

Yahoo! Terminamos o programa. Vamos começar lendo nosso Hello World que adicionamos inicialmente.

data = read_injected_data(image)
print(data)

AĂ­ estĂĄ: nosso Hello World e Image, ambos limpos e intactos.

Abdulmumin yaqeen naruto yaqeen.me blog

Um Problema 🤨;

Temos um problema, veja bem: para adicionar mais dados a esta imagem, primeiro precisaremos nos livrar de tudo o que adicionamos inicialmente.

Podemos escrever uma função para fazer isso:

def clear_injected(image):
  image_file = open(image, 'rb')
  old_content = image_file.read()
  new_content = old_content[:get_end_flag(image)]
  with open(image, 'wb') as new_image:
    new_image.write(new_content)
  image.close()

Esta função basicamente reescreve o conteĂşdo original da imagem, ou seja, o conteĂşdo do inĂ­cio ao fim, e depois o reescreve no mesmo arquivo. Portanto, tudo apĂłs o sinalizador End Of Image (EOI) ser perdido.

Podemos testar nossa função novamente e tudo o que acrescentamos à imagem desaparece 🪄

clear_injected('image.jpg')

Opcionalmente, vocĂŞ pode chamar clear_injecteddentro da injectfunção, para limpar qualquer coisa adicionada Ă  imagem, antes de anexar qualquer outra coisa.

def inject(image, data):
  clear_injected(image)
  ## rest of function

Injetando arquivos de mĂ­dia;

Como dito anteriormente, vamos ver como podemos injetar arquivos de mĂ­dia em nossa imagem. Como tudo o que escrevemos ĂŠ uma sequĂŞncia de bytes, podemos simplesmente ler qualquer arquivo no modo bytes e injetĂĄ-lo em nossa imagem.

SerĂĄ algo parecido com isto:

with open('somevid.mp4', 'rb') as media:
  inject('image.jpg', media.read())

VocĂŞ pode ver que depois de anexar o vĂ­deo Ă  imagem, o tamanho aumentou:

Abdulmumin yaqeen naruto yaqeen.me blog

Podemos facilmente buscar nosso vĂ­deo usando:

data = read_injected_data('image.jpg')
with open('injected-video.mp4', 'wb') as file:
    file.write(data)

AĂ­ estĂĄ, como vocĂŞ pode ocultar ou armazenar dados em imagens JPEG, sem sacrificar nada nos detalhes da imagem, a imagem funciona em qualquer lugar sem problemas. Este ĂŠ um modo divino de esconder coisas no seu computador, sem nunca ser notado, o Ăşnico problema ĂŠ que, quanto maiores os dados que vocĂŞ estĂĄ escondendo na imagem, maior serĂĄ o tamanho.

Volte novamente, Paz âœŒď¸!

ComentĂĄrios

Ebook

Postagens mais visitadas