Hex editor | Простой Hex редактор



Реп: (321)
Hex editor
версия: 2.6

Последнее обновление программы в шапке: 06.10.2015

Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение


Еще скриншоты
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение



Краткое описание:
Редактирование любых файлов. Поддержка макросов, работа с символьными метками, ...

Описание:
Программа предназначена для отображения и редактирования файлов любого формата и (почти) любого размера. Возможна запись с привилегиями суперпользователя. Отображение настраиваемое, возможна группировка по 1-2-4 байта. На данный момент поддерживаются кодировки US-ASCII, KOI8-R, KOI8-U, UTF-8, windows-1251, UTF-16, UTF-16LE, UTF-16BE. Так же доступна работа с символьными метками, что позволит быстрее и проще обращаться к нужным полям в файле известного вам формата. Более того, в состав редактора входит интерпретатор, позволяющий исполнять произвольные скрипты, отображать результат в графическом виде или же вносить изменения в файл (а точнее в буфер изменений редактора, те результат работы всегда можно будет откатить). Подробнее и больше о возможностях программы вы можете узнать, ознакомившись с инструкцией.

Свои пожелания/предложения/хотелки пишите в тему, отчеты о багах также приветствуются.

Небольшая инструкция
Редактирование
Чтобы приступить к редактированию файла, выделите некий участок, или просто установите "курсор" на нужный вам байт. Можно сделать это и с помощью поиска или диалога символьных меток. Когда будет выделена хотя-бы одна ячейка, появится панель редактирования. С нее вы можете вырезать, копировать или вставить, обрезать файл по позиции курсора (старта выделения) или же просто открыть диалог редактирования. В диалоге редактирования возможно задать как систему счисления, в которой вы зададите значение, так и размерность константы. Вы можете заполнить значениями нужной размерности область выделения. Возможен и откат изменений. Вы можете использовать кнопку Back в action bar, или же аппаратную кнопку назад. Нажатие аппаратной кнопки так же сбрасывает выделение (и прячет панель редактирования).

Поиск
Переход по адресу: просто укажите адрес, по которому хотите перейти или используйте косвенную адресацию (галочка indirect addressing) и укажите размерность адреса в байтах.
Поиск строк: думаю, здесь все понятно. Отмечу лишь, что поиск осуществляется в той кодировке, которая задана в настройках. Поиск далее осуществляется путем включения галочки "After change".
Поиск констант: полагаю, нет необходимости пояснять назначение галочек выбора системы счисления и размера искомой константы. Скажу лишь, что можно использовать также и поиск по шаблону. Неизвестный полубайт при этом задается символом '?', например 80??3344.

Работа с символьными метками
Для работы с метками Hex редактор содержит диалог File structure. Здесь вы можете как создавать метки для конкретного файла (ваши изменения будут запоминаться при закрытии диалога), так и сохранять/открывать шаблоны, которые в дальнейшем можно использовать и для других файлов. Сами метки могут использовать косвенную адресацию, а их размер, адрес, смещение(необходимо там, где адрес считается не с нуля), можно задавать константами или же ссылками на другие метки. Если метка использует косвенную адресацию необходимо задать размер адреса в байтах. Если в качестве значения одного из полей используется метка, обязательно ставьте галочку Label рядом с соответствующим текстовым полем. При необходимости вы можете использовать косвенно-косвенную адресацию, прописав в поле адреса метку, адресуемую косвенно, которая в свою очередь использует косвенную адресацию.
Теперь коротко о том, зачем это нужно. Например, вы можете сделать шаблон для нужного вам формата. Любую метку можно использовать для перехода в самом редакторе или просмотра значения, не закрывая диалог меток. Таким образом любой файл можно представить в виде набора меток, написанных "человеческим" языком и быстро получать необходимые значения как в текущем файле, так и в других файлах того же формата, если вы сохраните шаблон. Для управления метками в диалоге можно использовать Drug&Drop.

Macro actions, создание действий и привязка к скриптам
Диалог предназначен для создания собственных действий. Открывается с панели редактирования. Чтобы создать новое действие, используйте кнопку Create action. В появившимся диалоге вам нужно задать имя действия (это же название будет носить скрипт, запускаемый создаваемым действием), а так же параметры, которые будут передаваться скрипту при использовании действия (значения 2 текстовых полей, адреса начала и конца выделения в редакторе). Любой из параметров можно включить или выключить. В скрипте параметры будут приняты в той же последовательности. Для упрощения редактор сам вклеит необходимые директивы и параметры, если вы будете открывать его из контекстного меню созданного действия.

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

Зачем это нужно: стандартный диалог редактирования позволяет лишь заменять значения на выделенном участке. Предположим, вам нужно эти значения инвертировать или наложить маску или... Вообщем, Macro actions в помощь..

Встроенный интерпретатор

Препроцессор
На данный момент работа препроцессора ограничивается убиранием комментов (все, что идет после символа ';' до конца строки), а так же двумя директивами: .GLOBAL (см. раздел создание скриптов, принимающих параметры) и .PROGRESS, при использовании которой во время отработки скрипта будет крутиться диалог ожидания (может оказаться полезным для скриптов, запускаемых из Macro actions).

Переменные глобальные, локальные, их объявление
Объявление переменных неявное. Те вы можете написать
input a
или
a=10
и после этого использовать переменную a. Возможно и явное объявление:
dim a=0
или просто
dim a
Это нужно, например, при использовании локальных переменных с тем же названием, что и у глобальных. В этом случае объявлять локальные переменные необходимо явно.

Переменные могут быть как глобальными (доступными везде на протяжении всего выполнения скрипта), так и локальными (доступными в пределах процедуры, в которой они были объявлены). Переменные Не могут иметь те же названия, что и объявленные или встроенные процедуры, а так же названия "служебных" переменных (попадающих в нэймспэйс изначально), вроде SIZE. Более подробно о нэймспэйсе, что входит туда изначально и тд я напишу ниже.

Размерность переменных, как и адресация в hex едиторе 8 байт.

Массивы
В отличие от обычных переменных, массивы объявляются явно. Делается это следующим образом:
array perem[count]
После объявления можно записывать и получать значения по нужному индексу, например:
a=perem[5]
Индексация начинается с нуля. Размерность массива задается при объявлении. Индекс (как при объявлении, так и при последующей работе) можно задавать выражением. Как и обычные переменные, массивы могут быть локальными (доступными лишь в текущей процедуре), так и глобальными.

Размерность каждого элемента массива, как и переменных, 8 байт.

Процедуры, объявления и вызовы
Вы можете объявить процедуру, чтобы вызывать ее в дальнейшем из кода:
sub название_процедуры [параметр1, параметр2, ...]
....
[return]
end sub

Причем заканчивать можно просто end (как вам удобнее). Вызываются объявленные процедуры так же, как и встроенные. Для преждевременного выхода из процедуры используйте return. Процедуры могут возвращать и принимать значения. Если процедура возвращает некое значение, и ее вызов используется в выражении, передаваемые параметры необходимо заключить в скобки. Скобки рекомендуется использовать и при обычном вызове, так как скоро это будет обязательно (пока что будет работать и без скобок) Небольшой пример:
sub proc a, b
return a+b
end sub

b=proc(5, 6)
print b


Действия
Арифметические:
+ сложение
- вычитание
/ деление
* умножение
| or
& and
^ xor

Логические:
== равно
!= не равно
> больше
< меньше
>= больше либо равно
<= меньше либо равно
| or
& and

Так же можно использовать ключевые слова вместо символов:
ADD
SUB
MUL
DIV
XOR
OR
AND

Действия могут выполняться со скобками, например:
a=b+9*(c+d)
При этом действия в скобках в приоритете, за ними умножение/деление, затем делается все остальное. О логических выражениях более подробно я напишу в разделе "организация условий и циклов".


Организация условий и циклов
Начну с описания условий. Условия можно задавать выражениями, например if a < b | c > d. Кроме того выражениями могут быть и сами сравниваемые величины, например if a < d+0xff. Если в таком выражении вам нужно применить and или or, используйте скобки, например if (a&0x0a) < (b+c|0xff) & b > d.

Цикл с условием:
while условие [do]
...
done

Условие:
if условие [then]
....
[else]
....
fi

Несколько пояснений: do и then не обязательны. Можно писать, можно нет, как вам удобнее. Кол-во вложенностей не ограничено (цикл в цикле, условие в условии и тд).


Встроенные функции
"print param1 [,param2]" - Вывод где param1 - значение, которое нужно вывести, а param2(не обязательный параметр) - система счисления(по умолчанию 10)
"input param1" - Диалог ввода значения, где param1 - переменная, в которую введенное значение запишится
"msg param1 [,param2]" - Диалог вывода значения, где где param1 - значение, которое нужно вывести, а param2(не обязательный параметр) - система счисления(по умолчанию 10)

"exec 'scr_name' [,param1, param2,...]" - Исполнение скрипта из кода, первый параметр - название скрипта в виде строки, следующих параметров может быть сколько угодно. В исполняемом скрипте вы будете принимать эти параметры в переменные, определенные директивой .GLOBAL . Подробнее об этом можно почитать в разделе "распаралеленное исполнение"
"fork [param1, param2, ...]" - тот же exec, только без первого параметра. Запускает нить с интерпретатором, исполняющим тот же исходник, из которого был вызван.

"sleep timeout" - Задержка, длительность задается параметром timeout, в милисекундах
"exit" - Прервать выполнение программы
"random perem" - Записать рандомное число в переменную
"width param1" - Записать ширину экрана(точнее используемой области отображения результата) в переменную param1
"height param1" - Записать высоту экрана(точнее используемой области отображения результата) в переменную param1

"point x, y" - Нарисовать точку по координатам, заданным переменными x и y
"line x1, y1, x2, y2" - Нарисовать линию, проходящую через точки, заданные переменными
"rect x1, y1, x2, y2" - Нарисовать четырехугольник
"circle x, y, radius" - Нарисовать круг

"getVal param1, address, count" - Считать в переменную param1 значение, размерностью count из адреса address
"setVal address, count, value" - Записать по адресу address значение value, размерности count
"select start, stop" - Выделить в редакторе область от start до end

"Служебные" переменные, инициализирующиеся автоматически
SIZE - размер открытого файла. Изменяя размер этой переменной, вы измените размер файла при завершении

С появлением новых раздел будет расширяться

Создание скриптов, принимающих параметры
Для принятия параметров введена директива .GLOBAL. После перечисляются параметры. Фактически, при исполнении это будут обычные глобальные переменные, лишь с тем отличием, что при запуске в них попадут значения, которые были переданы. Пример использования:
.GLOBAL val, count, start, stop
stop=stop+1
while start < stop
setVal start, count, val
start=start+count
done

Данный скрипт при запуске заменит значения в выделенной области значением, которое попадет в val, размерностью count. И не стоит забывать о том, что если какой либо параметр не был задан, в переменную по умолчанию запишится 0. Поэтому будте осторожны с запуском таких скриптов из едитора кода, чтобы не уйти в бесконечный цикл. Так же не забывайте, что графические функции (print, point, line, circle, rect) можно применять только при запуске из едитора. Те вызов любой из этих функций в скрипте, исполняемом из Macro action приведет к ошибке. Однако вы можете использовать input и все остальные функции, не связанные с рисованием в таких скриптах.

Распараллеленное исполнение
Вызывая функцию exec вы фактически запускаете еще один thread с интерпретатором, исполняющим скрипт, указанный первым параметром. В тредах так же можно работать с графикой, вызывать инпуты и мессэджи. Можно редактировать файл и делать все то же, что и в основном треде. Ниже я покажу пару простых примеров:
[script1, скрипт, который мы будем запускать руками]
start=0
stop=SIZE
if stop > 10000
stop=10000
fi

count=stop/4

while start < stop
exec 'threadscr', start, start+count
start=start+count
done

[threadscr, второй скрипт, запускаемый из первого]
.GLOBAL start, end
while start < end
; здесь делается что-то полезное
start=start+1
done

То есть из главного скрипта мы запускаем несколько тредов, выполняющих что-то параллельно, при этом каждый будет работать со своим "куском". Теперь другой подход. Все то же самое, но уже в пределах одного скрипта. Сделать это очень просто - вспомним, что если не передавать параметры скрипту при запуске, в .GLOBAL переменные запишутся нули. Вот и будем проверять на ноль, чтобы понять основной это тред или нет:
.GLOBAL thread, start, end

; это будет происходить в "основном треде"
if thread == 0
start=0
stop=SIZE
if stop > 10000
stop=10000
fi

count=stop/4

while start < stop
exec 'script', 1, start, start+count
start=start+count
done
exit ; после запуска тредов, завершим основной тред
fi

; а здесь пойдет сама обработка, то, что нужно запихать в нити
while start < end
; здесь делается что-то полезное
start=start+1
done

К примеру, так это можно реализовать в пределах одного файла, чтобы не плодить кучу скриптов для одного макроса. В данном случае thread - переменная, которую мы проверяем на ноль, а при вызове exec передаем 1 в качестве соответствующего (первого в данном случае) параметра

Пара примеров
Напоследок приведу несколько скриптов. Можете копировать отсюда, вставлять в редактор кода и жать исполнение. Следующий код выводит значение по указанному адресу в файле:
input addr
getVal val, addr, 1
print val, 16

Теперь завернем этот код в процедуру и вызовем ее:
sub proc
input addr
getVal val, addr, 1
print val, 16
end sub
proc

Теперь давайте заменим значения первых 100 байт(начиная с первого) в файле на значения предыдущих байтов:
i=0
len=SIZE

getVal old, i, 1
i=i+1

if len > 100
len=100
fi

while i < len
setVal i, 1, old
getVal old, i, 1
i=i+1
done


И практическое применение, скрипт, который будет вызываться из Macro action диалога. Сделаем AND с заданным значением над значениями в выделенной области, с указанной размерностью. При этом покрутим диалог ожидания на время выполнения скрипта:
.GLOBAL val, count, start, stop
.PROGRESS

stop=stop+1
while start < stop
getVal a, start, count
a=a & val
setVal start, count, a
start=start+count
done

Напоследок немного порисуем:
a=0
width b
height c
if c < b
b=c
fi

while a < b
point a, a
a=a+1
done

Теперь то же самое, "одной строчкой"
width b
height c
if c < b
b=c
fi

line 0, 0, b, b

И вдогонку - наглядная демонстрация работы с тредами, нарисуем две линии параллельно:
.GLOBAL t

sub paint
a=0
while a < 600 do
point a, a
a=a+1
done
end

sub paintthr
a=600
b=0
while b < 600 do
point a, b
b=b+1
a=a-1
done
end

if t == 0 then
exec 'scr', 1
paint
else
paintthr
fi



Если я что-то упустил или у вас возникли вопросы, пишите в тему




Требуется Android: 4.1 и выше
Русский интерфейс: Да

Разработчик: First Row

Скачать: версия: 2.6 Hex editor (Пост #43826747)

Прошлые версии


Сообщение отредактировал First Row - 19.10.15, 21:01



Реп: (321)
Версия 2.2

В диалоге редактирования добавил возможность ввода строк

Теперь режим отображения (группировка байт по 1-2-4) задается из самого Hex редактора, пункт View mode в меню. Так же добавлена проверка на "невозможность" отображения в заданном режиме

Небольшие визуальные доработки

Прикрепленные файлы

Прикрепленный файлhexEdit.apk ( 864.4 КБ )



Реп: (321)
Версия 2.3

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

Прикрепленный файлhexEdit.apk ( 877.52 КБ )


Сообщение отредактировал First Row - 08.10.15, 17:21



Реп: (321)
Версия 2.3.5

Редактор кода подсвечивает синтаксис, а также делает автоподстановку пробелов вначале строк после if, while и тд. Подсветку синтаксиса, как и подстановку пробелов можно отключить в настройках.

Прикрепленный файлhexEdit.apk ( 881.08 КБ )



Реп: (321)
Версия 2.4

Появилась возможность создавать собственные действия - диалог Macro actions, открывается с панели редактирования. Вы можете создавать собственные кнопки, привязывать их к скриптам, задавать передаваемые скрипту параметры. В скриптах появилась возможность задавать входные параметры.

Интерпретатор обзавелся небольшим препроцессором. Теперь в коде скриптов возможны комментарии(символ ';'), а так же 2 директивы - .PROGRESS(показывать диалог ожидания во время исполнения) и .GLOBAL(для задания принимаемых скриптом значений). Так же добавились 2 встроенные функции - select (выделение участка в hex редакторе) и sleep (задержка). Более подробно обо всем напишу в инструкции.

Небольшие оптимизации в интерпретаторе, циклы while будут выполняться несколько быстрее (хотя едва ли это будет заметно визуально).

Доработки в редакторе кода, отступы после fi, done, end подставляются те же, что и на "открытии" условий, циклов, процедур. Так же возможность просто сохранить или сохранить как.

UPD: перезалил APK из-за ошибки в редакторе кода, который "неправильно" сохранял скрипты в этой версии.

Прикрепленный файлhexEdit.apk ( 892.52 КБ )


Сообщение отредактировал First Row - 11.10.15, 19:03



Реп: (321)
Версия 2.4.5

Интерпретатор научился работать с массивами (подробнее в инструкции). Теперь можно в любой момент прервать работу интерпретатора (не страшно зациклиться). Добавил встроенную функцию показа диалога с сообщением, а так же заменил диалог input'а. Небольшие исправления и оптимизации.

Прикрепленный файлhexEdit.apk ( 896.37 КБ )



Реп: (321)
Версия 2.4.6

Исправлена ошибка в интерпретаторе при обработке массивов с индексом, задаваемым выражением

Прикрепленный файлhexEdit.apk ( 896.44 КБ )



Реп: (321)
Версия 2.5

Множество исправлений и доработок в hex отображалке. Думаю, обновленные скриншоты отобразят разницу лучше, чем описание

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

Прикрепленный файлhexEdit.apk ( 897.47 КБ )


Сообщение отредактировал First Row - 15.10.15, 16:38



Реп: (321)
Версия 2.6

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

Добавил темную тему в hex редакторе. Где то все еще возможны недоработки (подсветкой синтаксиса в темной еще не занимался), однако пользоваться можно. Переключается в настройках. После переключения темы необходимо выйти из приложения и снова в него войти.

Оптимизации в механизмах подсветки выделения/редактированных ячеек.. Увеличение скорости заметно даже на глаз.

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

Прикрепленный файлhexEdit.apk ( 901.27 КБ )


Сообщение отредактировал First Row - 19.10.15, 20:59



Реп: (4035)
M
Тема закрыта. Продолжение Macro HEX Edit


Полная версия   Текстовая версия

Помощь   Правила

Сейчас: 04.10.23, 00:02