Реверс инжиниринг

99
11 июля 2021, 08:50

Доброго времени суток!

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

Данные в текстовом формате из этого бинарного файла умеет доставать программа, написанная на Qt. Может имеет смысл попробовать декомпилировать эту программу, но тогда каким образом найти то место в коде, в котором этот файл читается?

Answer 1

Как просили, немного сумбурный набор советов

  1. Стоит попытаться открыть файл любым шестнадцатеричным редактором. Первое что я пробую делать - открываю файл в стандартном просмотрщике Тотал Коммандера (горячая клавиша F3). Это позволяет сразу увидеть, есть ли в файле текстовые данные, например. Как уже посоветовали в комментариях - можно попробовать открыть файл архиватором.
  2. Можно загнать бинарный файл в IDA Pro (достаточно даже бесплатной версии) и попробовать вручную разметить данные. Изначально все выглядит как массив байт с комментариями там где байт попадает в символьный диапазон.
    • На том что похоже на текст жмем a - если это ascii, а не юникод. Если не ascii, но явно текст - жмем alt+a и выбираем нужную кодировку.
    • На том что похоже на 4-байтные целые числа (например) - три раза жмем d (для однобайтных значений 1 раз, для двухбайтных - 2 раза). В общем, базовые умения пользоваться Идой пригодятся.
  3. Пробуем загонять программу-конвертер в IDA Pro, открываем таблицу импорта, ищем функции связанные с открытием файлов, смотрим ссылки на них (xrefs - cross-references), по одной из (сотни) этих ссылок будет код открытия интересующего вас файла (и иногда просмотр сотни ссылок приносит нужный результат). Также можно поискать функцию диалогового окна открытия файла.
    • В целом, если вы работали с Qt, то названия функций (методов) должны будут вам что-то говорить (если конечно библиотека Qt не прилинкована статически).
    • Если есть какой-то текст, выводящийся на экран сразу после загрузки файла или до нее - можно пробовать искать в исполняемом файле его, потом опять же по ссылкам на этот текст переходим на код, который на него ссылается. Нужно быть готовым к тому, что декомпилятор вам скорее всего никак не поможет, поэтому нужно хотя бы на каком-то базовом уровне знать ассемблер.
    • Это общий принцип - ищем то, за что можно зацепиться (известную функцию или текст), от этого возвращаемся в код.
    • Это все при условии если экзешник ничем не упакован и не зашифрован - для новичка это будет практически непреодолимым препятствием.
Answer 2

Скачайте любой редактор бинарных файлов, например https://www.hhdsoftware.com/free-hex-editor. В таких редакторах есть возможность поиска стандартных числовых типов (int, short, float, double и т.д.) и текстовых строк. Ищите числа или строки, которые там точно есть (Вы их знаете из имеющегося у Вас текстового представления). На бумажке рисуете структуру хранения информации в файле и думаете, как дальше с ней работать. Но все это сработает только если файл не сжат, не зашифрован и еще как-нибудь не модифицирован.

READ ALSO
Не могу наследовать класс QNetworkReply

Не могу наследовать класс QNetworkReply

Всем приветВторой день бьюсь головой и не могу наследоваться от класса QNetworkReply

83
asio::thread_pool + std::promise — почему-то много VSZ

asio::thread_pool + std::promise — почему-то много VSZ

Есть такой простой пример, в котором происходит использование пула на 70 потоков и создание в каждом std::promise:

81
Как поменять цикл while на for?

Как поменять цикл while на for?

я стараюсь не использовать цикл while, потому что он мне не нравитьсяНо мне нужно вызвать функцию ReceiveAndPrint и проверить ее, не равна ли она 0, после...

86
Как перемешать массив таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5?

Как перемешать массив таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5?

Заполнить одномерный массив размером 200 элементов случайными и неповторяющимися числами в диапазоне 1 – 200

118