выдрать tiff из бинарника

BILL64

кто может подсказать как из бинарного файла выдрать все изображения в формате tiff?
бинарник имеется ввиду не exe'шник, а бинарный файлик, в котором где-то хранятся тиффки

Maurog

давай бинарник :grin:

okis

Попробуй ResHacker или Resource Extractor из TC

Maurog

бинарник имеется ввиду не exe'шник
не, ну я так не играю :shocked:

Maurog

запрос к гуглу дал первый результат
Detailed information for file extension TPS:
Primary association: Clarion for Windows
Company: SoftVelocity
File classification: Database
Identifying characters Hex: 00 00 00 00 00 02 00 , ASCII:
Related links: Clarion Magazine, Clarion Information
Hex совпал

BILL64

он и есть. так как ебучий клэрион не поддерживается хуй знает сколько, данные выдрать стандратными способами (утилитами клэрион) не получается, то хоть каким-то образом

Maurog

что же ты об этом в первом посте не написал?
тут уже одним ковырянием в ресурсах не обойтись
так что я умываю руки)

elenangel

вот тебе метод тупо в лоб:
хекс-редактором открываем первый попавшийся tif-файл на компе.
видим первые 4 байта: 49 49 2A 00
предполагаем что это сигнатура tif.
предполагаем что данные в кларионовской базе хранятся как есть без кодирования и сжатия и тиф-файлы следуют один за другим.
ищем сигнатуру. находим. запоминаем смещение. ищем следующую. запоминаем смещение. выделяем кусок файла от первого смещения до второго и сохраняем с расширением tiff.
?
PROFIT!
вот первый такой фрагмент (сделано в линуксе редактором okteta)

BILL64

т.е. получается все тифф файлы идут тупо один за другим? между ними нет левых данных?

elenangel

гарантий дать не могу, беглый гуглинг не дал сколь нибудь человеческого описания формата tiff поэтому длину файла из заголовка не знаю как вытащить. но даже если есть левые данные, они оказываются в хвосте файла и на отображение вроде как не влияют. можно пересохранить потом гимпом каждый файл, чтобы он мусор проигнорировал и чистенький файл сделал.

BILL64

спасибо. это подтверждает теорию что наши конкуренты хранили картинки тупо в бинарном формате
я тоже сегодня искал какое-нибудь описание тиффа, чтобы автоматизировать это дело, но нашел только полную спецификацию.

elenangel

ну а как еще ты картинку в базу пихнешь? или там есть тип специальный или тупо BLOB. тут еще повезло что сама база не пыталась сжимать или кодировать как-то.

BILL64

можно в алгоритме пихания в базу все байтики сделать +1 mod 256 - и радоваться когда конкуренты (т.е. мы) пытаются экспортировать тиффки из базы.
clarion- это не та база данных, в которых есть запросы типа sql. тут, как я понял, все данные ассоциируются с полями программы. поэтому там как раз такое можно было провенуть.

elenangel

сейчас попробовал 2-й по счету тиф вытащить - не все так безоблачно. он не открывается. так что кури полную спецификацию =)

BILL64

тем же способом?
я так понимаю что эта сигнатура может еще внтури тифф файла встречаться - ты видимо подхватил внутреннюю

elenangel

тем же способом, но следующий участок. да, видимо это я в пиксел такого цвета "вляпался" или еще во что.

BILL64

написал простенькую программку:

a = open("/Users/oberon/tmp/DCD00590.TPS").read

for i in xrange(len(a)-4):
if ord(a[i]) == 0x49 and ord(a[i+1]) == 0x49 and ord(a[i+2]) == 0x2a and ord(a[i+3]) == 0x00:
b = open("/Users/oberon/tmp/" + str(i) + ".tif","w")
b.write(a[i:])
b.close



которая берет ищет побайтно сигнатуру, создает новый файлик и пишет в него с текущей позиции до конца - оно у меня нахреначило 20 гигабайт за 10 минут работы.
половина тифок правда не открывалась - это видимо все таки внутренности тифа. узнать бы как-нибудь ограничение снизу чтоли на тифку.

elenangel

можно попробовать удлинить сигнатуру tif'а а блин, нет. следующий байт у 2 разных тифов уже разный.

BILL64

magic numbers гворит что нельзя )

elenangel

метод пристального взгляда показал, что следующие 4 байта после означеной сигнатуры - это длина файла уменьшенная на 186 = 0xBA байт =)
upd
то есть можно запоминать следующие 4 байта после сигнатуры и при нахождении очередной проверять что offs_current_match-offs_prev_match = int *offs_prev_match+4*+186. как-то так.

BILL64

гм, а откуда взялось 186?)

elenangel

думаю это стандартный размер заголовка tif. и типа первое поле после сигнатуры в заголовке - суммарная длина всех данных, исключая заголовок конечно.

elenangel

а что это за язык? python?

BILL64

угу

BILL64

исправил программку:

a = open("/Users/oberon/tmp/DCD00590.TPS").read

for i in xrange(len(a)-4):
if ord(a[i]) == 0x49 and ord(a[i+1]) == 0x49 and ord(a[i+2]) == 0x2a and ord(a[i+3]) == 0x00:
len_ = ord(a[i+4])*(16**3) + ord(a[i+5])*(16**2) + ord(a[i+6])*16 + ord(a[i+7])
b = open("/Users/oberon/tmp/" + str(i) + ".tif","w")
b.write(a[i:i+len_])
b.close



с учетом вышесказанного. теперь файлики отображаются и меньше размером. сейчас еще доделаю смещение указателя чтобы не было битых тифок

Maurog

у меня получилось 1090 tif
 тут
сделал таким скриптом

dim objConn, strSQL

set objConn=CreateObject ("ADODB.connection")
objConn.ConnectionString="DSN=MyTPS"
objConn.Open

set objRS=CreateObject ("ADODB.Recordset")
strSQL= "SELECT * FROM UNNAMED"
set rs = objConn.Execute(strSQL)


Dim i


i = 0
do while not rs.Eof

Set st = CreateObject ("ADODB.Stream")
st.Type = 1
st.Open

WScript.Echo rs.Fields(5).ActualSize

st.Write rs.Fields(5).Value

i = i + 1
st.Position = 1
Set stCopy = CreateObject ("ADODB.Stream")
stCopy.Type = 1
stCopy.Open
st.CopyTo stCopy

stCopy.SaveToFile "tif_folder/blob" & i & ".tif", 2
stCopy.Close
st.Close

rs.MoveNext
loop

зы: напряг меня первый байт в блобе. его пришлось отрезать :grin:

BILL64

блин, не получается доделать смещение нормально. потому что тогда если в первый раз будет не тиффка а какая-то левая информация произойдет неверное смещение

BILL64

теперь посмотри какой процент из них действительно является тифом )

Maurog

теперь посмотри какой процент из них действительно является тифом )
уже видел)
теперь ты посмотри)

BILL64

dim objConn, strSQL
set objConn=CreateObject ("ADODB.connection")
objConn.ConnectionString="DSN=MyTPS"
objConn.Open
set objRS=CreateObject ("ADODB.Recordset")
strSQL= "SELECT * FROM UNNAMED"
set rs = objConn.Execute(strSQL)
это что такое? неужели ты общаешься с этим файлом как с тпской?

elenangel

все верно, избежать битых тифок при таком способе не удастся, иначе есть шанс пропустить несколько вхождений или даже все.

BILL64

у меня довольно маленький процент. неужели у тебя все нормальные тиффы?

elenangel

теперь посмотри какой процент из них действительно является тифом )
боюсь, у него все являются тифом. он, читер, как базу открыл.

Maurog

это что такое? неужели ты общаешься с этим файлом как с тпской?
ну гугл же сказал, что это база данных
нафига ее реверсить, если можно через ODBC отдрючить? :grin:

BILL64

ну хотелось бы иметь возможность проверять действительно ли это тиффка)

BILL64

бля, а ты можешь мне выдрать оттуда тупо все данные и конвертануть это в ms sql или что-то похожее? )
я этот ебаный odbc driver для tps заебался искать.

elenangel

а ты драйвер ставил дополнительно или ODBC само умеет такое открывать?

BILL64

вот меня тоже удивило. по идее там есть odbc driver, но его днем с огнем не сыщешь.

Maurog

ты драйвер ставил дополнительно
ставил
гугл мне нашел его :grin:

BILL64

да епш. где?
ты можешь сделать о чем я писал выше? )

Maurog

бля, а ты можешь мне выдрать оттуда тупо все данные и конвертануть это в ms sql или что-то похожее? )
вы, конечно, крайне нескромны :grin:
тут
зы: первый столбец - это номер соответсвующего blob*.tif файла
джойните сами с этими tif-ами, ато меня на работе убьют за такой трафик =)

BILL64

а можно еще инструмент? каокй-нибудь бинарник, которому на вход имя файла, а на выход папочка? )
просто таких файликов штук 200
буду ОЧЕНЬ благодарен)

Maurog

да епш. где?
выложил драйверочек тут
вот тут формат TPS для особых извращенцев :grin:

BILL64

а что насчет инструмента? )

Maurog

а что насчет инструмента? )
давайте тоже поработайте! :grin:
а я домой пойду=)

BILL64

да я под винду ни разу в жизни не писал )
под odbc тем более. легче написать клиент по описанию tps файла, но это займет порядочно времени.

Barbie29

не буду оригинален - тебе надо распарсить все теги тифа . тифф он такой, в одном файле может 20 изображений быть.
на перле какомннить или на шелле

conv3rsje

http://www.digitalforensicssolutions.com/Scalpel/
выдает те же 1090 файлов
содержимое не сравнивал, но вроде похоже

Maurog

он работает по тому же принципу, как и упоминавшиеся в этом треде питонные скрипты =)
4Gb ему не хватает для результата
из всех полученных 448 tif валидные только 4 (смотрятся только первый, пятый, шестой и седьмой)
 
E:\Scalpel\scalpel-1.60>scalpel.exe -o f:/resultDir ../DCD00587.TPS
Scalpel version 1.60
Written by Golden G. Richard III, based on Foremost 0.69.

Opening target "E:\Scalpel\DCD00587.TPS"

Image file pass 1/2.
../DCD00587.TPS: 21.0% |**************** | 10.0 MB
../DCD00587.TPS: 41.9% |********************************* | 20.0 MB
../DCD00587.TPS: 62.9% |************************************************** | 30.0 MB
../DCD00587.TPS: 83.8% |******************************************************************** | 40.0 MB
../DCD00587.TPS: 100.0% |**********************************************************************************| 47.7 MB
Allocating work queues...
Work queues allocation complete. Building carve lists...
Carve lists built. Workload:
tif with header "\x49\x49\x2a\x00" and footer "" --> 1090 files
tif with header "\x4d\x4d\x00\x2a" and footer "" --> 0 files
Carving files from image.
Image file pass 2/2.
../DCD00587.TPS: 21.0% |**************** | 10.0 MB
../DCD00587.TPS: 41.9% |********************************* | 20.0 MB
../DCD00587.TPS: 62.9% |************************************************** | 30.0 MB
Error writing to file: f:\resultDir/tif-0-0/00000118.tif -- Broken pipe
Scalpel was unable to write output files and will abort.
This error generally indicates that disk space is exhausted.

conv3rsje

он работает по тому же принципу, как и упоминавшиеся в этом треде питонные скрипты =)
Да я и не спорю :) Я какбэ намекаю, что такого рода вещи уже давно сделаны :)
Что вывод битый - возможно, я особо с ним не колупался. Поставил, прогнал, посмотрел первый - картинка.
Вообще метод выдирания файлов по "похожести" достаточно хороший, я в некоторый момент
восстанавливал базу мускльную, ошибка была порядка трех процентов. Правда, я там записи вынимал,
а не файлы.

BILL64

да хрен с ним с тиффом, тепреь интересно как выдрать hidden rows в бд через odbc driver
Оставить комментарий
Имя или ник:
Комментарий: