Некоторое время назад я написал несколько сценариев bash для своей школы. Я подумал, что было бы очень разумно «защитить» их, поэтому я скомпилировал их с помощью shc
в двоичный файл. Несколько недель спустя я потерял некомпилированные скрипты, и теперь у меня остались только мои двоичные файлы.
Есть ли способ вернуть скрипты из бинарных файлов, сгенерированных shc
? Я просмотрел исходный код shc
, чтобы найти способ декомпилировать двоичные файлы безуспешно.
Использование shc для компиляции ваших скриптов не защищает их. Вы не получите больше безопасности таким образом. Скомпилированный с помощью shc двоичный файл расшифровывается и загружает скрипт в память при запуске. Затем, сразу после запуска двоичного файла, вы можете просто выполнить segfault и извлечь свой сценарий из coredump.
Вот небольшой пример скрипта test.sh:
#! /bin/bash
echo "starting script and doing stuff"
sleep 1
echo "finished doing stuff"
Скомпилируйте его с помощью shc:
shc -f test.sh
Запустите его как фоновый процесс и сразу же выполните segfault:
./test.sh.x& ( sleep 0.2 && kill -SIGSEGV $! )
sleep 0.2 даст бинарнику достаточно времени для запуска и расшифровки исходного скрипта. Переменная $! содержит pid последнего запущенного фонового процесса, поэтому мы можем легко убить его сигналом segmentation fault SIGSEGV (аналогично kill -11 $!).
[1] + segmentation fault (core dumped) ./test.sh.x
Теперь мы можем искать в дампе оригинальный скрипт:
cat core | strings
Мы передаем данные из дамп-файла в strings, который покажет нам все печатаемые символы в файле, и теперь мы можем увидеть оригинальный скрипт между мусором:
...
4.0.37(2)-release
BASH_VERSINFO
BASH_VERSINFO
release
i686-pc-linux-gnu
BASH_EXECUTION_STRING
BASH_EXECUTION_STRING
#! /bin/bash
echo "starting script and doing stuff"
sleep 1
echo "finished doing stuff"
1000
EUID
EUID
1000
...
Если скрипт довольно большой, возможно, вам придется отрегулировать размер основного файла с помощью ulimit. Довольно просто, верно?
Просто предположите ... вы можете записывать системные вызовы, используя, например, strace или что-то подобное, а затем пытаться восстановить хотя бы базовую функциональность.
Или вы можете спросить автора shc ( http://www.datsi.fi.upm.es/~frosal/sources/shc.html ).
PS
Ходят слухи, что кто-то написал deshc ( http://www.linuxjournal.com/article/8256 )