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