Gdzie przechowywane są pliki .doc?
Słowo doc
pliki są faktycznie spakowane, a następnie umieszczane w formacie kontenera. Przechowują media gdzieś w tym skompilowanym formacie pliku, prawdopodobnie zaraz po doc
nagłówek formatu. Po danych obrazu jest twój prawdziwy dokument jako folder zgodny z zip.
Więc kiedy próbujesz rozpakować a doc
plik, otrzymasz nadmiarową liczbę bajtów na początku. To są twoje zdjęcia (plus nagłówek formatu). Teraz możesz spróbować unzip
plik i sprawdź nadmiarową ilość bajtów.
charon:test werner$ unzip -c images.doc > /dev/null
warning [images.doc]: 47166 extra bytes at beginning or within zipfile
charon:test werner$ unzip -c noimages.doc > /dev/null
warning [noimages2.doc]: 6060 extra bytes at beginning or within zipfile
Dzięki testom znalazłem nagłówek „tekstowych” dokumentów Worda o rozmiarze 6060 bajtów dużych (niektóre są jednak nieco większe). Możemy spróbować go wykorzystać do określenia, czy w dokumencie znajduje się obraz. Powiedzmy po prostu 8000 bajtów - ponieważ prawdziwe obrazy z pewnością będą miały więcej niż kilka KB.
Co z plikami .docx?
Z formatem Office 2007 ( docx
), to jest dużo łatwiejsze. Są to rzeczywiste pliki spakowane, a każdy plik programu Word, który zawiera wszelkiego rodzaju osadzone multimedia (obrazy, wideo), będzie zawierał file.docx/word/media
informator. Więc musimy tylko rozpakować docx
pliki i sprawdź, czy ten katalog istnieje.
Skrypt do sprawdzania obrazów
Utwórz nowy pusty plik, nazwij go docx-images.rb
i wklej następującą treść:
#!/usr/bin/env ruby
require 'open3'
TEMPDIR = "/tmp/word/"
# check for docx files
Dir.glob("**/*.docx").each do |file|
system("rm -rf '#{TEMPDIR}'")
system("unzip '#{file}' -d #{TEMPDIR} > /dev/null")
if File.directory?("#{TEMPDIR}/word/media/")
puts file
end
end
# check for doc files
Dir.glob("**/*.doc").each do |file|
stdin, stdout, stderr = Open3.popen3("unzip -c '#{file}' > /dev/null")
info = stderr.readlines[0]
info = info.gsub(" extra bytes at beginning or within zipfile", "").gsub(/warning\s\[.*\]:\s+/, "")
if info.to_i > 8000 # assume a little more than usual header size
puts file
end
end
Zapisz go gdzieś, najlepiej w folderze, w którym chcesz rozpocząć wyszukiwanie docx
pliki z, może twoje Documents
teczka.
Teraz otwórz się Terminal.app , I użyć cd ~/Documents
iść tam.
Rodzaj ruby docx-images.rb
i będzie rekurencyjnie skanować twoje Documents
folder dla docx
i doc
pliki. Rozpakuje to pierwsze do /tmp/word
i sprawdź, czy zawierają osadzone media. Te ostatnie są po prostu rozpakowane do /dev/null
, nie pozostawiając żadnych śladów.
Skończysz z listą tych z osadzonymi mediami.
Dowód
Aby udowodnić, że to działa, stworzyłem cztery pliki. Jeden z obrazami, jeden bez obrazów - oba jako doc
i docx
:
Następnie uruchom skrypt:
charon:test werner$ ruby docx-images.rb
images.docx
images.doc
Oczywiście skrypt może zostać ulepszony, aby sprawdzić w nim rzeczywiste obrazy media
folder, ale jest mało prawdopodobne, że plik nie zawiera żadnych mediów To samo dotyczy sprawdzania bajtów „6060”. To hack, ale działa na mnie.
Oczywiście skrypt zależy od implementacji unzip
w odpowiednim systemie, ale działa dla wersji OS X.