Навыки написания шаблонов и работы в hex-редакторе 010 Editor — Часть II

  • Tutorial
В первой части цикла статей мы рассмотрели пример исследования файла в hex-редакторе (с самой минимальной аналитикой) и базовые возможности написания шаблонов в 010 Editor. Углубим знания, ознакомившись с рядом других полезных возможностей 010: использованием функций по аналогии с С и API для подсветки hex-кода.



Функции (C-like)


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



Такое представление при анализе файла не очень удобно и наглядно, хотелось бы сразу видеть результат в байтах (1 блок данных = 2048 байт). Ситуация хороша для применения функций — аналогично C. Напишем простую функцию для умножения исходного DWORD-значения на 2048 (0x800) и получения результата в виде строки.

string BlockInBytes_Read (DWORD dwSizeInBlocks) {
  local string strSizeInBytes;
  SPrintf (strSizeInBytes, "0x%x", dwSizeInBlocks*2048);
  return strSizeInBytes;
};

Обратим внимание, что в синтаксисе шаблонов 010 Editor предусматривается тип string — таково небольшое, но полезное расширение стандарта С. Также заметим, что в 010 все поля и переменные, которые используются в пределах шаблона, но не распространяются на файл (т.е. не являются описанием его конкретного содержимого, а нужны для «промежуточных расчетов»), необходимо помечать как local.

Суть функции не должна вызвать затруднения: объявляем локальную переменную strSizeInBytes типа string, используем форматирование и получаем из dwSizeInBlocks, домноженного на 2048, итоговое значение значение в strSizeInBytes («0x%x» — шестнадцатеричное форматирование), после чего возвращаем его в результат функции.

Теперь можно использовать данную функцию как параметр для чтения поля в структуре «item»:

typedef struct item{
  DWORD dwOffset <read=BlockInBytes_Read>; // чтение поля осуществляется через функцию BlockInBytes_Read 
  DWORD dwFileSize <read=BlockInBytes_Read>; // чтение поля осуществляется через функцию BlockInBytes_Read
  char strFileName[24];   
};

Таков синтаксис 010 Editor, все-таки явно не С в чистом виде, а нечто на его основе, с полезными расширениями. У любого поля (да и просто любой переменной) можно указать функцию чтения как <read=название_функции>.

Результат:


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

Подсветка hex-данных


Ориентироваться в кусках шестнадцатеричного hex-кода, даже держа перед глазами шаблон и таблицу Template Results, все же довольно затруднительно, ибо невозможно определить сходу и «на глаз» за что отвечает тот или иной фрагмент (не смотря даже на то, что он уже исследован и описан). Поток непонятных цифр и символов создает определенно серую и унылую картину (даже удачно подобранная цветовая схема тут не поможет, кстати ее можно поменять в: View>-Highlighting->Edit Highlights).

В идеале должно быть так, что просто взглянув на фрагмент hex-кода можно было сразу догадаться, в чем его назначение, вплоть до деталей. Помочь в этом призвана еще одна полезная возможность шаблонов 010 Editor — подсветка определенных hex-данных.

Вернемся к рассматриваемому примеру:


Сама по себе нам эта картинка ни о чем не говорит. Ну, разве что симметрично повторяющиеся записи «radar» вносят некоторое понимание о таблице файлов, и все равно убери правую часть окна с ACSII — понимание исчезнет вовсе.

Другое дело, если после запуска шаблона hex-код будет выглядеть так:


Я настроил отрисовку заголовка зеленым, а полей размера файла и смещения из списка описаний файлов — фиолетовым. Сделать это просто, достаточно использовать в коде шаблона функцию SetBackColor. Перед заголовком достаточно надписать SetBackColor(0x50FF50), а перед полями размера и смещения — SetBackColor(0xFFC0C0), не забыв и про «переключение» назад на белый цвет SetBackColor(0xFFFFFF).

Небольшая мелочь, а существенно облегчает ориентирование в hex-коде, появляется возможность читать его «с листа» даже без использования Template Results. На практике так бывает очень полезно разграничивать исследованную и неисследованную части путем подсветки описанных структур.

Вывод


Итоговый код шаблона 010 Editor (расширение кода из урока 1, добавлено использование функций и подсветка hex-кода):

string BlockInBytes_Read (DWORD dwSizeInBlocks) {
  local string s;
  SPrintf (s, "0x%x", dwSizeInBlocks*2048);
  return s;
};

typedef struct header{
  SetBackColor (0x50FF50);
  DWORD dwVersion; 
  DWORD dwItemCount; 
  SetBackColor (0xFFFFFF);
};

typedef struct item{
  SetBackColor (0xFFC0C0);
  DWORD dwOffset <read=BlockInBytes_Read>;
  DWORD dwFileSize <read=BlockInBytes_Read>;
  SetBackColor (0xFFFFFF);
  char strFileName[24];   
};

header m_header;
item m_item[m_header.dwItemCount];

Запустите этот код на нашем «учебном» файле и испробуйте еще одну полезную функцию: щелкните правой кнопкой мыши по «Template Result» и выберите «Export CSV», полученную таблицу можно легко анализировать в Excel.

На этом краткий экскурс в hex и шаблоны 010 заканчивается. В принципе, для решения базовых и наиболее частых задач полученных навыков должно хватить. В следующем уроке перейдем к более сложным возможностям 010 Editor и серьезным примерам.

С уважением, Dageron.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 7

    +1
    Я что-то не нашел в хелпе к редактору и поэтому спрошу Вас тут: А можно ли в скрипте написать расшифровку данных? Если да, то есть ли готовые библиотеки к примеру RC4?
      0
      Возможности подключения готовых библиотек (в понимании *.dll или объектных модулей) в 010 нет, «подключить» можно только самописный код в синтаксисе 010: *.bt (шаблоны/templates) и .1sc (скрипты/scripts), есть поддержка #include.

      Теоретически расшифровку можно запихнуть в *.1sc-скрипт, но даже если оригинал на С, код все равно придется переписывать. На сайте разработчиков есть некоторые примеры скриптов, но все они относительно простые.
        +1
        Извините за глупый вопрос, я правильно что редактор позволяет проверить два файла на совпадение по полям структур?
        Рисунок с офиц.сайта
        Содержимое
        image
          –1
          Нет
            0
            Не совсем, это просто сравнение файлов на предмет повторяющихся (одинаковых в обоих) фрагментов. Т.е. поля структур тут не важны, никаких шаблонов или скриптов могло не применяться (хотя эту функцию можно вызвать и через скрипт).
        +3
        Я настроил отрисовку заголовка зеленым, а полей размера файла и смещения из списка описаний файлов — фиолетовым. Сделать это просто, достаточно использовать в коде шаблона функцию SetBackColor. Перед заголовком достаточно надписать SetBackColor(0x50FF50), а перед полями размера и смещения — SetBackColor(0xFFC0C0), не забыв и про «переключение» назад на белый цвет SetBackColor(0xFFFFFF).

        В 010 есть куда более компактный способ формирования вывода в листинге и подсветки в окне редактирования:
        uint magic<format=hex,fgcolor=0x6CEF9C,bgcolor=cBlack>;
        

        В разделе справки «Declaring Template Variables» есть полное описание.
          0
          Про bgcolor/fgcolor в атрибутах как-то и забыл, привычка использовать SetBackColor/SetForeColor только потому, что строчки с ними можно быстро закомментировать или переставить в нужное место кода, проще чем убирать или комментировать часть содержимого <...>. Для полноты картины полезно.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое