2013年(6)
分类: 其他平台
2013-11-24 18:52:17
我见到很多人有一些需求。就是想给自己的程序加密。比如商业程序和一些记录着关键信息的程序。这样让自己的源代码不可读,但又不想对程序的性能靠成什么大的影响。
当然在 Perl 中也有一堆的方法来实现这个功能。因为我写的跳板程序直接给 Key 写到程序本身,所以我不希望别人能见到我的 SSH 的 Key 。所以我对整个程序进行一定程度上的加密是很有必要的。在 PHP 中有一个很出名的东西叫 Zend,给整个程序加密成不可见的,我们现在自己来实现一个简化的 Zend。在 Perl 中我们有各种好用的模块帮我们实现这种功能。我现在给大家来介绍一个使用 Filter 模块来实现的这个源代码加密功能。
想详细了解这种东西是怎么工作的,可以看我的一处有关 Perl 的过滤器的译文 . 简单来讲,就是在 Perl 最开始 use 一个模块,然后以后的东西都是加密过的代码。这些代码会使用这个模块来解码,解码完了然后才会读到 Perl 的解析器中。
使用方法,我们要先在代码加密程序中来定制一个自己的加密字符。并给修改过的 Filter 的模块安装到解码的服务器上。
wget tar zxvf Filter-1.49.tar.gz cd Filter-1.49
这时我们进入了这个模块。这个包中有一些文件,是我们要用到的。我们先修改和定制加密的字符。
对于定制这个地方,需要修改二个文件,一个解密的 C 文件( decrypt/decrypt.xs ),一个是加密的程序。之所以要修改解密的 C 程序是因为解密的时候会调用这个 C 编译以后的 so 文件来解码。所以这也要求,对方的机器上的 Filter::decrypt 中引用的 so 是我们修改过以后。不用担心。因为是 so 文件,所以你定制的 key 别人并不知道,所以这样安全. 我们先打开这个文件。修改下面红线的部分.
在 decrypt 目录下有个 encrypt 的文件,我们也照样,打开并修改这个文件第 12 行也和上面的一样
修改完以后,对我们真实的程序,使用这个来加密。注意这个会删除原文件,你要保留好。比如我们原来的程序叫 test.pl.
#perl decrypt/encrypt test.pl
这时生成的新文件,还是 test.pl 不过你打开看时都会是象下面这样。但是还是能正常的执行。
标准的模块安装方式,记得要替换 descypt.xs 的你上面的加密程序相配。不然不能执行。替换 so 的文件也行。
在目标主机上
perl Makefile && make && make install
好了,这时给你上面加密过的 test.pl 复制过来,在这台机器上就能执行了。因为其它人并不知道你的加密字符(so 文件是编译后的)所以相对安全。注意保管好你的 Key 不要让其它人知道。
FQA: 自己加密的程序,没有原来的文件了,只有加密后的,怎么通过 key 来还原.下面提供一个反解程序
#!/usr/bin/perl require 5.002; use vars qw ( $XOR $BLOCKSIZE $HEADERSIZE $CRYPT_MAGIC_1 $CRYPT_MAGIC_2 $size $mode $line ); $XOR = '你定制的 key'; $BLOCKSIZE = length $XOR; $HEADERSIZE = 2; $CRYPT_MAGIC_1 = 0xff; $CRYPT_MAGIC_2 = 0x00; foreach $file (@ARGV) { open (F, "<$file") or die "Cannot open $file: $!\n"; open (O, ">${file}.ne") or die "Cannot open ${file}.ne: $!\n"; seek(F,0,0); $line =; $block = ''; read(F, $block, 24); while ($size = read(F, $block, $BLOCKSIZE) ) { print O ($block ^ substr($XOR, 0, length $block)) ; } close F; close O; }