`
totoxian
  • 浏览: 1074370 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

shc程序的原理--以实例分析

 
阅读更多

有人想加密自己的perl脚本,有人想加密自己的php,有人认为bash编程并不是真正的编程,因为它们的源代码都是可见的,不像c程序那样,一旦经过编译就再也不可读了...其实这是一种误区,其一就是c语言编译而成的平台相关的elf或者pe文件并不是完全不可读,只是对于应用者不可读,对于黑客还是可以进行良好反汇编的,其二既然应用者不是专业人士,那么bash,perl等代码对于他们也是不可读的,我老婆就曾经完全看不懂echo abc的含义,其三就是perl也好,php也好,为何要隐藏代码呢?它们本身就是开源的,为何要隐藏用它们写成的代码呢?这也许是受了windows的影响...
不管怎样,linux上提供了一个工具,那就是shc,它表面上看来是可以将bash编译成二进制的形式,让很多人更放心,可是用心的人仔细看过shc生成的代码后就不会这么想了。事实上,如果shc真的能将一个bash脚本转化为平台相关的比如elf文件,那说明shc一定要理解bash的语法和关键字,而bash脚本中除了使用bash内置的命令外还可以调用任意的别的bash脚本和elf文件或者perl程序,或者其它的诸如python程序,复杂无比的gcc也不过是理解了c的语法和关键字,指望一个shc理解上述的所有是不可能的,比如一个bash脚本中调用一个名字是a的程序,那么shc是将a链接进来呢还是试图理解程序a的意义然后用一个等价的c语言函数来代替呢,即使shc完全理解并可以处理了bash,也不能指望它能完全理解并能处理其它的程序或者命令,这完全需要一种人工智能的方式来完成,及其复杂。
下面我们用一个例子来说明shc真正做了些什么,在分析代码之前先说明答案,那就是shc将一个脚本用一段密钥加密,算法是rc4,然后将加密后的数据和密钥一起保存成一些数组,将解密,执行的程序代码以及上述的加密后的脚本以及密钥保存在一个c文件中,然后编译这个c文件成一个可执行的elf文件(linux平台上),当执行这个elf文件的时候,它会将加密的脚本数组数据解压后然后执行之。下面代码为证:
首先看一个简单的脚本文件
#########--simple.sh--#########
#!/bin/bash
echo 1
#########--end--#########
然后下面这个是通过shc -f simple.sh生成的c文件
#########--simple.sh.x.c--#########

static long date = 0;
static char mail[] = "Please contact your provider";
static int relax = 0;
typedef char pswd_t[474];
static char pswd[] = //这里是密钥
"/367/026/340/141/333/034/344/067/103/155/241/324/354/345/056/253"
...
"/125/300/045/273/061/114";
typedef char shll_t[10];
static char shll[] =
"/142/255/213/016/240/111/146/224/304/270/321/256/255/314/174/025";
typedef char inlo_t[3];
static char inlo[] =
"/325/233/105/366/212/116/244/207/272/345/242/161/132/177/134/253"
"/125";
typedef char xecc_t[15];
static char xecc[] = //这个数组用于混淆代码,使得反汇编更难
"/134/317/165/125/034/257/377/004/136/110/115/262/262/061/027/301"
"/364/157/201/032/052/262/146/240/203";
typedef char lsto_t[1];
static char lsto[] =
"/226/115/117/220/142";
#define TEXT_chk1 "ksjWFsdVl0EsE"
typedef char chk1_t[14];
static char chk1[] =
"/204/245/141/023/147/245/253/366/274/130/145/064/011/134/043/213"
"/011/226/037/345/232/026/336/045/371/102/333";
typedef char opts_t[1];
static char opts[] =
"/237/314/241/274/355/321/275/002/027/251/044/063/164/302/246/070";
typedef char text_t[20];
static char text[] =
"/150/207/154/160/250/073/136/042/050/230/310/252/236/366/061/372"
"/300/123/332/054/043/133/223/055/362/262/022";
#define TEXT_chk2 "24JoASCmvuaP"
typedef char chk2_t[13];
static char chk2[] =
"/272/250/101/200/054/030/146/004/003/063/006/172/157/110";
typedef char hide_t[4096];
...
static unsigned char state[256], indx, jndx;
...
void key(char * str, int len) //设置密钥,rc4算法是一个流算法而不是诸如des之类的分组算法
{
unsigned char tmp, * ptr = (unsigned char *)str;
while (len > 0) {
do {
tmp = state[indx];
jndx += tmp;
jndx += ptr[(int)indx % len];
state[indx] = state[jndx];
state[jndx] = tmp;
} while (++indx);
ptr += 256;
len -= 256;
}
}
void rc4(char * str, int len) //rc4函数解密了数据,这些数据是在shc中被加密的
{
unsigned char tmp, * ptr = (unsigned char *)str;
jndx = 0;
while (len > 0) {
indx++;
tmp = state[indx];
jndx += tmp;
state[indx] = state[jndx];
state[jndx] = tmp;
tmp += state[indx];
*ptr ^= state[tmp];
ptr++;
len--;
}
}
...
int chkenv(int argc)
{
...//这个函数主要用于混淆,使用一个环境变量控制该程序被执行两次,其实是用exec的方式被执行的。
}
char * xsh(int argc, char ** argv) //解密相关数据,最终执行解密的脚本
{
char buff[512];
char * scrpt;
int ret, i, j;
char ** varg;
state_0();
key(pswd, sizeof(pswd_t)); //设置密钥,注意,shc每次执行的时候生成的密钥都是不同的,因为rc4是序列流加密算法,如果密钥相同,那么同一段明文将得到同样的密文,这样就一破皆破,因此每次密钥都随机生成。
rc4(shll, sizeof(shll_t)); //解密结果为命令解释器:/bin/bash
rc4(inlo, sizeof(inlo_t)); //解密结果为bash选项:-c,提示脚本在后续的字符串中而不是在文件中
...
rc4(lsto, sizeof(lsto_t));
rc4(chk1, sizeof(chk1_t));
if (strcmp(TEXT_chk1, chk1)) //到此为止验证一下解密是否正确,由于我们事先不知道明文,因此密文解密后的结果也就无从比对从而证明其解密后明文是正确的,由于事先安排一个随机的字符串序列常量,shc中将其按照加密的顺序加密并保存,如果按照相反的顺序解密到此后的数据和保存的字符串相等,就说明解密到此为止是争取的,注意,流算法对加解密顺序有着严格的要求,决不能乱序。
return "location has changed!";
ret = chkenv(argc);
if (ret < 0)
return "abnormal behavior!";
varg = (char **)calloc(argc + 10, sizeof(char *));
if (ret) { //这个ret判断纯粹是为了混淆,为了让该程序再执行一次...
if (!relax && key_with_file(shll))
return shll;
rc4(opts, sizeof(opts_t));
rc4(text, sizeof(text_t));
rc4(chk2, sizeof(chk2_t)); //按照流算法,如果前面的text,即脚本本身解密出错,此处的chk2是正确的可能性也不大,不过个人认为此处使用带有初始化向量的分组算法更好。
if (strcmp(TEXT_chk2, chk2))
return "shell has changed!";
if (sizeof(text_t) < sizeof(hide_t)) {
scrpt = malloc(sizeof(hide_t));
memset(scrpt, (int) ' ', sizeof(hide_t));
memcpy(&scrpt[sizeof(hide_t) - sizeof(text_t)], text, sizeof(text_t));
} else {
scrpt = text; /* Script text */
}
}
... //省略处理命令行参数的混淆过程
j = 0;
varg[j++] = argv[0];
if (ret && *opts)
varg[j++] = opts;
if (*inlo)
varg[j++] = inlo;
varg[j++] = scrpt;
if (*lsto)
varg[j++] = lsto;
i = (ret > 1) ? ret : 0;
while (i < argc)
varg[j++] = argv[i++];
varg[j] = 0;
execvp(shll, varg); //执行解密后脚本
return shll;
}

int main(int argc, char ** argv)
{
xsh(argc, argv);
...
}
最终证明,shc并没有将bash脚本编译成二进制,而仅仅是加密了它,保存了加密后的它,然后在执行的时候解密之,执行之。

分享到:
评论

相关推荐

    Dahua大华DH-SHC1704A-T 使用说明书.pdf

    在使用DH-SHC1704A-T调光控制器之前,用户需遵循一系列安全规定以保障人身和设备安全。这包括但不限于: 1. 避免将设备置于阳光直射或发热源附近,以防过热。 2. 不要在潮湿、多尘或有煤烟的环境中安装设备。 3. ...

    shc-core-1.1.1-2.1-s_2.11.jar

    Apache Spark - Apache HBase Connector 可以使用此jar包基于shc框架使用spark读写hbase

    shc-core-spark-2.3.0-hbase-2.1.0.jar

    使用hortonworks的开源框架shc源码编译,适用于在cdh6.2.0环境下,pyspark2.4.0读写hbase2.1.0

    接触式CPU_SHC1201GD-M0模块电特性测试规范A0

    ### 接触式CPU_SHC1201GD-M0模块电特性测试规范解析 #### 一、概述 本文档旨在详细介绍《接触式CPU_SHC1201GD-M0模块电特性测试规范A0》的主要内容和技术要点,帮助读者理解接触式CPU模块的电特性测试方法及其重要...

    shc-core-release.jar.zip

    而Hortonworks作为一家专注于Hadoop生态系统的公司,为Spark与HBase之间的交互提供了一个关键组件——SHC(Spark-HBase Connector),其中的shc-core是其核心部分。本文将详细解析SHC Core的原理、功能以及在大数据...

    Dahua大华DH-SHC1004A-T 使用说明书.pdf

    【Dahua大华DH-SHC1004A-T 使用说明书】 该文档详细介绍了Dahua大华DH-SHC1004A-T调光控制器的设备结构、安装和使用注意事项,旨在确保用户能够安全有效地操作该设备。文档中采用了一些特定的符号来标识不同类型的...

    shc-core-1.1.2-2.2-s_2.11.jar,ojdbc8-12.2.0.1.jar

    hadoop-util-0.3.0.jar

    SHC-ZDG-02原材料领用管理办法.pdf

    文件内容中的"SHC-ZDG-02原材料领用管理办法.pdf"以及部分数字和符号,并不能形成一段有意义的描述,而仅仅可能是文档的一部分或者是扫描识别错误的结果。 为了能够生成详细的知识点,我需要一段连贯的、具有实际...

    shc-3.8.9.tgz

    此外,shc-3.8.9可能还引入了新的选项或特性,以满足更广泛的加密需求。 使用shc进行shell脚本加密的步骤如下: 1. 安装shc:在大多数Linux发行版中,可以通过包管理器如apt或yum来安装shc。如果没有预装,可以...

    shc-3.8.6-1.el6.rf.x86_64.rpm

    shell脚本加密工具shc,适用于64位Linux系统,建议版本子啊6.3 以上

    [Hi-556]YACF5D0C9SHC- Datasheet_(Ver_0.1).pdf

    根据所提供的文件内容,这份文档是一份关于YACF5D0C9SHC型号[Hi-556]的CMOS影像传感器的数据手册,属于初步规格说明,并被标记为0.1版本。此芯片是一款拥有5百万像素的影像模组,适用于1/5英寸的CMOS图像传感器。...

    shc-3.8.9.rar

    标题中的"shc-3.8.9.rar"是一个压缩包文件,主要用于在Linux环境中安装shc组件。shc(Shell Script Compiler)是一款用于Linux或Unix系统的开源工具,它能够将bash shell脚本转换为可执行的二进制文件,从而增加脚本...

    shc-3.8.6.tgz

    **标题:“shc-3.8.6.tgz”** **描述:** “shc-3.8.6.tgz”是一个压缩包,其中包含了名为“shc”的工具的源代码,版本为3.8.6。这个工具主要用于将Shell脚本转换成可执行的二进制文件,以提高安全性和执行效率。它...

    shc-3.8.7.tgz

    每个管理员都是自己写的一组shell 来简化自己的工作,有时我们会把自己写的shell 让别人用,但这时有一个麻烦的地方,就是shell 里包含一些敏感信息如帐号密码等,这时我们需要一个工具–shc 把我们的shell 加密。...

    shc-nginx-lb:这是一个Ansible项目,将Nginx部署为Splunk Search Head Cluster(SHC)的负载平衡器

    shc-nginx-loadbalancer TLS负载平衡器设计用于Splunk Search Head Cluster(SHC)的前面。 使用HSTS和ip_hash负载平衡规则。 先决条件 policycoreutils-python openssl cryptography (pip) 假设RedHat OS系列 ...

    bosch-shc-api-docs:Bosch智能家居控制器本地REST API

    【Bosch SHC API Docs】是Bosch公司为...通过这个`bosch-shc-api-docs-master`,开发者可以获得构建Bosch智能家居解决方案所需的所有技术细节,从而实现自动化控制、数据分析或其他创新功能,提升用户的家居生活体验。

    如何使用 SHC 加密 Shell 脚本.doc

    SHC 加密 Shell 脚本 SHC(Shell Script Compiler)是一种工具,用于加密 Shell 脚本,以保护其中包含的敏感信息,如密码等。使用 SHC,可以将 Shell 脚本编译成二进制格式的加密文件,从而防止未经授权的人查看或...

    [Hi-556]YACF5D0C9SHC- Chip Information (Ver 1.0).pdf

    标题部分提供的信息表明文档是关于“Hi-556”型号的YACF5D0C9SHC芯片的信息(版本1.0)。从这个标题中,我们可以了解到文档将要介绍的芯片型号,以及该文档是一个产品的通用描述,这可能意味着它是有关芯片的基础...

    Faz-SHC:Faz-SHC是一个程序,可以对您提供给Shellcode的文本进行加密。 简单,并用Perl编码。 法兹里·尼扎尔(M.Fazri Nizar)编码

    从压缩包文件名`Faz-SHC-master`来看,这很可能是项目的源代码仓库,包含了项目的主要文件和资源。如果你对Faz-SHC的工作原理或想要定制它以满足特定需求感兴趣,可以从这个源代码仓库中获取更多信息。 总的来说,...

    三星SHC-B309刷机说明

    1. **下载并安装驱动程序**:首先需要在电脑上安装三星SHC-B309的USB驱动程序。通常这些驱动会包含在官方提供的软件包中。 2. **获取刷机工具**:下载三星PST (Phone Software Tool) 软件,这是三星官方提供的用于...

Global site tag (gtag.js) - Google Analytics