使用shc加密shell脚本

使用shc加密shell脚本

使用

之前为了防止svn认证问题,都是直接把svn的用户名、密码写在脚本里面的。由于明文密码非常不安全,所以必须采取密文保存。
为了不影响原有脚本流程,采用了抽取svn命令为独立脚本,在这个脚本里面写上用户名和密码,并加密保存。

加密采用了shc这个工具进行。该工具采用arc4的方式加密数据,而且比较简单,运行之后会根据输入的脚本(svn.sh)生成两个文件:
svn.sh.x这个是加密后的可执行程序,svn.sh.x.c这个是那个可执行程序的C源码。最终运行只需要前面那个.x结尾的可执行程序即可。

简单说下我的使用,刚开始什么参数都不加,最终生成的.x文件为动态链接,虽然没有什么依赖,但是需要动态链接glibc。由于我本地的
glibc版本远大于服务器上的,所以导致这个文件无法运行,提示找不到GLIBC 2.6找不到。查看了帮助文档之后,可以通过设置CFLAGS
环境变量,修改编译参数,再加上其他参数,最终的命令为:

CFLAGS="-static" shc -v -T -r -f svn.sh

其中通过环境变量,让编译输出的.x文件变成静态链接,这样就不需要依赖主机的任何动态链接库;-v参数输出命令的详细输出;
-T参数增加traceable,让输出的可执行程序可追踪;-r参数生成可分发的二进制程序。

这样原先脚本执行svn,只要直接改成svn.sh.x,去掉原先的用户名、密码,这样密码就被加密保存了。

原理

shc采用arc4加密,在命令中,大致通过
– 处理输入参数
– 读取脚本
– 解析使用的shell
– 生成C源码文件
– 编译C源码文件
这几步完成。在生成源码文件的时候,会对内容进行arc4加密,C源码中重新进行arc4进行解密,最终通过execvp调用运行最终的脚本。

几个参数的大致实现:

-T

如果不设置这个变量,生成的可执行文件将不能被trace

void untraceable(char * argv0)
{
    char proc[80];
    int pid, mine;

    switch(pid = fork()) {
        case  0:
            pid = getppid();
            /* For problematic SunOS ptrace */
            #if defined(__FreeBSD__)
            sprintf(proc, "/proc/%d/mem", (int)pid);
            #else
            sprintf(proc, "/proc/%d/as",  (int)pid);
            #endif
            close(0);
            mine = !open(proc, O_RDWR|O_EXCL);
            if (!mine && errno != EBUSY)
                mine = !ptrace(PTRACE_ATTACH, pid, 0, 0);
                if (mine) {
                    kill(pid, SIGCONT);
                } else {
                    perror(argv0);
                    kill(pid, SIGKILL);
                }
                _exit(mine);
        case -1:
            break;
        default:
            if (pid == waitpid(pid, 0, 0))
                return;
    }
    perror(argv0);
    _exit(1);
}

首先fock一个进程,试图去通过ptrace调用挂载到新fock出来的进程上,如果成功了,说明没有被其他进程trace,则发送SIGCONT信号继续执行,
否则直接发送SIGKILL信号终止进程继续执行。但是在实际使用过程中,不知道为什么,偶尔会让服务器上多出T状态的进程,看上是因为ptrace调用
向进程发送了SIGSTOP之后,再次发送SIGCONT没有成功。因此后面都加上了-T参数,跳过这个不能追踪设置。当前这样会大大降低安全性。

-e

这个参数可以指定可执行程序失效时间,超过这个时间加密后的可执行程序将无法运行。实现也很简单直接把加密后的过期时间放在了生成的C代码前,
执行shell之前,会有

if (date[0] && (atoll(date)<time(NULL)))
    return msg1;

这样的判断,直接阻止程序的运行。

转载自:https://coolex.info/blog/479.html

时间: 2024-08-24 17:49:37

使用shc加密shell脚本的相关文章

使用shc工具加密shell脚本详解_linux shell

Shc可以用来对shell脚本进行加密,可以将shell脚本转换为一个可执行的二进制文件.经过shc对shell脚本进行加密后,会同时生成两种个新的文件,一个是加密后的可执行的二进制文件(文件名以.x结束),另一个是C语言的原文件(文件名以.x.c结束).   下面就说明一下shc的安装,参数,以及使用示例: 下载安装: (官网下载地址: http://www.datsi.fi.upm.es/~frosal/sources/) 复制代码 代码如下: # wget http://www.datsi

linux下利用SHC加密shell教程详解

SHC代表shell script compiler,即shell脚本编译器.通过SHC编译过的脚本程序对普通用户而言是不读的,因此如果你想保护你的代码(例如含有密钥),则可以考虑SHC:然而有些人可以通过反向编译的方式破解SHC加密过的脚本. 下面我们开始介绍: 一.使用SHC加密bash脚本程序 1.下载并编译SHC # wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz # tar xvfz shc-3.8.7.tgz

对Shell 脚本加密的方法_linux shell

用shell脚本对系统进行自动化维护,简单,便捷而且可移植性好. 但shell脚本是可读写的,很有可能会泄露敏感信息,如用户名,密码,路径,IP等. 同样,在shell脚本运行时会也泄露敏感信息. shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件. 这就很好的解决了上述问题. shc 安装 yum -y install shc 使用方法: shc -r -f script-name 注意:要有-r选项, -f 后跟要加密的脚本名. 运行后会生成两个文件

一键启动集群的shell脚本

一键启动集群的shell脚本,包括HDFS HA + YARN相关所有程序,FBI00X是主机名,供大家参考: #!/bin/bash echo "-------------------------Step1----------------------------" echo "Now,starting Zookeeper." ssh FBI001 $ZOOKEEPER_HOME/bin/zkServer.sh start ssh FBI002 $ZOOKEEPER

一键备份gitolite服务器的Shell脚本_linux shell

运行一次就能够把gitolite服务器上的仓库备份到本地. 第一次运行会创建远程仓库的本地镜像, 以后每次运行会把本地镜像更新. 本程序只支持 ssh方式 其他的git server貌似不会在 ssh git@xxx 的时候返回repo列表, 所以只能手动备份. #!/bin/sh server=serv_addr root_dir=`pwd` echo "whill back in dir: ${root_dir}" ssh "git@${server}" | a

Linux下实现SNMP一键安装的Shell脚本_linux shell

Net-SNMP是一个免费的.开放源码的SNMP实现,以前称为UCD-SNMP.SNMP 很多都用其安装之后,作为监控宝和阿里云的系统信息监控使用.下面就来分享linux下实现SNMP一键安装的shell脚本: #!/usr/bin/env bash export LC_ALL=C if [ "$(id -u)" != "0" ] then echo "This script. must be run as root" 1>&2 e

sch 助shell脚本加密 02

sch 助shell脚本加密 02 一.  简介 SHC(shell script compiler),即shell脚本编译器.通过SHC编译过的脚本对普通用户而言是不可读的,因此如果你想让你的代码实现加密功能,让其有效的屏蔽一些敏感信息,这个时候可以考虑使用SHC:它通常情况下是不太容易被破解的,但是还是有些人可以通过反编译SHC的方法来实现破解加密过的脚本. 二.  实验测试开始2.1 下载并编译SHC [root@woo ~]# wget http://www.datsi.fi.upm.e

gzexe 助shell脚本加密 01

gzexe 助shell脚本加密 01 一.  简介 很多时候我们的脚本会涉及到一些私密的信息,例如:用户名,密码,或者其它重要信息的时候,我们使用一些加密的手段来屏蔽这些信息,确保系统的安全已经脚本的可流传性,通常情况下我们只需要通过系统自带的gzexe这个工具就够了. 二.         实验测试开始: 2.1 编写一个用于测试的脚本 [root@woo ~]# vi woo.sh #! /bin/ksh echo 'PrudentWoo'' '`date +%Y-%m-%d' '%T`

linux shell脚本问题,关于自动修改系统密码

问题描述 linux shell脚本问题,关于自动修改系统密码 操作系统 radhat 就是多个服务器每天就要进行一次密码修改,所以在想能不能用shell写一个命令脚本,然后放在一台服务器上面,等到需要修改密码的时候,就修改脚本里面的日期参数进行跑脚本修改,求大神帮助,新手,也可沾些代码我学习一下,不适合的地方,我自己改改. 解决方案 用crontabhttp://www.cnblogs.com/kaituorensheng/p/4494321.htmlhttp://os.51cto.com/a