|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.03.2013, 23:10 | #1 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 16
|
File Ripper
Всем привет. Заинтересовала тема для поиска файлов внутри файла. В данном случае интересует поиск только MPEG Layer 3 (т.е. mp3). Как его искать - без понятия. Нужна программа типа HyperRipper или MultiExtractor.
Вообще не понимаю, как детектить mp3. По чем? Есть ли какая то последовательность байт, чтобы можно было понять, что это именно mp3, а не какая то ерунда? Как это делается вообще? |
09.03.2013, 23:35 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Ну да, берутся уникальные подписи файлов. Для типизированных файлов достаточно найти его "шапку", а в шапке обычно прописана длинна в байтах. Читаем длину - прочитанная шапка = сколько надо ещё прочитать чтобы получился MP3 фай, читаем, склеиваем с шапкой и кидаем в папку. Все.
Поиск по HEX сигнатурам я поднимал(гуглим по форуму). Алсо смотрте исходники Dragon's Unpacker'а. Там есть HyperRipper. |
09.03.2013, 23:38 | #3 | |
Пользователь
Регистрация: 10.05.2012
Сообщений: 16
|
Цитата:
Человек_Борща Как я понял: 1. Открываем файл 2. Ищем шапку 3. Узнаем всю инфу с шапки (layer, pad etc.) 4. Узнаем длину mp3 ((72000 * битрейт) / rate + pad) 5. Меняем позицию в файле на размер mp3 + 1, чтобы искать дальше. Но, собственно ступорюсь на втором пункте. По каким параметрам искать начало фрейма? Что его выделяет среди остальных байт? Последний раз редактировалось Stilet; 10.03.2013 в 00:16. |
|
10.03.2013, 00:17 | #4 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
Итого, высасываем тело пришиваем "голову" и получаем файл. |
|
10.03.2013, 00:43 | #5 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 16
|
В мп3 нет заголовка, только фреймы и теги. В этом весь прикол, что я понятия не имею, по чем искать мп3.
|
10.03.2013, 01:07 | #6 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
хм,
Ищем признак фрейма. Если позади не фрейм, а впереди фрейм, то начинаем читать фреймы пока следующий прочитанный фрейм является правильным фреймом. Если вдруг фрейм стал не правильным, то бросаем цикл а все прочитанное сбрасываем в файл. Цикл While true do. |
10.03.2013, 01:13 | #7 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 16
|
Это я знаю. Но вот как проверять фрейм это или нет?
|
10.03.2013, 11:31 | #8 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Вообще-то внутри файла не может быть другого файла.
По определению. Если бы это было не так, никакой задачи поиска не стояло бы - можно было бы извлечь файл стандартными средствами файловой системы. Внутри файла можеьт быть лишь фрагмент, повторяющий содержимое файла (ФПСФ). Мне представляется более рациональным другой путь. Просто сливать несколько файлов в один без возможности извлечь их обратно вряд ли кто будет. Поэтому информация, позволяющая извлечь все ФПСФ из файла должна храниться где-то поблизости. Вероятнее всего, в самом файле. Вот ее и нужно найти. ФПСФ в исполняемом файле могут быть упакованы как ресурсы. В этом случае их (ресурсы) можно извлечь, ничего не зная об их (ресурсов) внутренней структуре. ФПСФ могут быть объединены в архив, в таком случае где-то должен храниться каталог архива - обычно в конце файла, в его начале или в "парном" файле (парный - обычно имеющий то же название, но другое расширение). |
10.03.2013, 12:18 | #9 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 16
|
Сейчас подробно объясню задачу. Есть архив (не сжатый, т.е. заголовки и пр. сохраняются), в нем много разных файлов, в том числе и mp3. Вот их нужно отделить от остальных и правильно распаковать. Как я думаю это реализовать. В заголовке первого фрейма храниться вся информация (lbitrate, layer and etc.) и с него можно достать полный размер mp3 в байтах. Размер заголовка фрейма составляет 4-и байта. Т.е. нужно сканировать каждые 4-и байта в файле и смотреть, фрейм это или нет. Если фрейм - достаем с него всю инфу и получаем размер mp3, потом перемещаем позицию в файле на (текущая позиция + размер mp3 + 1) чтобы искать дальше. Я прав? Можно ли такое провернуть?
P.S. Вот код, который я смог написать (пока просто получение layer'a): Код:
Последний раз редактировалось RibGeDx; 10.03.2013 в 12:37. |
10.03.2013, 14:31 | #10 |
Пользователь
Регистрация: 10.05.2012
Сообщений: 16
|
Ну что же, вроде я понял, как получать Offset. Но.. как дальше получить размер mp3 в байтах? Вот код:
Код:
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
В чём разница между unit, header file, cpp file? | TwiX | Общие вопросы C/C++ | 6 | 29.04.2012 19:49 |
Почему FILE*, а не FILE | Asker13 | Общие вопросы C/C++ | 2 | 30.03.2011 23:20 |
File | Чуччи | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 10.03.2011 20:00 |
Error 1 fatal error C1083: Cannot open include file: 'iostream.h': No such file or directory | s20 | Общие вопросы C/C++ | 2 | 26.09.2009 23:28 |