Как перевернуть hex файл

Обновлено: 07.07.2024

Здесь мы рассмотрим работу с Hex-данными на примере использования самого популярного Hex-редактора - WinHex.

Итак начнём:

1. Начало:
Открываем наш файл в редакторе WinHex, самый простой способ - открыть файл из контекстного меню проводника, щёлкаем правой кнопкой мыши на нашем файле и выбираем "Редактировать в WinHex" или "Open with WinHex" зависит от того какая у вас версия WinHex. Откроется окно редактора, в левом окне мы видим Hex-значения, в правом окне текст зашитый в теле программы и код программы.

2. Поиск нужного текста:
По умолчанию, при запуске в WinHex метка стоит в окне Hex-данных, но так как нам нужен текст ставим метку в самый верх правого текстового окна. Заходим в поиск текста, вводим искомое слово, ставим галку в чекбоксе "Слово целиком" (иначе придётся долго ползать по всему окну) и нажимаем "ОК". Редактор находит первое слово (по направлению сверху - вниз). Если это не наше слово (одинаковых слов будет много) жмём F3 и идём дальше до тех пор пока не доберёмся до нужного нам слова.

Например переведём слово "Applications" в программе на снимке ниже.

3. Перевод:
Выделяем найденное слово (блок), жмём Strl + С или "Правка" > "Копировать блок" > "Обычно", переводим его в переводчике, в нашем случае это - "Приложение" и вводим вместо "Applications". У нас остаётся два лишних знака (буквы), переставляем метку в левое окно Hex-значений на значение первой лишней буквы и жмём на "0" забиваем нулями обе лишние буквы. Жмём "Сохранить", сворачиваем окно редактора (выходить из него не надо) и запускаем нашу программу. Проверяем, если всё в порядке, ищем и переводим следующее слово, если же что то не так то разворачиваем окно редактора и жмём Strl + Z до тех пор пока не восстановятся оригинальные значения (отмена).

Лишние знаки:"ns"

Забиваем нулями:

Получаем результат:

Примечание:
Нули принимают не все программы, в этом случае забиваем лишние знаки пробелами. И наоборот, некоторые программы не принимают пробелы, на их месте отображаются вертикальные чёрточки.

4. Удлинение слова:
Переведём на примере слова "Explorer". Это слово переводится как "Проводник", как видим в нём на один знак больше, поэтому нам надо его удлинить. После слова "Explorer" идут нулевые значения, на их место можно вводить дополнительные знаки, главное чтобы между последним знаком и кодом программы (разделитель и т.д.) было не менее одного нуля.

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

И в дополнение:
Не закрывайте WinHex, пока не убедитесь что всё нормально, просто сворачивайте его окно и проверяйте файл, иначе после закрытия редактора вам не удастся отменить изменения и придётся ковыряться вручную, (поиск, редактирование).

JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Только в ассемблер, кстати, и можно. По крайней мере, однозначно.

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

Только листинг будет плохо читаем за счет конструкций типа jmp PC+0x0D, out 0x32,0x04 и т.п. Так что геморроя избежать не удастся.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

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

Не обязательно. Обычной Студией с небольшими плясками можно вытащить исходник из HEX, ну а потом, кончно, доработка напильником : вменяемые имена переменных, метки и т.д.

Приглашаем всех желающих 25/11/2021 г. принять участие в вебинаре, посвященном антеннам Molex. Готовые к использованию антенны Molex являются компактными, высокопроизводительными и доступны в различных форм-факторах для всех стандартных антенных протоколов и частот. На вебинаре будет проведен обзор готовых решений и перспектив развития продуктовой линейки. Разработчики смогут получить рекомендации по выбору антенны, работе с документацией и поддержкой, заказу образцов.

Так это, Студия - всего лишь IDE. Она полюбому запускает соответствующий модуль дизассемблера.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.

Приглашаем 30 ноября всех желающих посетить вебинар о литиевых источниках тока Fanso (EVE). Вы узнаете об особенностях использования литиевых источников питания и о том, как на них влияют режим работы и условия эксплуатации. Мы расскажем, какие параметры важно учитывать при выборе литиевого ХИТ, рассмотрим «подводные камни», с которыми можно столкнуться при неправильном выборе, разберем, как правильно проводить тесты, чтобы убедиться в надежности конечного решения. Вы сможете задать вопросы представителям производителя, которые будут участвовать в вебинаре

Иногда возникает необходимость внести изменения в двоичный файл. Для этого используются так называемые hex-редакторы. Цель данного руководства - описать основные методы работы с ними и ответить на наиболее часто задаваемые вопросы.

Содержание

Выбор редактора

Qview pic1.jpg

Qview pic2.jpg

Самым первым обычно возникает вопрос: какой редактор из всего многообразия существующих выбрать. Для изменения нескольких байт можно cмело использовать любой, но при частом или длительном использовании программа должна поддерживать все требуемые функции, быть удобной, быстрой и надежной. Исходя из этого можно рекомендовать к использованию, например, QView. Кроме перечисленных выше cвойств, он обладает следующими:

  • Работает в DOS и Windows
  • Содержит встроенные ассемблер и дизассемблер
  • Поддерживает кодировки текста DOS-866, Win-1251, KOI-8r и определяемые пользователем
  • Имеет широкие возможности настройки
  • Является бесплатным с открытыми исходными кодами

Основное окно QView состоит из заголовка (вверху), рабочей области и панели функциональных клавиш (внизу). Для управления используются клавиатура и мышь. QView позволяет работать с данными в текстовом режиме, режиме шестнадцатеричного дампа и режиме дизассемблера. Режимы последовательно переключаются нажатием Enter или F4 (или щелчком левой кнопки мыши по заголовку в области расположения символов AV/HV/00). Режимы просмотра и редактирования переключаются нажатием Alt-F3 (в текстовом режиме - просто F3). Устанавливаемые после запуска режимы зависят от настроек, которые хранятся в файлах qview.ini, qview.fmg, qview.ehl и для изменения которых в составе пакета есть специальная программа - Q-Setup. Контекстная справка по используемым клавишам вызывается нажатием F1.

Открыть файл в редакторе можно передав его имя в качестве параметра командной строки: qview.exe <filename.ext> (в Windows длинные имена файлов необходимо заключать в двойные кавычки) либо через файловую панель, которая вызывается нажатием Alt-F6 или щелчком мыши по имени файла в заголовке. Для выхода из редактора следует нажать Escape.

Простейшее редактирование

Самая простая задача при редактировании двоичных файлов: заменить значение байта по смещению XXXXХХХХ значением YY. Для этого после открытия файла в редакторе необходимо нажатием Enter переключить вид в режим дампа. В рабочей области в левой колонке указано значение смещения, в центральной части - значения байт в шестнадцатеричном виде, справа - те же значения в виде символов ASCII.

Для установки курсора по требуемому смещению требуется нажать клавишу F5 (или щелкнуть в заголовке мышью по ряду цифр, выделенному красным цветом), ввести значение смещения и нажать Enter. Если режим редактирования не был включен, то следует нажать Alt-F3 (при этом в панели клавиш появится надпись "Edit ON"). После этого можно вносить изменения в файл, набирая значения байт в шестнадцатеричном виде или, переместив курсор в правую колонку нажатием TAB, в виде символов. Курсор позиционируется с помощью обычных клавиш управления или мышью.

Для отмены сделанных изменений cледует установить курсор в месте ошибки и несколько раз нажать F3. Сохранить изменения можно при выходе, нажав W, или принудительно, нажав Alt-F9.

Поиск и замена

Qview pic3.jpg

QView поддерживает поиск в файле определенных байт или строк и поиск по маске. Диалоговое окно поиска вызывается нажатием F7. В поле ASCII можно ввести строку в виде символов, а в поле HEX - в шестнадцатеричном виде. Щелчком мыши можно указать направление поиска ("Forward/Backward"), включить опции различения регистра символов для символьного поиска ("Sensitive") или поиск по маске ("Masking"). В последнем случае символ '?' маскирует соответствующий байт в строке. Например, при поиске "w?r?" будут найдены слова worm, warm, were и т.п. При нажатии Shift-F7 выполняется поиск следующего совпадения.

Для выполнения поиска с заменой необходимо нажать Ctrl-F7. В верхней части окна вводится строка или шаблон для поиска, в нижней - заменяющая строка.

Создание и использование crack-файлов

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

Работа с блоками

Qview pic4.jpg

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

Для сохранения блока в файл необходимо нажать Shift-F2, в появившемся окне указать имя и формат сохраняемого файла (в виде кода - "как есть", дампа или ассемблерного текста) и нажать Enter.

При вставке блока из файла следует аналогичным образом выделить блок, нажать Shift-F3 и в открывшемся окне указать имя файла-источника. При этом размер выделенного блока должен быть равен или меньше размера файла. Альтернативный вариант: установить курсор в позицию, начиная с которой должна быть произведена вставка, нажать Shift-F5 и в открывшемся окне указать имя файла-источника, смещение и длину блока внутри него, откуда требуется взять данные.

Чтобы удалить блок следует отметить его и нажать Shift-F4 или установить курсор в нужную позицию, нажать Ctrl-F5 и указать число удаляемых байт. Для вставки заполненного нулями блока в текущую позицию cледует нажать Ctrl-F4 и указать размер блока. Удалить файла до конца начиная с текущей позиции можно нажав Alt-F10.

При вставке блока, как и в случае с crack-Файлами, изменения сохраняются cразу после внесения.

Ассемблирование и ассемблерный поиск

Qview pic5.jpg

Ассемблирование используется для внесения изменений в алгоритм работы исполнимых файлов. QView поддерживает все команды процессоров Intel 486 и 487. В режиме ассемблера и дизассемблера в рабочей области редактора в первой колонке указано смещение относительно начала файла, во второй - байты инструкции, в третьей - ee мнемоническое обозначение. Для включения режима ассемблирования следует перевести редактор в режим дизассемблера, нажав несколько раз Enter, включить режим редактирования, нажав Alt-F3, и нажать TAB для перемещения курсора в третью колонку. После этого можно вводить инструкции, завершая ввод каждой нажатием Enter.

При необходимости можно, как и в режиме дампа, изменять непосредственно байты во второй колонке. Разрядность кода 16/32 переключается нажатием F2. Отменить изменения можно установив курсор на строку с ошибкой и несколько раз нажав F3.

Для поиска конкретных ассемблерных инструкций следует нажать F6, ввести инструкцию и нажать Enter. Поиск следующего совпадения производится нажатием Shift-F6. Для поиска по шаблону можно использовать следующие специальные символы:

'?' - любой один символ
'*' - любая подстрока до запятой или до конца строки
'$' - поиск числовых констант (ставится перед числом)
'%' - пропуск одного слова
'@' - любая подстрока

Например, "sub bx,*" - поиск всех инструкций вычитания из регистра BX.

Дополнительные функции

Из полезных дополнительных функций QView можно отметить наличие встроенного калькулятора, который вызывается при нажатии Ctrl-F6. Он поддерживает основные арифметические и логические поразрядные операции, скобки для указания приоритета операций, ввод аргументов и вывод результата в системах счисления с основанием 2, 8, 10, 16.

Просмотреть информацию из заголовка исполнимого файла можно нажав F8 в режиме дампа или дизассемблера. Поддерживаются файлы форматов MZ, PE, NE, LX, LE.

Создадим функцию reversed1 с аргументом variable , где variable - переменная, хранящая строку, которую мы хотим перевернуть. Так как строка являются неизменяемым объектом, то создадим отдельную, пока что пустую переменную res , которая в будущем будет хранить результат.

В функцию поместим цикл, который будет "прохаживаться" по каждому из элементов строки. Начнем мы с конца строки, используя положительные индексы, соответственно параметр start функции range - len(variable)-1 . -1 потому, что длина строки всегда на 1 больше, чем индекс последнего ее элемента. Закончить мы должны на первом символе строки, поэтому параметр stop функции range() - -1, поскольку перечисляются числа до значения этого параметра, не включительно. Параметр step - -1, потому что мы считаем в обратном порядке.

Теперь заполним тело цикла - проведем конкатенацию между старым значением res и элементом строки с индексом i . Таким образом, при каждой итерации цикла мы добавляем по одному символу к результату. После окончания цикла вернем результат.

2. Использование цикла со списком в результате

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

Вместо конкатенации можно использовать метод append() , с помощью которого мы добавляем элемент, указанный в качестве аргумента к методу, в конец списка. Итак, мы получили:

Функция пока что возвращает список, состоящий из односимвольных элементов. Если нас это не устраивает, то почему бы не преобразовать список в строку при помощи метода join() ? Сделаем это, добавив конструкцию res=''.join(res) .

3. Рекурсия

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

Начну объяснение с конца. Если мы записали в результат все символы кроме первого, то длина оставшейся строки равна единице и, следовательно, ее нужно вернуть. Получаем:

Но если длина строки больше одного, то нужно вернуть последний из ее элементов и вызвать эту же функцию, но уже отрезав последний символ. Сделать это мы можем с помощью среза variable[:-1] . Обновим картину:

Использование else: здесь необязательно, так как после возвращения чего-либо этой функцией она завершится. Поэтому конструкцию return variable[-1] + reverse3(variable[:-1]) можно поместить напрямую в тело функции. Конечный вариант решения:

4. Использование встроенной функции

В Python 3 встроена специальная функция reversed() , в качестве аргумента она принимает список или строку, а возвращает итератор последовательности значений, состоящей из всех элементов аргумента в обратном порядке.

Простыми словами - недостаточно написать res = reversed(variable) , данные нужно преобразовать в нужный тип (в нашем случае - в строку). Сделать мы это можем при помощи метода join() , соединив последовательность через пустую строку. После выполненных действий возвращаем результат. Код:

5. Срез строки

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

Срез строки - вещь прекрасная, но порой пугающая новичков "уплотненным" синтаксисом. Срез содержит три параметра - [start:stop:step], аналогично функции range() . Подробнее о них вы можете прочитать в других статьях на Хабре.

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

Конечно, никакой магии здесь нет, мы просто перебираем символы с шагом -1, то есть в обратном порядке.

Заключение

Первый и второй способы как нельзя лучше подходят, если во время переворота строки нужно ее изменять. При этом они значительно уступают 4 и 5 способам в скорости. Читаются умеренно хорошо, поэтому в некоторых случаях их уместно использовать.

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

Четвертый способ довольно быстрый, отлично читается и подходит во многих случаях.

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

Читайте также: