文档章节

Linux环境下脚本加密软件SHC的解密方法

l
 linjin200
发布于 06/27 14:25
字数 2109
阅读 15
收藏 0

Linux环境下脚本加密软件SHC的解密方法

 

2016/08/06:更新一个新的解密脚本

https://github.com/yanncam/UnSHc

自从我在博客里面发布了一些免流相关的东西之后,不少博友都加我QQ想了解如何解密经过SHC加密后的脚本。博主在这里需要跟大家说明的一点是:博主真的不是什么高手或大牛!博主解密这些脚本的方法都是搜索一下就能够找到的东西,我只是汇总了一下分享给大家,这个没什么技术含量可言的。另外,博主对于Linux的了解也就仅限于正常的使用。所以,不要一加QQ就咨询解密啦,我真的知道的不多,而且最新的解密脚本都是一些博友发给我的。

收到博友的反馈说是解密脚本有些能解,有些不能解,具体原因我不太清楚,今天就给大家了解下SHC解密的另一个思路(在上一篇文章中我提供的是一个现成的脚本)。当然,要想知道如何解密SHC,最好还是要了解下SHC是个啥东西,怎么工作的,咱先来科普一下吧。

SHC简单介绍及安装使用

SHC是一个用于加密linux脚本的软件,在某种程度上来说可以提高安全性。如果您不希望自己编写的shell脚本里面的相关信息透露出来,或者不愿意让人看到和修改shell代码,就可以使用shell加密。实际上SHC是一个脚本编译程序,使用RC4加密代码加密shell, 并把shell转换为二进制可执行文件(支持动态链接和静态链接)

如何安装和使用SHC?

SHC官网地址:http://www.datsi.fi.upm.es/~frosal/sources/

可以在直接从官网上WGET下载最新的源码到本机进行编译,执行步骤如下:

wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
tar vxf shc-3.8.9b.tgz
cd shc-3.8.9b
make test
make strings
make install

安装的时候可能会出现下面的情况,可以直接无视,一般没什么影响,只是少了对应的帮助文档。

***     Installing shc and shc.1 on /usr/local
***     ?Do you want to continue? y
install -c -s shc /usr/local/bin/
install -c -m 644 shc.1 /usr/local/man/man1/
install: target `/usr/local/man/man1/' is not a directory: No such file or directory
make: *** [install] Error 1

SHC加密程序使用参数:

-e date (指定过期时间)
-m message  (指定过期提示的信息)
-f  script_name (指定要编译的shell路径)
-r  relax security  (在不同操作系统执行)
-v  Verbose compilation (输出编译的详细情况)

简单使用实例:用SHC加密当前目录下的 abc.sh 文件

shc -v -f abc.sh
shc -e 28/01/2012 -m "过期" -f abc.sh

如果需要用静态链接,只需要只需SHC加密的时候前面加上代码:CFLAGS=-static

静态链接加密实例:

CFLAGS=-static shc -v -f abc.sh

使用shc加密Shell脚本

 

[root@martin shc-3.8.7]# ./shc -v -r -T -f random.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc  random.sh.x.c -o random.sh.x
shc: strip random.sh.x
shc: chmod go-r random.sh.x

 

运行后会生成两个文件,script-name.x 和 script-name.x.c
script-name.x是加密后的可执行的二进制文件
script-name.x.c是生成script-name.x的原文件(c语言)

[root@martin shc-3.8.7]# ll random.sh*
-rwxr-xr-x 1 root root   146 Aug  2 10:26 random.sh
-rwx--x--x 1 root root  9424 Aug  2 10:30 random.sh.x
-rw-r--r-- 1 root root 10080 Aug  2 10:30 random.sh.x.c

执行加密后的脚本

[root@martin shc-3.8.7]# ./random.sh.x 
How many random numbers do you want to generate?3
28955
21487
29513

还不完善,只能全路径执行shc命令或者进入目录内,加入全局环境变量/etc/profile未生效

SHC解密的一些方法

2016/8/13日更新:根据博友反馈本方法运行出错,解密思路是一个朋友给的,目前还没有回复,等到回复了会第一时间更新。

虽然使用SHC对SHELL脚本进行RC4加密编译可以从一定程度上防止脚本程序被修改,但是这种加密方式并不是坚不可破的,心中无码才是最高境界,当然,国内环境大家懂的,在这里就不扯开话题了。

经过SHC加密的脚本能够被解密的原因是:在执行加密脚本的时候,还是会在内存中解密全部的shell代码,所以解密的思路就是从内存中获取解密后的代码

好了,解密的思路有了,下面就来一步一步探讨下怎么从内存中获取解密后的代码。

那么有啥方法可以从内存中读取数据呢?经过一番搜索之后,找到了Core Dump这个神器。

什么是Core dump
Core dump翻译过来就是核心转储,当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。core dump在应用crash掉之后对问题的诊断是很有帮助的。多数情况下Core dump默认是关闭状态的。

那如何打开Core Dump呢?

方法一:直接执行命令行开启:

ulimit -c 70000
echo "/core_dump/core.%e.%p" > /proc/sys/kernel/core_pattern

通过上面的命令就开启了core dump,同时限制文件大小为7000k,也就是限制单个文件大小为7M左右,一般的脚本没那么大的。

方法二:配置profile文件,打开/etc/profile文件,在里面可以找到

ulimit -S -c 0 > /dev/null 2>&1

将它修改成下面这样就可以了。

ulimit -S -c unlimited > /dev/null 2>&1

当然,对于像我们这样的菜鸟来讲,还是方法一比较实际。

开启了Core Dump,我们就可以进行猥琐的解密工作了。

首先设置下执行脚本并中断,假如你需要解密的二进制脚本文件名为abc

(请注意:博友反馈这一步执行不了)

./abc (sleep 0.2 && kill -SIGSEGV $!)

输出脚本执行信息和脚本代码到文件

cd /core_dump
cat ./core.***.**** | strings > ~/abc.sh
***.***是你执行代码后的随机值(对应的PID等)

好了,输出后的abc.sh文件就是从内存里面取出的解密后的代码,当然里面还是有些多余文本内容,自己稍微动手剔除后就得到解密后的脚本了。

上面是手工方式获得解密代码,当然也是最稳妥的,下面再给大家送上一份一个一键解密脚本,当然,博主不保证能够解密成功,也是拿出来参考参考而已。

最后,如果各位博友解密了脚本的话,欢迎发我一份。

#!/bin/sh  
##############################################################  
# Used to unzip script files generated by shc                #  
# Modified by cuterhei at 2014-02-26: 目录遍历               #  
# Created by cuterhei at 2014-02-25 : 创建                   #  
##############################################################  
  
shcd_help()  
{  
    echo "  Used to unzip script file generated by shc."  
    echo "  Usage:"  
    echo "    0. shcd -h|?|-help       ---- Current you see"  
    echo "    1. shcd inputfile        ---- 解压单个文件(输出文件inpfile.bat)"  
    echo "    2. shcd inpfile outpfile ---- 解压单个文件(输出文件outpfile)"  
    echo "    3. shcd -d               ---- 深层目录遍历解压(输出文件*.bat)"  
    echo "    4. shcd -a               ---- 当前目录遍历解压(输出文件*.bat)"  
    exit 0  
}  
  
get_skip()  
{  
    skip=0  
    while read skip_line  
    do  
        let "skip -= 1"  
        skl_f="none"  
        skipstrlist=$(echo $skip_line|tr "=" "\n")  
        for xs in $skipstrlist; do  
            if [ "$skl_f" = "none" ]; then  
                if [ "$xs" = "skip" ]; then  
                    skl_f="found"  
                else  
                    break;  
                fi  
            elif [ "$skl_f" = "found" ]; then  
               skip=$xs;  
               break  
            else  
               break  
            fi  
        done  
        if [ "$skl_f" = "found" ] || [ $skip -le -2 ]; then  
            break  
        fi  
    done < "$1"  
    echo $skip  
}  
  
ucount=0  
  
uncomp_shc()  
{  
    skipline=$(get_skip $1)  
    if [ "$skipline" = "" ] || [ $skipline -le 1 ]; then  
        echo "%>_<% Skip flag not found: $1"  
    else  
        if tail -n +"$skipline" "$1" | gzip -cd > "$2"; then  
            let "ucount += 1"  
            echo "^_^ $ucount. Unzip $1<skip=$skipline> to $2"  
        else  
            echo "%>_<% Unzip $1<skip=$skipline> failed"  
        fi  
    fi  
}  
  
uncshc_dir()  
{  
    echo "......Enter dir '$1' ......"  
    for file in $1/*  
    do  
        if [ -f $file ]; then  
            uncomp_shc "$file" "$file.bat"  
        elif [ -d $file ] && [ "$2" = "-d" ]; then  
            uncshc_dir "$file" "$2"  
        fi  
    done  
    echo "......Leave dir '$1' ......"  
}  
  
# now start to work  
  
if [ "$#" = "0" ] || [ "$1" = "-?" ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then  
    shcd_help  
elif [ -f $1 ]; then  
    if [ "$#" = "2" ]; then  
        uncomp_shc "$1" "$2"  
    else  
        uncomp_shc "$1" "$1.bat"  
    fi  
elif [ "$1" = "-d" ] || [ "$1" = "-a" ]; then  
    uncshc_dir . $1  
else  
    echo "File $1 is not exist."  
fi  
  
echo "$ucount files are unzipped."  
  
exit  
  
# end of job

© 著作权归作者所有

l

linjin200

粉丝 23
博文 854
码字总数 943337
作品 0
福州
程序员
私信 提问
MySQL之登陆密码加密认证脚本

一、登陆密码加密认证脚本应用场景 日常操作,经常明文指定了MySQL密码来登录MySQL服务,在登录成功之后就会抛出下面的警告: [root@git-server ~]# mysql -uroot -p'wujianwei' 对于要求严格...

wjw555
2018/07/21
0
0
shc程序的原理--以实例分析

有人想加密自己的perl脚本,有人想加密自己的php,有人认为bash编程并不是真正的编程,因为它们的源代码都是可见的,不像c程序那样,一旦经过编译就再也不可读了...其实这是一种误区,其一就...

晨曦之光
2012/04/10
394
0
CentOS下对shell脚本加密的二种方法

CentOS下对shell脚本加密的二种方法 2017年09月27日 16:56:27 hubowestlife 阅读数 775 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_37757403/artic...

linjin200
06/26
30
0
MLSBS v0.21RC,Linux 一键运维脚本(新增脚本加密)

#MLSBS v0.21rc MLSBS is the abbreviation of "My linux's bash script"! “MLSBS”是“My linux's bash script”的缩写 linux运维技术人员日常需要写一堆脚本来简化工作量。“MLSBS”的目的......

蓝宝石的傻话
2014/05/20
3.3K
8
使用shc加密bash脚本程序

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

独钓渔
2014/01/24
2.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部