如何将linux shell脚本编译为独立的可执行文件* binary *(即不仅仅是例如chmod 755)?

时间:2011-06-21 09:20:25

标签: scripting binary compilation executable obfuscation

我正在寻找一个免费的开源工具集,它将编译各种“经典”脚本语言,例如: Korn Shell,ksh,csh,bash等作为可执行文件 - 如果脚本调用其他程序或可执行文件,则将它们包含在单个可执行文件中。

原因:

  1. 对代码进行模糊处理以便交付给客户,以便不泄露我们的知识产权 - 交付给客户的自己的机器/系统,而我无法控制哪些权限我可以设置关于访问权限,因此程序文件必须是二进制文件,通过在文本编辑器或hexdump查看器中查看,无法轻松查看工作。

  2. 为客户制作一个简单部署的程序,无需/或少量任何外部依赖项。

  3. 我更喜欢简单的东西而不需要包管理器,因为:

    1. 我不能依赖客户的知识来执行(联合国)包装说明和

    2. 我不能依赖管理其机器的策略来安装软件包(实际上是来自第三方)。

    3. 最简单的首选方法是能够将正常运行的单个可执行文件编译为正确的机器代码,而不会产生任何依赖关系。

7 个答案:

答案 0 :(得分:39)

完全符合我需求的解决方案是SHC - 一款免费工具,或CCsh商业工具。两者都将shell脚本编译为C,然后可以使用C编译器进行编译。

关于SHC的链接:

关于CCsh的链接:

答案 1 :(得分:5)

您可以使用此:http://megastep.org/makeself/

这将生成一个shell脚本,该脚本会自动将捆绑的tar.gz存档提取到临时目录中,然后在提取时运行任意命令。

使用此工具,您只能向客户端提供一个shell脚本。

然后,此脚本将 ofbsh 混淆的脚本和二进制文件解压缩到/ tmp中,并以透明方式运行它们。

答案 2 :(得分:4)

您可以使用something like ofbsh对shell脚本进行模糊处理。但是,您不会轻易地将其他程序捆绑到unix的单个可执行文件中。通常,安装方法是为平台的软件包管理器(例如rpm, deb, pkg)添加一个软件包,或者提供一个tarball来解析相应的目录。

如果您需要一个解压缩内容的可执行文件,您可以使用shell存档。看一下shar(1)的文档,看看是否能得到你想要的东西

如果您确实需要脚本功能来将多个C程序粘合在一起,请查看Tcl语言。它有一个API,旨在简单地包装期望看到argv[]样式参数的C程序。您甚至可以将C代码块嵌入到自定义Tcl解释器中,并将其与各种Tcl脚本粘合在一起。

如果你真的需要使它变得不透明,你可以加密tcl脚本并将整个内容包装在一个未解密tcl脚本到缓冲区的东西中,然后在它们上面运行Tcl解释器。 Tcl可以接受来自文件或char*缓冲区的脚本,因此未加密的脚本永远不必访问文件系统。

答案 3 :(得分:2)

shc

我修改了原始source并升级到新版本,其中包含一些功能添加和错误修复。 它是here

示例用法:

shc -f script.sh -o binary_name

script.sh 将编译为名为 binary_name 的二进制文件

请注意,您仍需要在系统中安装所需的shell才能运行此可执行文件。

答案 4 :(得分:1)

arx是一个很棒的捆绑工具,您可以在其工作流程中集成混淆器。

答案 5 :(得分:1)

您可以使用的选项:

  • 在代码中编写一个逻辑,当代码首次在一个盒子上运行时,它会检查是否存在所有必需的包。如果他们不这样做,代码将自动获取包本身并将安装它们...而不要求用户做任何事情。用户需要问的唯一问题是“是否可以继续安装上述软件包?(Y / N)”。除此之外的任何事情都太多了。

  • 上面的代码完成后(是的,我知道你编写代码可能不是那么简单,或者可能就是这样,我不知道你的编码能力),复制和将完成的代码粘贴到kinglazy.com这样的网站,将为您生成实际的可执行文件。

这个特殊选项有很多好处:

  • 是的,您将能够运行脚本的加密版本,而不会泄露任何专有信息。
  • 没有人可以尝试“查看”你的剧本,因为如果他们这样做,他们只会看到无法解读的加密术语,这些术语对他们来说都没有意义。
  • 没有人可以尝试修改您的脚本,因为如果他们这样做,脚本将立即无法运行。
  • 没有人可以在您的脚本上运行调试器以查看它是如何工作的。如果他们这样做,脚本将中止。
  • 此外,没有人可以在同一台服务器上创建脚本的副本。如果他们这样做,它将中止,将无法工作。它只允许用户创建符号链接到您希望脚本所在位置的原始位置。

我可能会错过你所要求的一些东西,但我相信上述内容可以满足你想要的一部分。

不确定这是否适用于其他脚本,但它确实适用于shell脚本。

答案 6 :(得分:-1)

您还可以使用CCsh的免费在线版本将shell脚本编译为二进制文件: http://www.comeaucomputing.com/tryccsh/