[Moscow.pm] get own source code

PEF Secure pef-secure на yandex.ru
Вс Мар 29 13:22:03 PDT 2015


On Sunday, March 29, 2015 20:05:37 Maxim Vuets wrote:
> 2015-03-28 17:07 GMT+01:00 PEF Secure <pef-secure на yandex.ru>:
> 
> > Хочется получить собственный исполняемый код, который виден
> > интерпретатору.
 Нужен буквальный код, на который ссылается
> > интерпретатор, когда говорит "такая то ошибка в такой то строке". Дело не
> > решается чтением исходного кода соответствующего файла с диска, поскольку
> > речь идёт о "фильтрованном" коде.
> 
> Это невозможно в чистом виде. Интерпретатор не выполняет текст
> программы. Он прежде компилирует её в специальное внутренне
> представление. Если вы компилируете код на лету, или модифицируете
> программу во время исполнения, то и "буквального кода" у вас нет.

Я знаю. Но в скомпилированном коде есть ссылки на номера строк, откуда он 
взялся.

> Можно попробовать декомпилировать внутренне представление братно в
> текст программы. Но он будет достаточно приблеженным и не обязательно
> удобно-читаемым. Вот вам привет для вдохновления:
> 
>     $ perl -MB::Deparse -E 'my $f = eval "sub {shift() + shift()}"; #
> компилируем строку во время исполнения \
>         say $f->(2, 3); # проверяем \
>         my $d = B::Deparse->new; say $d->coderef2text($f); # декомпилируем'
> 5
>                {
>            use feature 'current_sub', 'evalbytes', 'fc', 'say',
> 'state', 'switch', 'unicode_strings', 'unicode_eval';
>            (shift()) + (shift());
>         }

Да, про B::Deparse я уже думал. Возможно его можно применить, если всё-таки 
получить доступн к внутреннему представлению конкретной строки. Надо будет 
посмотреть снова.

> Вы какую задачу решить пытаетесь-то?

Восстановить текст после Filter::Simple.
-- 
PEF Developer


Подробная информация о списке рассылки Moscow-pm