#!/usr/bin/perl # # let's make a VOMITRAN for perl! # # usage: vomitran [perl_source_file] # obfuscated source is written to stadard list # a translation table is written to standard error # ie. # # vomitran whatever.pl > whatever.obfuscated # # Jeff Hecker / Apogee / Jan 1996 # srand; $MORE = 0; # first, preload the translation table with reserved variables which # will not be altered. $VAR { "ARGV" } = "ARGV"; # reserved variable name $VAR { "ARGC" } = "ARGC"; # reserved variable name $VAR { "ENV" } = "ENV"; # reserved variable name $VAR { "in" } = "in"; $VAR { "_" } = "_"; $IN = shift ( @ARGV ); open ( IN, $IN ); while ( ) { chop; $MORE = 1, last if /^__END__$/i; m/#/ && do { # ignore comments s/[\t ][\t ]*\#.*//; }; /^$/ && next; # ignore blank lines split ( /([^A-Za-z_\$@%#0-9]+)/ ); # print "split=", join(":",@_),"\n"; foreach $v ( @_ ) { # print "trying to match $v \n"; $v =~ m/^[\$%@]#*[A-Za-z]/ && do { # print "VAR=$v \n"; $p = $v; $q = $v; $p =~ s/(^[\$%@]#*)([A-Za-z0-9_]*)/\1/; $q =~ s/(^[\$%@]#*)([A-Za-z0-9_]*)/\2/; if ( $VAR { $q } gt " " ) { $v = $p . $VAR { $q }; } else { do { $tmp = "I" . unpack ( "b15", pack ( "s", rand ( 65535 ))); $tmp =~ s/0/I/g; $m = 0; foreach $k ( keys %VAR ) { $m += ( $VAR { $k } eq $tmp ); }; # if ( $m > 0 ) { print "Dup!\n"; }; } while ( $m > 0 ); $VAR { $q } = $tmp; $v = $p . $VAR { $q }; }; }; }; }; seek ( IN,0,0 ); print STDERR "Pass one complete.\n\n"; foreach $v ( sort { length($b) <=> length($a) } keys %VAR ) { print STDERR $VAR { $v }, " was $v\n"; }; print STDERR "\n"; print < ) { $MORE = 1, last if /^__END__/i; s/[\t ][\t ]*#.*//; # delete comments s/^[\t ][\t ]*//; # delete indentation next if /^[\t ]*$/; # delete blank lines next if /^#/; # s/ *([\[\]<=+->~.,;(){}])/\1/g; # s/([\[\]<=+->~.,;(){}]) */\1/g; # print STDERR "studying $_ \n"; study; foreach $v ( sort { length($b) <=> length($a) } keys %VAR ) { s/([\$@%]#*)$v/\1$VAR{$v}/g if m/[\$@%]#*$v/; }; print; }; if ( $MORE ) { # preserve immediate data print "\n__END__\n"; while ( ) { print; }; };