shell脚本中嵌⼊⼆进制⽂件
最近有⼈问我,⼀个集监控软件的安装⽂件特别“诡异”,说脚本⾥有“乱码”却能执⾏,是怎么回事?我看了才发现这个东西原来是典型的脚本嵌套代码的模式,这⾥就讲讲吧。反正好久没写东西了。
某些⽐较“拽”的单位在发布Linux软件时以⼀种特殊的形式发布,即在shell脚本中嵌⼊⼆进制字符,从⽽使脚本变得极其诡异,让某些初学者感觉惊奇。其实,这个原理戳穿了⾮常简单,就是在运⾏脚本时将⼆进制代码导出成⼀个程序,再执⾏之就可以。(不过这种⾏为其
实,是违反Linux社区的精神的,像我这种⼈, 看到什么软件第⼀反应都是想搞到其源码)
1 简单嵌⼊程序
原理:通常程序代码处在脚本的最后位置。脚本运⾏时,把它写出来执⾏即可。
例:下⾯的这个源码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
const char* envtagUSER="USER";
printf("Your Username: %s. This is detected by the program %s./n", getenv(envtagUSER), argv[0]);
return 0;
}
这段代码可以⽤来输出⽤户名。当然这仅仅是个例⼦,实际编程时⽤shell就可以得到。现在假设我们想把这段代码嵌⼊⼀个名叫dofoo.sh 的shell脚本中。⾸先编译之:
gcc -Os foo.c -o foo
现在把foo追加到dofoo.sh的末尾:
cat foo >> dofoo.sh  # Not > but >> !
打开dofoo.sh,添加代码:
1 #!/bin/sh
2
3    skip=11
4    prog="/tmp/$0.exe"
5    tail -n +$skip "$0" > $prog
6    chmod u+x $prog
linuxshell脚本怎么运行7    $prog
8    rm $prog
9    exit
10
11 ^?EFL^B
.
..
18 ....AMIC^@data_start^@__libc_csu_fini^@_sta
(11⾏以后⽤VI看都是乱码)
看明⽩了吧!这代码将脚本中11⾏以后的东西导⼊到了/这个⽂件中,添加x权限,执⾏,然后删除该⽂件。
2 加密伪装
有时候⼀个shell中的乱码并不⼀定是可执⾏⽂件,那些东西可能是某种压缩格式,如bz2,gz等等,或者其他的某种加密形式,程序会先把他们导出来解压在执⾏然后删除,道理是⼀样的。有时候,这种解压程序或者解密程序本⾝就嵌套在shell脚本⾥,通常是商业公司⼲的事。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。