|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UMSJavaScriptUnPacker |
|
|
{ |
|
|
private $unbaser; |
|
|
private $payload; |
|
|
private $symtab; |
|
|
private $radix; |
|
|
private $count; |
|
|
|
|
|
function Detect($source) |
|
|
{ |
|
|
$source = preg_replace("/ /","",$source); |
|
|
preg_match("/eval\(function\(p,a,c,k,e,[r|d]?/", $source, $res); |
|
|
|
|
|
UMSDebug::Write($res,"detection result"); |
|
|
|
|
|
return (count($res) > 0); |
|
|
} |
|
|
|
|
|
function Unpack($source) |
|
|
{ |
|
|
preg_match_all("/}\('(.*)', *(\d+), *(\d+), *'(.*?)'\.split\('\|'\)/",$source,$out); |
|
|
|
|
|
UMSDebug::Write($out,"DOTALL", false); |
|
|
|
|
|
|
|
|
$this->payload = $out[1][0]; |
|
|
UMSDebug::Write($this->payload,"payload"); |
|
|
|
|
|
$this->symtab = preg_split("/\|/",$out[4][0]); |
|
|
UMSDebug::Write($this->symtab,"symtab"); |
|
|
|
|
|
$this->radix = (int)$out[2][0]; |
|
|
UMSDebug::Write($this->radix,"radix"); |
|
|
|
|
|
$this->count = (int)$out[3][0]; |
|
|
UMSDebug::Write($this->count,"count"); |
|
|
|
|
|
if( $this->count != count($this->symtab)) return; |
|
|
|
|
|
|
|
|
$this->unbaser = new UMSUnbaser($this->radix); |
|
|
|
|
|
$result = preg_replace_callback( |
|
|
'/\b\w+\b/', |
|
|
array($this, 'Lookup') |
|
|
, |
|
|
$this->payload |
|
|
); |
|
|
$result = str_replace('\\', '', $result); |
|
|
UMSDebug::Write($result); |
|
|
$this->ReplaceStrings($result); |
|
|
return $result; |
|
|
} |
|
|
|
|
|
function Lookup($matches) |
|
|
{ |
|
|
$word = $matches[0]; |
|
|
$ub = $this->symtab[$this->unbaser->Unbase($word)]; |
|
|
$ret = !empty($ub) ? $ub : $word; |
|
|
return $ret; |
|
|
} |
|
|
|
|
|
function ReplaceStrings($source) |
|
|
{ |
|
|
preg_match_all("/var *(_\w+)\=\[\"(.*?)\"\];/",$source,$out); |
|
|
UMSDebug::Write($out); |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
class UMSUnbaser |
|
|
{ |
|
|
private $base; |
|
|
private $dict; |
|
|
private $selector = 52; |
|
|
private $ALPHABET = array( |
|
|
52 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP', |
|
|
54 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR', |
|
|
62 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', |
|
|
95 => ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' |
|
|
); |
|
|
|
|
|
|
|
|
function __construct($base) |
|
|
{ |
|
|
$this->base = $base; |
|
|
|
|
|
if($this->base > 62) $this->selector = 95; |
|
|
else if($this->base > 54) $this->selector = 62; |
|
|
else if($this->base > 52) $this->selector = 54; |
|
|
} |
|
|
|
|
|
function Unbase($val) |
|
|
{ |
|
|
if( 2 <= $this->base && $this->base <= 36) |
|
|
{ |
|
|
return intval($val,$this->base); |
|
|
}else{ |
|
|
if(!isset($this->dict)){ |
|
|
|
|
|
$this->dict = array_flip(str_split($this->ALPHABET[$this->selector])); |
|
|
} |
|
|
$ret = 0; |
|
|
$valArray = array_reverse(str_split($val)); |
|
|
|
|
|
for($i = 0; $i < count($valArray) ; $i++) |
|
|
{ |
|
|
$cipher = $valArray[$i]; |
|
|
$ret += pow($this->base, $i) * $this->dict[$cipher]; |
|
|
} |
|
|
return $ret; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
class UMSDebug |
|
|
{ |
|
|
public static $debug = false; |
|
|
public static function Write($data, $header = "", $mDebug = true) |
|
|
{ |
|
|
if(!self::$debug || !$mDebug) return; |
|
|
|
|
|
if(!empty($header)) |
|
|
echo "<h4>".$header."</h4>"; |
|
|
|
|
|
echo "<pre>"; |
|
|
print_r($data); |
|
|
echo "</pre>"; |
|
|
} |
|
|
|
|
|
} |
|
|
?> |