Yukang's Page

编译脚本到二进制

2019-01-01

缘由

因为自己习惯使用 expect 脚本登录各种服务器,有一段时间因为要登录的服务器太多了,所以之前写过一个程序来管理各种 expect 脚本。实现思路是根据配置文件,用一个程序来动态生成脚本,执行完之后再删除。这样临时生成的文件里也是包含密码等信息的。最近突然想是不是可以直接写一个程序,把所有脚本类的程序转换为二进制可执行文件^image。我不想把密码之类的直接写在固定的脚本里面,所以密码也是被编译在可执行的二进制文件里的,这样能达到一些代码混淆的目的。

image-20190101234053094

rshc 的开发

这个程序看起来有些好玩,所以先我先搜了一下是否之前有其他人这样做过。于是找到了 shc 这个开源程序,这个最初版本是 96 年用 C 写的,最终执行的时候还是用 execvp 调用解释器执行各种脚本。我使用了一下发现居然不支持 expect 之类的。然后想着自己写个玩玩,顺便再动手用用最近看得又心痒的 Rust,最后用搞出来一个初版: rhsc

目前我这个程序只是能把脚本程序,转换为 Rust 代码,然后使用 rustc 来编译为二进制,为了做一些代码混淆,其中也类似 shc 使用了 RC4 算法来做了一个简单的转换,加密用的 key 是随机生成的。然后也做了另外一个增加密码的模式,这样可以为任何脚本增加密码校验功能,最终使用 Process 来执行解释器。当然也谈不上多安全,如果要破解可以使用一些类似 ptrace 或者其他方式来试试。以后我会继续完善这方面的防御。另外,为了在生成代码之后尽量减少依赖,所以目前密码输入时还未做到隐藏输入。

安装使用

使用方式非常简单,先安装:

cargo install rshc

然后使用命令:

rshc -f demo.sh -o demo.rs
// add a passowrd when compile it,
// then binary will prompt for correct password before execution
rshc -f demo.sh -o demo.rs -p

其他

时隔两年再用 Rust 写一些小项目,发现整个语言还是成熟很多:

  • 工具链很好用,特别是 cargo 之类的,从开发到发布都非常方便
  • 相关的库和文档也多了起来,相对来说更加容易上手写一些东西了
  • 编译器的错误提示特别好,可以通过错误索引号找到示例
Tags: Rust