从编译的bash脚本中检索纯文本脚本

前段时间,我为我的学校写了一些bash脚本。 我认为保护它们是非常聪明的,所以我把它们编译成二进制文件。 几个星期后,我失去了未编译的脚本,现在我只剩下我的二进制文件了。

有没有办法从shc生成的binarys中取回脚本? 我查看了shc的源代码,find了一种不用运气反编译binarys的方法。

Solutions Collecting From Web of "从编译的bash脚本中检索纯文本脚本"

使用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 $! ) 

睡0.2会给二进制足够的时间启动并解密原始脚本。 变量$! 包含最后一个后台进程启动的pid,所以我们可以用分段错误信号SIGSEGV(和kill -11 $!一样)轻松地杀死它。

 [1] + segmentation fault (core dumped) ./test.sh.x 

现在我们可以搜索原始脚本的转储:

 cat core | strings 

我们将dumpfile中的数据传递给字符串,然后将显示文件中的所有可打印字符,现在我们可以看到垃圾之间的原始脚本:

 ... 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来调整核心文件的大小。 很简单,对吧?

把事情简单化! 🙂

要从shc生成的二进制文件中取回脚本,只保存原始sh系统可执行文件的副本,然后将cat系统可执行文件重命名为sh,然后运行shc生成的二进制文件:)所以,您将在控制台中看到shell脚本的解密源。

只是猜测..你可以记录系统调用使用例如strace或类似的东西,然后尝试恢复至少基本功能。

或者,你可以问问作者( http://www.datsi.fi.upm.es/~frosal/sources/shc.html )。

PS

有传言说有人写了deshc( http://www.linuxjournal.com/article/8256

UnSHc,一个自动脚本来恢复* .sh.x加密文件使用SHC工具加密已在github这里发布。

UnSHc是一个反转任何SHc加密* .sh.x脚本加密的工具。 它基于自动提取嵌入在* .sh.x中的所有加密数据。 使用这些加密数据(用于加密),该工具以明文形式重新生成初始* .sh文件。

如何使用UnSHc:

 [root@server:~/unshc]$ ./unshc.sh -h _ _ _____ _ _ | | | | / ___| | | | | | | |_ __ \ `--.| |_| | ___ | | | | '_ \ `--. \ _ |/ __| | |_| | | | /\__/ / | | | (__ \___/|_| |_\____/\_| |_/\___| --- UnSHc - The shc decrypter. --- Version: 0.6 ------------------------------ UnSHc is used to decrypt script encrypted with SHc Original idea from Luiz Octavio Duarte (LOD) Updated and modernized by Yann CAM - SHc : [http://www.datsi.fi.upm.es/~frosal/] - UnSHc : [https://www.asafety.fr/unshc-the-shc-decrypter/] ------------------------------ [*] Usage : ./unshc.sh [OPTIONS] <file.sh.x> -h | --help : print this help message -a OFFSET | --arc4 OFFSET : specify the arc4() offset arbitrarily (without 0x prefix) -d DUMPFILE | --dumpfile DUMPFILE : provide an object dump file (objdump -D script.sh.x > DUMPFILE) -s STRFILE | --stringfile STRFILE : provide a string dump file (objdump -s script.sh.x > STRFILE) -o OUTFILE | --outputfile OUTFILE : indicate the output file name [*] eg : ./unshc.sh script.sh.x ./unshc.sh script.sh.x -o script_decrypted.sh ./unshc.sh script.sh.x -a 400f9b ./unshc.sh script.sh.x -d /tmp/dumpfile -s /tmp/strfile ./unshc.sh script.sh.x -a 400f9b -d /tmp/dumpfile -s /tmp/strfile -o script_decrypted.sh 

演示视频可以在这里看到(英文和法文)。