scripting - resueltos - ¿Cómo compilar un script de shell de Linux para ser un ejecutable independiente*binario*(es decir, no solo, por ejemplo, chmod 755)?
scripts bash ejemplos (7)
Estoy buscando un conjunto de herramientas de código abierto que compile varios lenguajes de script "clásicos", por ejemplo, Korn Shell, ksh, csh, bash, etc. como un ejecutable, y si el script llama a otros programas o ejecutables, para ellos para ser incluido en el ejecutable único.
Razones:
Ofuscar el código para la entrega a un cliente para no revelar nuestra Propiedad Intelectual - para ser entregado en la máquina / sistema del cliente para el cual no tengo control sobre los permisos que puedo establecer con respecto al acceso, por lo que el archivo del programa debe ser binario por lo que el funcionamiento no se puede ver fácilmente al verlo en un editor de texto o visor de
hexdump
.Para hacer un programa simple, simplemente implementado para el cliente sin / o una cantidad mínima de dependencias externas.
Preferiría algo simple sin la necesidad de administrador de paquetes ya que:
No puedo confiar en el conocimiento del cliente para llevar a cabo las instrucciones de (des) empaquetado y
No puedo confiar en las políticas que rigen sus máquinas con respecto a la instalación de paquetes (y de hecho de terceros).
El enfoque preferido más simple es poder compilar en un código de máquina adecuado un único ejecutable que se ejecutará sin ninguna dependencia.
La solución que satisface completamente mis necesidades sería SHC, una herramienta gratuita, o CCsh, una herramienta comercial. Ambos compilan scripts de shell para C, que luego se pueden compilar utilizando un compilador de C.
Enlaces sobre SHC:
- https://github.com/neurobin/shc
- http://www.datsi.fi.upm.es/~frosal/
- http://www.downloadplex.com/Linux/System-Utilities/Shell-Tools/Download-shc_70414.html
Enlaces sobre CCsh:
Opciones que están disponibles para usted:
Escriba una lógica en su código que, cuando el código se ejecuta por primera vez en un recuadro, verifique si todos los paquetes requeridos existen. Y si no lo hacen, el código automáticamente obtendrá los paquetes y los instalará ... sin pedirle al usuario que haga nada. La única pregunta que debe hacerse al usuario es "¿Está bien proceder con la instalación de los paquetes antes mencionados? (S / N)". Cualquier cosa fuera de eso es demasiado.
Una vez que se complete el código anterior (sí, sé que puede que no sea tan fácil codificarlo, o puede ser que no conozca sus capacidades de codificación), copie y pegue el código completo en un sitio como kinglazy.com y se kinglazy.com un archivo ejecutable real para usted.
Hay bastantes beneficios de esta opción particular:
- Sí, podrá ejecutar la versión encriptada de su script sin exponer ninguna información propietaria.
- Nadie puede tratar de "ver" su secuencia de comandos, porque si lo hacen, verán nada más que una jerga indescifrable y encriptada que no tiene sentido para ellos.
- Nadie puede intentar modificar su secuencia de comandos porque si lo hacen, la secuencia de comandos se volverá inmediatamente inoperable.
- Nadie puede ejecutar un depurador en su secuencia de comandos para ver cómo funciona. Si lo hacen, el script abortará.
- Además, nadie puede crear copias de su secuencia de comandos en el mismo servidor. Si lo hacen, abortará y no funcionará. Solo permitirá a los usuarios crear enlaces simbólicos a la ubicación original donde quiera que esté el script.
Puede que me falten algunas cosas en lo que pediste, pero creo que lo anterior satisface una buena parte de lo que querías.
No estoy seguro de si esto funciona en otras secuencias de comandos, pero ciertamente lo hace para las secuencias de comandos de shell.
Puedes ofuscar los guiones de shell con algo como ofbsh . Sin embargo, no se pueden agrupar fácilmente otros programas en un solo ejecutable para Unix. Normalmente, el enfoque para la instalación sería agrupar un paquete para el administrador de paquetes de su plataforma (por ejemplo rpm, deb, pkg ) o para proporcionar un tarball para desentrañar en el directorio apropiado.
Si necesita un archivo ejecutable que descomprima los contenidos, es posible que pueda usar un archivo de shell. Eche un vistazo a los documentos para shar(1) y vea si obtendrá lo que quiere
Si realmente necesita una capacidad de scripting para unir múltiples programas C, eche un vistazo al lenguaje Tcl. Tiene una API diseñada para envolver trivialmente los programas C que esperan ver los parámetros de estilo argv[]
. Incluso puede incrustar los fragmentos de código C en un intérprete Tcl personalizado y pegarlo junto con varios scripts Tcl.
Si realmente necesita hacerlo opaco, podría cifrar los scripts tcl y envolver todo en algo que desencripta los scripts tcl en un búfer y luego ejecuta el intérprete Tcl en ellos. Tcl puede aceptar scripts desde un archivo o un búfer char*
, de modo que los scripts no encriptados nunca tengan que golpear el sistema de archivos.
Puedes usar esto: http://megastep.org/makeself/
Esto genera un script de shell que extrae automáticamente un archivo tar.gz incluido en el directorio temporal, y luego puede ejecutar un comando arbitrario al extraerlo.
Con esta herramienta, puede proporcionar solo un script de shell para el cliente.
Este script luego extraerá sus scripts ofbbs ofuscados y binarios en / tmp, y los ejecutará de forma transparente.
También puede usar la versión gratuita en línea de CCsh para compilar un script de shell en un archivo binario: http://www.comeaucomputing.com/tryccsh/
https://github.com/neurobin/shc
Modifiqué la http://www.datsi.fi.upm.es/~frosal/ original y actualicé a una nueva versión con algunas funciones adicionales y correcciones de errores. Está https://github.com/neurobin/shc .
Ejemplo de uso:
shc -f script.sh -o binary_name
script.sh se compilará en un binario llamado binary_name
Tenga en cuenta que todavía necesita que se instale el shell requerido en su sistema para ejecutar este ejecutable.
arx es un gran paquete y puede integrar un ofuscador en su flujo de trabajo.