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 FFD8
o inĂcio da imagem, FFFE
um 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.
Crie um novo arquivo Python.
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 ab
modo 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 sequence
em 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 FFD9
entraremos em ação.
Leremos a imagem para localizar a posição de
FFD9
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_index
posicionaria nosso ponteiro logo apĂłs o FFD9
marcador, 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.
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_injected
dentro da inject
funçã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:
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
Postar um comentĂĄrio