从Perl中的字符串执行整个perl程序

时间:2011-10-08 21:16:49

标签: perl encryption eval

我有一个程序在文件中用Blowfish加密,第二个perl程序提示用于将其解密为字符串的密码,我不想将解密的源写入硬盘虽然在内存中使用它并不是真正的问题,因为运行程序的人已经知道了源代码。我以为我可能会使用eval,但我需要运行的程序有很多输入/输出使用Curses和东西所以eval不会工作,因为它只返回最后一个值...有没有人知道如何实现这一点? / p>

3 个答案:

答案 0 :(得分:2)

您可以使用@INC挂钩执行解密。然后,您只需requireuse加密程序即可。例如,

# loader.pl
use Crypt::Rot13;
use File::Spec;
sub decrypt_line {
    if ($_ ne '') {
        my ($self, $state) = @_;
        my ($crypt, $key) = @$state;
        $crypt->charge($_);
        ($_) = $crypt->rot13($key);
        return 1;
    }
}
sub load_crypt {
    my ($self, $filename) = @_;
    print "Key?\n";
    chomp(my $key = <STDIN>);
    for my $prefix (@INC) {
        open my $fh, '<', File::Spec->catfile($prefix, "$filename.r13") or next;
        return ($fh, \&decrypt_line, [Crypt::Rot13->new(), $key]);
    }
}
BEGIN {
    unshift @INC, \&load_crypt;
}
require 'hello.pl';
# hello.pl.r13
cevag "Uryyb, jbeyq!\a";
$ perl loader.pl
Key?
13
Hello, world!

答案 1 :(得分:1)

没有理由eval不能用于你描述的内容。虽然它只返回一个值,但这并不妨碍eval'd代码与终端进行交互。它通常不是那样使用的,但是你的用例是使用字符串eval的合理原因。 (请注意,您仍然可以将源代码写入交换文件。)

答案 2 :(得分:0)

只需启动一个单独的perl实例,然后使用标准输入将程序传递给它,如下所示:

echo 'print 2+2 . "\n";' | perl -

使用perl代码:

open(P,"|perl -") || die "Failed: $!\n";                                                                                                                                                        
print P 'print 2+2 . "\n"'