Использование shc для компиляции ваших скриптов не защищает их.Вы не получаете больше безопасности таким образом.Скомпилированный двоичный файл shc расшифровывает и загружает скрипт в память при запуске.Затем вы можете сразу после запуска бинарного файла просто выполнить его сегрегацию и извлечь свой скрипт из 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 последнего запущенного фонового процесса, поэтому мы можем легко уничтожить его с помощью сигнала ошибки сегментации SIGSEGV (аналогично kill -11 $!).
[1] + segmentation fault (core dumped) ./test.sh.x
Теперь мы можем искать в оригинале дампscript:
cat core | 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.Довольно просто, правда?