Я не понимаю, почему так много downvotes: это выглядит как интересная проблема.
У меня было немного свободного времени, и пытался что-то на моих:
- код для мусора находится в отдельном файле с блоками, разделенными # ---
- Ofuscator изменяет имена переменных и функций в мусоре код, если это существует в оригинальном хорошем коде (я предположил, что вы определить переменные с
my
и функции с sub
)
- Ofusctaor случайным образом при добавлении контента из мусора файла (зацикливание при необходимости)
Это выглядит как этот
Хороший код (original.pl)
#!perl
use strict;
my $var1='hello';
my $var2='there';
sub f {
print "This is a function";
++$var1
}
print $var1;
print "\n$var2";
Garbage код (garbage_code.pl)
#!perl
#---
my $var2='__NEW';
my $var3="This is garbage";
#---
sub g {
$var3+="changed";
print "This shall be removed";
return $var3;
}
#---
sub f {
return g(shift).$var2;
}
#---
f("function name shall be changed");
Offuscator
#!perl
use strict;
use Data::Dumper;
#-Get Original 'good' code
open CODE,"<original.pl" or die $!;
my @code=<CODE>;
close CODE;
#-Get Garbage code
open GARBAGE,"<garbage_code.pl" or die $!;
my @garbage=split(/^#---/m, join("",<GARBAGE>));
shift @garbage; #Remove header
map { s/^.*?(\w.*?)\s*$/\1/s } @garbage; #Trail spaces and EOL at beginning and end
map { s/print .*?;//g } @garbage; #Remove print calls
close GARBAGE;
#-List variables and functions in good code
my %list_var;
my %list_func;
for my $line (@code) {
if ($line=~/my \s*[\[email protected]%](\w+)/) { $list_var{$1}=undef; }
elsif ($line=~/sub \s*(\w+)/) { $list_func{$1}=undef; }
else { }
}
#-List variables and functions in garbage code
my @list_var_garbage;
my @list_func_garbage;
for my $line (@garbage) {
while ($line=~/my \s*[\[email protected]%](\w+)/g) { push(@list_var_garbage,$1); }
while ($line=~/sub \s*(\w+)/g) { push(@list_func_garbage,$1); }
}
#-Replace names of variables and functions in garbage code if it exists in good code
#Get equivalent name
for my $type ('var', 'func') {
my $rh_list = ($type eq 'var' ? \%list_var : \%list_func);
my @list_names=(keys %$rh_list, ($type eq 'var' ? @list_var_garbage : @list_func_garbage));
for my $name (@list_names) {
#Get new name
my $new_name=$name;
#For names of good code OR new names in garbage code
if (!defined $rh_list->{$new_name}) {
while (exists $rh_list->{$new_name}) { $new_name.="1"; }
#Store in hash table
$rh_list->{$new_name}=undef; #to ensure uniqueness of replacements
$rh_list->{$name}=$new_name; #Replacement name in garbage code
} else {}
}
}
#Replace
map { s/(?:sub \s*|&)\K(\w+)/$list_func{$1}/g } @garbage;
map { s/(\w+)\(/$list_func{$1}(/g } @garbage;
map { s/[\[email protected]%]\K(\w+)/$list_var{$1}/g } @garbage;
#-Function to get garbage content
my $i_garbage=0;
sub get_garbage {
return $garbage[ ($i_garbage++) % scalar(@garbage) ]."\n";
}
#-Copy garbage in good code
my @new_code;
for my $line (@code) {
#-Add the line
push(@new_code, $line);
#-Add garbage
#Blocks: add garbage at the end
if ($line=~/\{/ .. $line=~/\}/) {
if ($line=~/\}/) { push(@new_code, get_garbage()); }
#Other: randomly add garbage
} else {
if (int(rand(2))) { push(@new_code, get_garbage()); }
}
}
#Print file with new code
open NEW_CODE, ">new.pl" or die $!;
print NEW_CODE @new_code;
close NEW_CODE;
Результат
#!perl
use strict;
my $var21='__NEW';
my $var3="This is garbage";
sub g {
$var3+="changed";
return $var3;
}
my $var1='hello';
sub f1 {
return g(shift).$var21;
}
my $var2='there';
f1("function name shall be changed");
sub f {
print "This is a function";
++$var1
}
my $var21='__NEW';
my $var3="This is garbage";
sub g {
$var3+="changed";
return $var3;
}
print $var1;
print "\n$var2";
sub f1 {
return g(shift).$var21;
}
f1("function name shall be changed");
Это, вероятно, не принимать во внимание все случаи, но это, безусловно, хорошо работающий прототип.
Cheers
Что вы на самом деле пытаетесь достичь? Достаточно легко написать неразборчивый и ужасный код perl, не пытаясь запутать его ...обычно это считается плохой стиль программирования, и поэтому на самом деле пользователи этого сайта не хотят продвигать. – Sobrique
Я пытаюсь украсть какой-то красивый код, увеличив его с помощью нежелательного кода, который ничего не делает, кроме скрытия инженер-реверсивный в отладку и время. Это похоже на лабиринт: у вас есть только один (возможно, более) путь для выхода из него и гораздо больше путей, ведущих к тупику; это цель лабиринта, чтобы заставить путешественника (реверсора) тратить свое время на отладку тупиковых путей. Очевидно, я думаю. – rlib
Если бы 'perl -MO = Deparse' не существовало, может быть. – Sobrique