package # hidden from PAUSE
JavaScript::Packer1;
use warnings;
use strict;
our $VERSION = '0.25';
our $AUTHORITY = 'cpan:FAYLAND';
use base 'Exporter';
use vars qw/@EXPORT_OK/;
@EXPORT_OK = qw/js_packer/;
my (@lines);
my ($payload, $symtab, $radix, $count, $splitchar, $before, $after);
my (@alfa_values, @symbols);
my $ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
my ($decoded);
sub check_packer($) {
my ($line) = @_;
$before = '';
$after = '';
$decoded = '';
if ($line =~ /eval\(function\(p,a,c,k,e,([d|r])\)\{/) {
return 1;
} else {
return 0;
}
}
sub get_table_elements($) {
my ($line) = @_;
$before = '';
$after = '';
# caret2.js miatt
if ($line =~ /eval\(function\(p,a,c,k,e,[d|r]\)\{.*?\}?\}?return \w+\}\('(.*?[^\\])',(\d+|\[\]),(\d+),'(.*?)'\.split\('(.*?)'\).*?\)\)/) {
$payload = $1;
if ($2 eq '[]') { $radix = 62; }
else { $radix = $2; }
$count = $3;
$symtab = $4;
$splitchar = $5;
$after = $';
$before = $`;
if ($splitchar eq '\\u005e') { $splitchar = '^'; }
return 1;
} else {
return 0;
}
}
sub get_index($) {
my ($ix) = @_;
my @values = split('', $ix);
my $size = @values;
my ($idx) = grep { $alfa_values[$_] eq $values[$size - 1] } 0 .. $#alfa_values;
if ($size == 2) { $idx += $values[0] * $radix; }
return $idx;
}
sub do_decode() {
my ($rest, $ix);
my ($ix1, $ix2, $ix3, $ix4, $muv, $muv1);
$decoded = '';
@alfa_values = split('', $ALPHABET);
@symbols = split('\\' . $splitchar, $symtab);
for (my $i = 0; $i < $#symbols; $i++) {
if ($symbols[$i] eq '') {
$symbols[$i] = $i;
}
}
$rest = $payload;
while ($rest =~ /(\W+)?(\w+)(\W+)?/) {
$rest = $';
$ix1 = 0;
if (defined($2)) { $ix1 = get_index($2); }
if (defined($1) and defined($3)) {
$decoded .= "$1$symbols[$ix1]$3";
} elsif (defined($1)) {
$decoded .= "$1$symbols[$ix1]";
} elsif (defined($3)) {
$decoded .= "$symbols[$ix1]$3";
} elsif (defined($2)) {
$decoded .= "$symbols[$ix1]";
}
}
$decoded .= $rest;
}
sub js_packer {
my ($js_source_code) = @_;
if (check_packer($js_source_code)) {
if (get_table_elements($js_source_code)) {
do_decode();
}
my $retval = join('', $before, $decoded, $after);
if ($retval eq '') {
$retval = $js_source_code;
}
return $retval;
}
return $js_source_code;
}
1;