Как высчитывается sha256sum при обновлении прошивки YI Lite action camera (LUA дизасемблинг)?

Страницы: 1
RSS
Как высчитывается sha256sum при обновлении прошивки YI Lite action camera (LUA дизасемблинг)?, Помогите разобраться со скриптом обновления прошивки
 
Устройство или ОС, прошивка: YI Lite Action Camera, Linux, ARM

Прошу помощи в дизасемблинге скрипта написанного на LUA и понимании алгоритма расчета hash-суммы. Сама хэш-сумма представляет собой SHA-256 и прописывается в последние 32 байта самого файла прошивки, но она не соответствует sha256sum всего файла, а также файла за вычетом последних 32 байт. Рассчитывается как-то по хитрому. Ниже привожу скрипт обновления, в котором это все и происходит и криво-дизасемблированный файл.

1) Исходник update_sd.lua (LUA, версия 5.3)
2) Мной криво-дизасемблированный файл (update_sd.lua.txt)
 
Одна из возможных технологий в реинжиниринге (reverse engineering) примерно такая:
- находите LUADEC для LUA 5.3
- дисассемблируете Ваш бинарник (опция -dis), результат получается без кривизны, но он в кодах VM LUA - это эталон
- то, что у Вас криво получилось - это декомпиляция (декомпиляторы бывают разные, некоторые иногда даже срабатывают правильно), она пригодится  - ее можно взять за основу для внесения правок
- визуально сравниваете (сопоставляете) тексты дисассемблера и декомпиляции
- при параллельном сравнении находите кривизну в декомпиляции, догадываетесь в чем она и вносите правки в декомпиляцию, обычно это достаточно прозрачно
- декомпиляцию с правками пропускаете через компилятор, получаете бинарник, его дисассемблируете и сравниваете с эталоном (можно визуально, можно программами сравнения файлов), при успехе сравнения - работаете с полученной декомпиляцией (смотрите алгоритм скрипта), при желании ее текст можно сильно подсократить очевидным сворачиванием, получите совсем компактный исходник, но придется контролировать через дисассемблирование и сравнение с эталоном      
- для простых случаев большего не требуется
- если не справились - ищете документацию на коды-инструкции VM LUA (их десятка 4)
- углубляетесь и приходите в состояние просветления, даже находите возможности улучшения качества написания скриптов

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

P.S. Даже если декомпилятор сразу дал правдоподобный текст, его все равно стоит проверить на совпадение с эталоном (по кодам VM LUA)
 
Цитата
Борис Гудылин написал:
Одна из возможных технологий в реинжиниринге (reverse engineering) примерно такая:
- находите LUADEC для LUA 5.3
- дисассемблируете Ваш бинарник (опция -dis), результат получается без кривизны, но он в кодах VM LUA - это эталон
- то, что у Вас криво получилось - это декомпиляция (декомпиляторы бывают разные, некоторые иногда даже срабатывают правильно), она пригодится  - ее можно взять за основу для внесения правок
- визуально сравниваете (сопоставляете) тексты дисассемблера и декомпиляции
- при параллельном сравнении находите кривизну в декомпиляции, догадываетесь в чем она и вносите правки в декомпиляцию, обычно это достаточно прозрачно
- декомпиляцию с правками пропускаете через компилятор, получаете бинарник, его дисассемблируете и сравниваете с эталоном (можно визуально, можно программами сравнения файлов), при успехе сравнения - работаете с полученной декомпиляцией (смотрите алгоритм скрипта), при желании ее текст можно сильно подсократить очевидным сворачиванием, получите совсем компактный исходник, но придется контролировать через дисассемблирование и сравнение с эталоном      
- для простых случаев большего не требуется
- если не справились - ищете документацию на коды-инструкции VM LUA (их десятка 4)
- углубляетесь и приходите в состояние просветления, даже находите возможности улучшения качества написания скриптов

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

P.S. Даже если декомпилятор сразу дал правдоподобный текст, его все равно стоит проверить на совпадение с эталоном (по кодам VM LUA)
Здравствуйте, спасибо за подробный ответ. Luadec необходимой версии уже был опробован, но он, к сожалению, не справляется со stripped кодом, в данном скрипте им можно вытащить только несколько функций, и это не дает лучших результатов, чем при использовании декомпиляции, т.к. вытаскиваются они с большими пропусками и ошибками. К тому же сам скрипт использует расширение luaext, расположение данного файла рядом со скриптом не дает результатов. Я даже собрал это все на ARM эмуляторе, думал проблема в совместимости архитектур, но результат не поменялся.

С языком LUA я не знаком и создал тему, с надеждой сэкономить время и на то, что люди знающие данный язык, легко просмотрят логику и с декомпилированного кода. По факту, что я уже смог разобрать, так это то, что в функцию L14_14 поступает исходный файл прошивки за минусом 32 байта (где прописана sha256sum). Данный файл циклом repeat-until режется на блоки по 4096 байт, пока не станет равным 0, но с какой стороны, не ясно и что происходит с этими блоками дальше пока не понимаю...
 
Добавил дизасемблированный файл с помощью luadec с ключом -s
dis.txt
 
LUA я тоже не знаю, только немного со словарем.

Поэтому примите за гипотезу,
В L14_14 io.popen запускает программу sha256sum в отдельном процессе и возвращает дескриптор файла /tmp/update_sd-getsum.tmp, который можно использовать для записи данных к этой программе.

Кусками по 4К переписывает туда файл прошивки с начала (в L21_21 перед вызовом L14_14 было seek-"set"), по длине, да, за минусом 32 байтов, последний может быть неполным 4К.
Закрывает записанный файл (что сделает sha256sum - даже не догадываюсь) и открывает его для чтения на предмет match("%x+"), что получится, то и вернет в L21_21, но сначала закроет его и удалит
(os.remove("/tmp/update_sd-getsum.tmp")).

Короче, поработал я немного за интерпретатор, разобраться можно, все вроде складывается. Формальные текстовые подстановки. Декомпиляцию можно поджать, сотни 2 строк будет,

P.S. Вам надо на другой форум, здесь больше про расширение LUA для взаимодействия с биржей.  
 
Цитата
Борис Гудылин написал:
LUA я тоже не знаю, только немного со словарем.

Поэтому примите за гипотезу,
В L14_14 io.popen запускает программу sha256sum в отдельном процессе и возвращает дескриптор файла /tmp/update_sd-getsum.tmp, который можно использовать для записи данных к этой программе.

Кусками по 4К переписывает туда файл прошивки с начала (в L21_21 перед вызовом L14_14 было seek-"set"), по длине, да, за минусом 32 байтов, последний может быть неполным 4К.
Закрывает записанный файл (что сделает sha256sum - даже не догадываюсь) и открывает его для чтения на предмет match("%x+"), что получится, то и вернет в L21_21, но сначала закроет его и удалит
(os.remove("/tmp/update_sd-getsum.tmp")).

Короче, поработал я немного за интерпретатор, разобраться можно, все вроде складывается. Формальные текстовые подстановки. Декомпиляцию можно поджать, сотни 2 строк будет,

P.S. Вам надо на другой форум, здесь больше про расширение LUA для взаимодействия с биржей.
Спасибо большое за участие, я тоже до этого всего докопался, удалось "кастрированно" запустить скрипт, и я понял что в "/tmp/update_sd-getsum.tmp" записывается sha256sum конкретного обрабатываемого куска по 4096 байт, а в конце, когда остаток меньше 4096 - sha256 берется от него. В итоге у нас получается листинг sha-256 чексумм в одном файле, который сперва проверяется на предмет match("%x+") - совпадение по hex, а после передается целиком в другую функцию, где с ней работают еще более дремучие функции, сначала происходит string.rep("\000", 16), а дальше вообще ужас...

Простите, я попал на ваш форум из поиска "Форум LUA", т.к. с профильными форумами по данному языку незнаком, не подскажите?
 
То, что производит декомпилятор - LUA только формально. Компилятор или интерпретатор примут его и выполнят все, что в таком скрипте написано.
Но мало кто работает с такими скриптами. Многим они будут непонятны. Они обычно раза в два раздуты в сравнении с оригинальным скриптом, мешает обезличенность, трудности с пониманием замыканий и Upvalue.
Хорошо, когда есть вспомогательные вкрапления, типа имен файлов, каких-то штатных или системных функций, сообщений. Вам повезло, что Вы в целом и в некоторых деталях представляете предметную область и что  декомпилятор не навернулся или не выдал много ошибок, как в последнем dis.txt.
Скорее всего, Вам придется ориентироваться на собственные силы, свою наблюдательность и сообразительность, сопоставление результатов разных декомпиляторов и общие соображения. В тяжелых случаях дойдете и до дисассемблирования (опция -dis в Luadec).
А LUA можно и со словарем.  
 
Цитата
Борис Гудылин написал:
То, что производит декомпилятор - LUA только формально. Компилятор или интерпретатор примут его и выполнят все, что в таком скрипте написано.
Но мало кто работает с такими скриптами. Многим они будут непонятны. Они обычно раза в два раздуты в сравнении с оригинальным скриптом, мешает обезличенность, трудности с пониманием замыканий и Upvalue.
Хорошо, когда есть вспомогательные вкрапления, типа имен файлов, каких-то штатных или системных функций, сообщений. Вам повезло, что Вы в целом и в некоторых деталях представляете предметную область и что  декомпилятор не навернулся или не выдал много ошибок, как в последнем dis.txt.
Скорее всего, Вам придется ориентироваться на собственные силы, свою наблюдательность и сообразительность, сопоставление результатов разных декомпиляторов и общие соображения. В тяжелых случаях дойдете и до дисассемблирования (опция -dis в Luadec).
А LUA можно и со словарем.
Это точно, я уже заметил, по нескольку раз переопределяются переменные) Передо мной стоит задача залить мою мод прошивку в данную экшн камеру, но при обновлении не прохожу проверку, попробую декомпилированную версию адаптировать чтобы получать итоговую строку, которую нужно будет занести в прошивку, надеюсь получится, еще раз спасибо за помощь.
Страницы: 1
Читают тему
Наверх