压缩与解压缩

字符集是一种约定

在计算机中,所有的文件都以二进制的形态存在。我们的文字根据一些约定,来表示特定的符号。

ASCII 美国信息交换标准码(128个代码,用8bit代表一个代码,当然是不能表示中文的咯)

Unicode 对ASCII的扩展(用16bit代表一个代码,解决了上百种语言的混乱)

UTF-8 是对Unicode的升级版,为了解决16bit占用地址的问题。有些字符只需要用8bit表示,如果全部都用16bit表示,岂不是浪费了一倍的空间?所以UTF-8是可变长度的,能用8bit就不用16bit。

由于在网络上传输数据,文件越小传输越快,和UTF-8类似,我们可以把一些重复的数据用简便的方法表示。

例如 111111111100000000 表示成 10180(10个1,8个0) 虽然例子不太严谨,反正压缩就是用更简便的方式表示数据,只要接受的另一端用同样的方式将数据还原,就可以了。

常见压缩方法

下面看看linux支持的压缩方法。

zip

1
2
 zip -P 123456 test.zip test.txt    加密test.txt
 unzip -P 123456 -o test.zip         解密test.zip

-o 直接覆盖原文件

-P 指定压缩密码

test.zip 指定压缩后文件名

test.txt 是要压缩的文件

gz

gzip 参数 文件名

1
2
3
4
5
> -c 相当于cat命令吧?将压缩的文件输出到屏幕上
> -d  我以魔法小樱的名义命令你,解压缩!
> -t 检验文件有无压缩错误
> -v 显示文件压缩比等信息
> -number number是个可选项从1到9,数字越大压缩越慢,但压缩地比较多。如果不设置该选项,默认是6。

bzip2 是gzip的升级版,选项和上面一样。

xz是bzip2的升级版,虽然说是升级版,但它们其实并没有什么关系啊,只是说压缩性能更加好而已。不过压缩能力越好,往往要花费更多的时间来压缩,所以性能时间自己权衡吧!

gz解压缩

gunzip xx.gz

tar

在文件传输中,我们还要介绍一个指令tar。就像现实中要寄快递需要将你的文件打包一样,网络传输也需要打包一下。免得文件丢失或者遗忘。

1
2
3
4
5
6
7
8
9
10
11
12
> -c 打包!
> 
> -z 使用gzip,或者 -j 使用bzip2,-J 使用xz
> 
> -v 显示命令执行过程
> 
> -f 指定归档文件名
> 
> -t 查看文档
> 
> -x 解压缩!
> 

范例:

tar -jcv -f app.tar.bz2 使用bzip2 压缩app.tar.bz2 的文件

tar -jtv -f xx.tar.bz2 使用bzip2 查看xx.tar.bz2有哪些文档名

tar -zxvf xx.tar.gz 使用gzip解压缩xx.tar.gz、输出命令执行过程。

tar -cvf haha.tar shell/ 将shell目录已经目录下的文件打包成文件haha.tar

程序加密

加壳与脱壳:由于压缩后的数据不可以识别,所以病毒木马也十分喜欢压缩呢。有个专有的名词叫做加壳,十分形象。总之就是用来保护程序的。

压缩壳有UPX、ASPack、PECompact

有些壳除了压缩,还有加密功能,例如ASProtect、Armadillo

暴力破解压缩密码

类似的软件有很多,这里推荐一个常kali自带的命令行程序。

1
2
fcrackzip -h 查看帮助
fcrackzip -D -u -p /root/Desktop/test.txt xx.zip 使用指定的密码字典,破解xx.zip

常用密码下载地址:https://wiki.skullsecurity.org/Passwords