Thanks for your response, I chased down those cpan modules and gave them a read. It's been suggested that I might not have my 'puter at eye level, and the answers might be right there on the screen, but I'm missing them usually for lack of comprehension. This is new territory for me, and the learning curve is steep. I do best with the modules that have examples and have worked up a few examples to show what is working and what isn't. I wrote the simplest of toy programs: toy1.pl, that only substitutes a phrase. It's safe and short. Let me list the latest of many incarnations of this script:
#!/usr/bin/perl
use warnings;
use strict;
use feature 'say';
use File::Slurp;
use B::Deparse;
# first trial without safe
my $japh = read_file( 'toy1.pl' ) ;
say "japh is $japh";
eval($japh);
# second trial with safe and copy/paste
my $deparse = B::Deparse->new();
my $body = $deparse->coderef2text(sub {
my $name = 'Donald Trump';
$name =~ s/ / "in the sub" /;
say "name is $name";
});
say "second trial is $body";
# third trial combines two methods
my $deparse2 = B::Deparse->new();
my $body2 = $deparse2->coderef2text(sub {
my $japh2 = read_file( 'toy1.pl' ) ;
say "japh2 is $japh2";
eval($japh2);
});
say "third trial is $body2";
# 4th trial uses backticks
my $file = 'toy1.pl';
my $command = "perl -MO=Deparse $file";
say "command is $command";
my $output = `$command`;
say "4th trial is $output";
# 5th trial looks at original obfu
$file = 'obfu3.pl';
$command = "perl -MO=Deparse $file";
$output = `$command`;
say "5th trial is $output";
The problem seems to be how to get deparse to work when the file to be deparsed is being selected after the program begins to run. Hence copying and pasting into a sub is not possible. I thought I was going to go with system() and Capture::Tiny until I ended up going with backticks in the 4th trial with good results. On the fifth trial I directed the backend of perl toward the obfu in the thread of the obfu decoder ring from the original post. It appears to be a bunch of junk under closer inspection:
japh is #!/usr/bin/perl
use Modern::Perl qw/2010/;
my $name = 'Donald Trump';
$name =~ s/ / "Perl is great" /;
say "name is $name";
name is Donald "Perl is great" Trump
second trial ia {
use warnings;
use strict;
use feature 'say';
my $name = 'Donald Trump';
$name =~ s/ / "in the sub" /;
say "name is $name";
}
third trial is {
use warnings;
use strict;
use feature 'say';
my $japh2 = read_file('toy1.pl');
say "japh2 is $japh2";
eval $japh2;
}
command is perl -MO=Deparse toy1.pl
toy1.pl syntax OK
4th trial is use Modern::Perl ('2010');
use warnings;
use strict;
use feature 'say', 'state', 'switch';
my $name = 'Donald Trump';
$name =~ s/ / "Perl is great" /;
say "name is $name";
obfu3.pl syntax OK
5th trial is $= = $';
$. | $| unless $;
$_ = '*$(^@(%_+&~~;#~~/.~~;_);;.);;#);~~~~;_,.~~,.*+,./|~~;_);@-,.;.);
+~~,./@@-__
);;.);;#,.;.~~@-);;#);;;);~~,.*+,.;#);;;;#-(@-__);;.);;#,.;.~~@-););,.
+/.);~~,./|
,.*+,./|,.););;#;#-(@-__);;.);;#,.;.~~@-;;,.,.*+,./@,.;.;#__;#__;;,.,.
+*+,./|,.;;
;#-(@-__@-__,.;_);@-,.;.,./|~~();.;#;.;;;;;;;;;.;.~~;.~~~~/@~~@-~~~~;#
+/|;#/|~~~~
~~/@~~@-~~~~~~;_,.;;,.;.);,.~~;_,./|);;.,./@,./@~~~~~~*+;#-(@-__,.,.,.
+*+,./|,.;;
~~()~~@-);;#);;.,.~~~~@-);-(@-__@-*+);~~,..%,.;;,.*+);~~~~@-,.*+,.,.~~
+@-~~.%,.;;
~~@-,./.,./|,.;;~~@-~~.%););;#-(@-__@-*+);;.,./|,./@,.*+,./|,.-(~~@-,.
+*+,.,.~~@-
~~.%,.,.~~@-,./.,./|,.;;~~@-~~.%););;#-(@-__);.%~~/@~~@-~~~~~~;_,.(),.
+;_,..%,.;.
~~;_~~;;;#/|~~~~~~*+;#-(@-__);@-);~~,.*+,./|);;;~~@-~~~~;;__;;/.;.@-;;
+();./@,./|
~~~~;#-(@-__&$#%^';
$__ = ' ';
use arybase ();
$___ = '````' | "$[`$[" | '`%",';
$~ = ("$___$__-$[``$__" | "$___" | "$___$__-$[.%") . (q['`] | "'$[" |
+q['#]) . '
/.*?&([^&]*)&.*/$' . ++$= . ('/``' | "/$[`" | q[/#']) . (";`/[\\`\\`$_
+_]//`;" |
";$[/[\\$[\\`$__]//`;" | ";#/[\\\$\\.$__]//'") . '@:=("@-","/.","~~","
+;#",";;","
;.",",.",");","()","*+","__","-(","/@",".%","/|",";_");@:{@:}=$%..$#:;
+' . ('`' |
"$[" | '#') . '/(..)(..)/' . ('```' | "``$[" | '#("') . '(($:{$' . $=
+ . '}<<' .
(++$= + $=) . ')|($:{$' . $= . '}))/' . ('```;' | "``$[;" | q[%'#;])
+. ("````'$
__" | "%$[``" | '%&!,') . ${$[;};
`$~$__>&$=`;
Since there isn't any output, my guess is that perl is clever enough to look at this program and say, "why define a bunch of screwy-looking variables, assign a bunch of junk, and do nothing, if there is no output? Let's not play at all." But if there were output, would perl assign values to all the odd-looking $ variables like $= , $. , $~ , $___ ?
What symbols would I look for if there were something pernicious happening?
|