«

将bash脚本编译为可执行的二进制文件

时间:2024-2-22 14:01     作者:韩俊     分类: Linux


如果我们想要混淆脚本代码,那么我们可以Shell 脚本编译器工具 (SHC) ,使用 shc 将 bash/shell 脚本编译为二进制文件,隐藏源代码并防止被被人修改的功能。由于在大多数操作系统上默认是不安装的,我们 mac 上可以使用 brew 安装,或在基于 Debian 的 Linux 系统上使用 apt 安装它(即:apt install shc)。或者,我们可以从github下载安装它并运行 make。

SHC代表shell script compiler,即shell脚本编译器。通过SHC编译过的脚本程序对普通用户而言是不读的,因此如果你想保护你的代码(例如含有密钥),则可以考虑SHC;然而有些人可以通过反向编译的方式破解SHC加密过的脚本。

2.静态编译

编译脚本文件,直接执行命令:

CFLAGS=-static shc -r -f phpernote.sh #phpernote.sh 为shell文件

CFLAGS指明为static静态编译,因为默认生成的是动态库,在不同的系统可能运行不了。

-r 是为了生成的脚本二进制可执行程序能在其它的电脑上运行,

-f 参数用于指明要编译的脚本文件.

常用参数:

-e date (指定过期日期)
-m message (指定过期提示的信息)
-f script_name(指定要编译的shell的路径及文件名)
-r Relax security. (可以在相同操作系统的不同系统中执行)
-v Verbose compilation(编译的详细情况)

编译完后会在当前目录中会生成两个文件,phpernote.sh.x 和 phpernote.sh.x.c 。

phpernote.sh.x 是加密后的脚本文件.

phpernote.sh.x.c 是加密后的源文件代码。

如果感觉这个文件名比较奇怪,可以直接 mv phpernote.sh.x phpernote 将其重命名。

3.修改C语言代码并gcc编译

如果后期需要一些修改,也可以自行修改 phpernote.sh.x.c 的源码文件,本身就是是c语言代码,可以自己用gcc进行编译完成,如下图所示 :

gcc -o t phpernote.sh.x.c -static;
gcc -o kacpi_hotplu kacpi_hotplu.x.c -static

4.遇到的问题

当库文件有问题的时候,shc无法自动生成对应的二进制文件.且无提示信息.

当使用gcc进行静态编译过程中遇到报错:
/usr/bin/ld: cannot find -lc ...

搜索libc.so文件,发现在/usr/lib64/目录内.尝试ldconfig重载库文件,依然不行.修改/etc/ld.so.conf配置文件,将/usr/lib64/目录加到最前面,执行ldconfig -v|grep "lib64".依然不行.
尝试安装静态库资源: yum install glibc-static 问题解决.

解决此问题后,重新使用shc命令,则可以不仅生成c语言代码,并同时生成了二进制文件.

5.查看文件属性信息

file kacpi_hotplug*
kacpi_hotplug: Bourne-Again shell script text executable
kacpi_hotplug.x: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.18, stripped
kacpi_hotplug.x.c: ASCII C program text

6.总结

如果你需要保护 Bash 脚本,不被别人知道与修改,那么 SHC 可能是你的最佳选择。它是目前最流行的将 (Bash) shell 脚本转换为可执行程序的免费工具。

不过,shc 编译器生成的二进制程序并不是真正安全的,你仍然可以通过一些努力来重建原始源代码。

编译后的二进制文件仍将依赖于在 shell 代码的第一行(即 shebang)中指定的 shell(即 #!/bin/sh),因此 shc 不会创建完全独立的二进制文件。

shc 也不是 C 编译器之类的编译器,而是对 shell 脚本进行编码和加密,并生成具有附加到期功能的 C 源代码。

标签: linux

热门推荐