Выполнение всей программы perl из строки в Perl

#perl #encryption #eval

#perl #шифрование #вычисление

Вопрос:

У меня есть программа, которая зашифрована с помощью Blowfish в файле, и вторая программа perl, которая запрашивает кодовую фразу, которая используется для ее расшифровки в строку. Я бы хотел, чтобы мне никогда не приходилось записывать расшифрованный исходный код на жесткий диск, хотя его наличие в памяти на самом деле не проблема, посколькуте, кто запускает программу, уже знают источник. Я думал, что мог бы использовать eval, но программа, которую мне нужно запустить, имеет много ввода / вывода с использованием проклятий и прочего, поэтому eval не будет работать, поскольку он возвращает только последнее значение… У кого-нибудь есть идеи, как это можно сделать?

Ответ №1:

Вы можете использовать @INC перехват для выполнения дешифрования. Затем вы можете просто require или use зашифрованную программу. Например,

 # 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, amp;decrypt_line, [Crypt::Rot13->new(), $key]);
    }
}
BEGIN {
    unshift @INC, amp;load_crypt;
}
require 'hello.pl';
  
 # hello.pl.r13
cevag "Uryyb, jbeyq!a";
  
$ perl loader.pl
Ключ?
13
Привет, мир!

Комментарии:

1. Хиииииииииииии, это ужасно! и именно то, что мне нужно, это совершенно не связанная проблема, я использую это для создания своего объекта cipher my $cipher = Crypt::CBC->new( -key => $key, -cipher => 'Blowfish'); , но эта строка, похоже, прерывает цикл и переходит к следующему объекту, не продвигаясь дальше. Кажется, я не могу понять, где есть место для меня, чтобы найти ошибку и т.д…. что происходит

Ответ №2:

Нет причин eval , по которым то, что вы описываете, не будет работать. Хотя он возвращает только одно значение, это не мешает eval’d коду взаимодействовать с терминалом. Обычно это не используется таким образом, но ваш вариант использования является законной причиной для использования string eval . (Обратите внимание, что в конечном итоге вы все равно можете получить исходный код, записанный в ваш файл подкачки.)

Ответ №3:

Просто запустите отдельный экземпляр perl и передайте ему программу, используя стандартный ввод, например:

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

С помощью кода perl:

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

Комментарии:

1. тааак первое, что я сделал, это попробовал это, к сожалению, что-то в этом, похоже, полностью замораживает мой терминал, например, я ничего не могу ввести, управляющие символы не работают и т. Д., Единственный способ исправить — открыть другой терминал и убить интерпретатор …. оооочень. Также, когда я пытаюсь вычислить всю программу в строке, в терминале буквально ничего не происходит, программа просто запускается и завершается, Мне не предоставляется какой-либо вывод и т. Д