因站长有phpgoto解密并且做一些二开,找了5-6小时后,在某站花168元在买的,亲测后两个字“完美”。
其它很多php源码会进行goto加密,比如很多微擎应用。对于已加密的应用很多人是不敢直接使用的,因为不知道里面有些什么内容。 今天,分享源码网为您整理分享一套goto解密的源码 直接上传服务器就可以使用的。PHP7及以上。
将要解密的代码上传到decodeFile文件夹,然后访问index.php文件即可
?
解压出来的文件在complete文件。 当然如果你有能力二开的话可以将这套封装成付费解压的小工具。这套我自己现在也在用。
代码如下:
<?php
namespace app\acquiring\controller;
use PhpParser\Error;
use PhpParser\NodeDumper;
use PhpParser\ParserFactory;
use PhpParser\NodeTraverser;
use PhpParser\PrettyPrinter;
use PhpParser\NodeVisitor;
use PhpParser\Node;
use PhpParser\Node\Stmt\Function_;
use PhpParser\NodeVisitorAbstract;
foreach ([__DIR__ . '/vendor/autoload.php', __DIR__ . '/vendor/nikic/php-parser/vendor/autoload.php'] as $file) {
if (file_exists($file)) {
require $file;
break;
}
}
date_default_timezone_set('PRC');
$decodeObj = new Decode();
$decodeObj->batchDecode();
// $decodePath = __DIR__.'\\'.'decodeFile';
class Decode
{
//注意windos下和linux下路线格式不同
public $decodePath = __DIR__ .DIRECTORY_SEPARATOR. 'decodeFile';
public $completePath = __DIR__ . DIRECTORY_SEPARATOR . 'complete'.DIRECTORY_SEPARATOR;
public $replaceTipStr = "change_code_";
public $replaceTip = "<?php change_code_;";
public $replaceTipAst;
public $allTable = "";
public $tempObject = null;
public $parserObj;
public $printCount = 0;
public $printCount1 = 0;
public $printCount2 = 0;
public $functionType = 1;
public $foreachType = 2;
public $switchType = 3;
public $classType = 4;
public $allFindLabel = "";
public $allFindLabelStr = "";
public $existValue = "1";
public $notLabelNum = 0;
/** 遍历解密文件*/
public function batchDecode()
{
echo "解密后的文件存放路径:".$this->completePath;
echo "<br>";
echo "获取需要解密的文件";
echo "<br>";
$file_list = $this->get_file_list($this->decodePath);
echo "获取文件数:".count($file_list);
echo "<br>";
foreach ($file_list as $fileName) {
$this->startDecode($fileName);
}
}
public function get_file_list($file_path)
{
if (empty($file_path)) {
echo "未设置路径";
return false;
}
$file_list = [];
// $file_path = resource_path($path);
if (is_dir($file_path)) {
$handler = opendir($file_path);
while (($filename = readdir($handler)) !== false) {
if ($filename != "." && $filename != "..") {
$file_list[] = $filename;
}
}
closedir($handler);
return $file_list;
} else {
echo "文件目录不存在";
echo "<br>";
return array();
}
}
//开始解密
public function startDecode($fileName)
{
if (empty($fileName)) {
echo "未选择解密文件";
return false;
}
$code = file_get_contents($this->decodePath . '/' . $fileName);
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
$this->parserObj = $parser;
$traverser = new NodeTraverser();
$prettyPrinter = new PrettyPrinter\Standard;
// echo "<style>body{ background-color:#0C0C0C; color:green} font{ color: green;} </style>";
$dumper = new NodeDumper;
try {
$ast = $parser->parse($code);
$satrt_ast = $traverser->traverse($ast);
if(count($satrt_ast) >0 && get_class($satrt_ast[0]) == "PhpParser\Node\Stmt\Namespace_"){
$emptyStmts = array();
$stmtsArray = $satrt_ast[0] ->stmts;
$satrt_ast[0] ->stmts = $emptyStmts;
$satrt_ast = array_merge($satrt_ast,$stmtsArray);
}
// halt($ast);
// $test_me = $prettyPrinter->prettyPrint($ast);
// $dumper = new NodeDumper;
// echo "<pre>";
// echo $dumper->dump($ast);die;
$ast = $this->check_two_data($satrt_ast);
$newdata = [];
$alldata = $this->check_first_data($ast, $newdata);
$newdata = $alldata['newdata'];
if(!empty($alldata['startdata'])){
$startdata = $alldata['startdata'];
$nextgoto_old = '';
foreach ($newdata as $key => $value) {
if ($key == $startdata) {
$nextgoto_old = $value->name->nextgoto;
break;
}
}
$newdata = $this->sortIfData($newdata,$startdata);
}
$newdata = $this->checkIfData($newdata, 0);
if (!empty($alldata['startdata'])) {
// code...
$startdata = $alldata['startdata'];
// halt($newdata);
$firset_data = [];
$nextgoto_old = '';
foreach ($newdata as $key => $value) {
if ($key == $startdata) {
if(get_class($value) != 'PhpParser\Node\Stmt\Goto_'){
$firset_data[] = $value;
}
$nextgoto_old = $value->name->nextgoto;
break;
}
}
// halt($firset_data);
$res = $this->checkdata2($firset_data, $newdata, $nextgoto_old);
$tempArray = array();
foreach ($newdata as $key_new => $value_new) {
if($key_new == "startGoto"){
break;
}
if(strstr($key_new, "notLabel")){
$tempArray[] = $value_new;
}
}
if(count($tempArray) > 0){
$res = array_merge_recursive($tempArray,$res);
}
} else {
$res = $ast;
}
//一句一句解析。
// $contentCode = $this->getPrettyCode($prettyPrinter,$res);
// $this->prettyWriteCode($this->completePath . '\\' . $fileName, $prettyPrinter,$res);
echo "解密中...";
//直接全部一次性解析,大文件有可能会内存溢出
$contentCode = $prettyPrinter->prettyPrint($res);
$contentCode = "<?php" . "\n" . $contentCode;
$this->writeFile($this->completePath . $fileName, $contentCode);
echo $fileName."解密成功";
} catch (Error $error) {
echo "Parse error: {$error->getMessage()}\n";
return;
}
}
public function check_two_data($ast)
{
$nodeValue = "1";
foreach ($ast as $key => $value) {
if(get_class($ast[$key]) == 'PhpParser\Node\Stmt\If_' && !empty($value->stmts[0]) && get_class($value->stmts[0]) == 'PhpParser\Node\Stmt\Function_'){
$fore_arry = array();
$fore_arry[0] = $value->stmts[0];
$foreachData = $this->check_two_data($fore_arry);
$ast[$key]->stmts[0] = $foreachData[0];
}
if (get_class($ast[$key]) == 'PhpParser\Node\Stmt\TryCatch') {
if (!empty($value->stmts[0]->name->name)) {
$startdata = $value->stmts[0]->name->name;
// var_dump($startdata);die;
$newdata_new = [];
$firset_data = [];
$nextgoto_old = '';
foreach ($value->stmts as $key99 => $value99) {
if (get_class($value99) == 'PhpParser\Node\Stmt\Foreach_') {
$fore_arry[0] = $value99;
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Switch_') {
$fore_arry[0] = $value99;
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Function_') {
$fore_arry[0] = $value99;
$value->stmts[$key99] = $this->check_two_data($fore_arry);
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Label') {
// var_dump($value99);die;
// $newdata[$value->name->name] = $ast[$key+1];
if (!empty($value->stmts[$key99 + 1])) {
if (get_class($value->stmts[$key99 + 1]) != 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 2]->name->name;
}
if (get_class($value->stmts[$key99 - 1]) == 'PhpParser\Node\Stmt\Label' && get_class($value->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 1]->name->name;
foreach ($value->stmts as $key_node => $value_node){
if(!empty($value_node->name->name) && get_class($value_node) != 'PhpParser\Node\Stmt\Goto_' &&$value_node->name->name == $value->stmts[$key99 + 1]->name->name){
if(!empty($value->stmts[$key_node + 1])){
$value->stmts[$key_node+1]->name->isNode = &$nodeValue;
$value_node->name->isNode = &$nodeValue;
}else{
$value->stmts[$key_node]->name->isNode = &$nodeValue;
}
break;
}
}
}
if (get_class($value->stmts[$key99 - 1]) != 'PhpParser\Node\Stmt\Label' && get_class($value->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 1]->name->name;
}
}else {
$newdata_new[$value99->name->name] = $value->stmts[$key99];
$value->stmts[$key99]->name->finish = &$nodeValue;
}
}
}
foreach ($newdata_new as $key998 => $value998) {
if (empty($value998->name->nextgoto)) {
$newdata_new[$key998]->name->nextgoto = null;
}
if ($key998 == $startdata) {
if(get_class($value998) != 'PhpParser\Node\Stmt\Goto_' && get_class($value998) != 'PhpParser\Node\Stmt\Label'){
$firset_data[] = $value998;
}
$nextgoto_old = $value998->name->nextgoto;
}
}
$newdata_new = $this->sortIfData($newdata_new,$startdata);
$newdata_new = $this->checkIfData($newdata_new, $this->functionType);
if(count($firset_data)>0 && get_class($firset_data[0]) == 'PhpParser\Node\Stmt\If_'){
$nextgoto_old = $firset_data[0]->name->nextgoto;
}
$res = $this->checkdata2($firset_data, $newdata_new, $nextgoto_old,$this->functionType);
// var_dump($prettyPrinter->prettyPrint($res));
// die;
// halt($res);
$ast[$key]->stmts = $res;
}
}
if (get_class($ast[$key]) == 'PhpParser\Node\Stmt\Function_') {
// foreach ($ast[$key] as $key2 => $value2) {
if (!empty($value->stmts[0]->name->name)) {
$startdata = $value->stmts[0]->name->name;
// var_dump($startdata);die;
$newdata_new = [];
$firset_data = [];
$nextgoto_old = '';
foreach ($value->stmts as $key99 => $value99) {
if (get_class($value99) == 'PhpParser\Node\Stmt\Foreach_') {
$fore_arry[0] = $value99;
//halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
// $value->stmts[$key99] = $this->check_two_data($fore_arry);
}
if (get_class($value99) == 'PhpParser\Node\Stmt\TryCatch') {
$fore_arry[0] = $value99;
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Switch_') {
$fore_arry[0] = $value99;
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Function_') {
$fore_arry[0] = $value99;
// halt($fore_arry);
$value->stmts[$key99] = $this->check_two_data($fore_arry);
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Label') {
// var_dump($value99);die;
// $newdata[$value->name->name] = $ast[$key+1];
if (!empty($value->stmts[$key99 + 1])) {
if (get_class($value->stmts[$key99 + 1]) != 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 2]->name->name;
}
if (get_class($value->stmts[$key99 - 1]) == 'PhpParser\Node\Stmt\Label' && get_class($value->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 1]->name->name;
foreach ($value->stmts as $key_node => $value_node){
if(!empty($value_node->name->name) && get_class($value_node) != 'PhpParser\Node\Stmt\Goto_' &&$value_node->name->name == $value->stmts[$key99 + 1]->name->name){
if(!empty($value->stmts[$key_node + 1])){
$value->stmts[$key_node+1]->name->isNode = &$nodeValue;
$value_node->name->isNode = &$nodeValue;
}else{
$value->stmts[$key_node]->name->isNode = &$nodeValue;
}
break;
}
}
}
if (get_class($value->stmts[$key99 - 1]) != 'PhpParser\Node\Stmt\Label' && get_class($value->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 1]->name->name;
}
}else {
$newdata_new[$value99->name->name] = $value->stmts[$key99];
$value->stmts[$key99]->name->finish = &$nodeValue;
}
}elseif (get_class($value99) != 'PhpParser\Node\Stmt\Goto_'){
if($key99 == 0 || ($key99 > 0 && get_class($value->stmts[$key99 - 1]) != 'PhpParser\Node\Stmt\Label')){
$tempKey = "notLabel".$this->notLabelNum;
$this->notLabelNum = $this->notLabelNum + 1;
$newdata_new[$tempKey] = $value->stmts[$key99];
if($key99 >0 && empty($value->stmts[$key99 - 1]->name->nextgoto)){
if(empty($value->stmts[$key99 - 1]->name)){
$value->stmts[$key99 - 1]->name = new \stdClass();
}
$value->stmts[$key99 - 1]->name->nextgoto = $tempKey;
}
$astLength = count($value->stmts);
if($key99 + 1 < $astLength && get_class($value->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_'){
if(empty($value->stmts[$key99]->name)){
$value->stmts[$key99]->name = new \stdClass();
}
$value->stmts[$key99]->name->nextgoto = $value->stmts[$key99 + 1]->name->name;
}
}
}
}
foreach ($newdata_new as $key998 => $value998) {
if (empty($value998->name->nextgoto)) {
// var_dump($value998->name);die;
$newdata_new[$key998]->name->nextgoto = null;
}
if ($key998 == $startdata) {
if(get_class($value998) != 'PhpParser\Node\Stmt\Goto_' && get_class($value998) != 'PhpParser\Node\Stmt\Label'){
$firset_data[] = $value998;
}
$nextgoto_old = $value998->name->nextgoto;
}
}
// $test_code = $prettyPrinter->prettyPrint($newdata_new);
// halt($newdata_new);
// $newdata_new = $this->chekif($newdata_new, 2);
$newdata_new = $this->sortIfData($newdata_new,$startdata);
$newdata_new = $this->checkIfData($newdata_new, $this->functionType);
if(count($firset_data)>0 && get_class($firset_data[0]) == 'PhpParser\Node\Stmt\If_'){
$nextgoto_old = $firset_data[0]->name->nextgoto;
}
$res = $this->checkdata2($firset_data, $newdata_new, $nextgoto_old,$this->functionType);
// var_dump($prettyPrinter->prettyPrint($res));
// die;
// halt($res);
$ast[$key]->stmts = $res;
}elseif(get_class($value->stmts[0]) == 'PhpParser\Node\Stmt\TryCatch'){
$fore_arry[0] = $value->stmts[0];
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[0] = $foreachData[0];
}
}
if (get_class($ast[$key]) == 'PhpParser\Node\Stmt\Foreach_' || get_class($ast[$key]) == 'PhpParser\Node\Stmt\While_') {
// foreach ($ast[$key] as $key2 => $value2) {
if (!empty($value->stmts[0]->name->name)) {
$startdata = $value->stmts[0]->name->name;
// var_dump($startdata);die;
$newdata_new = [];
$firset_data = [];
$nextgoto_old = '';
foreach ($value->stmts as $key99 => $value99) {
if (get_class($value99) == 'PhpParser\Node\Stmt\Foreach_') {
$fore_arry[0] = $value99;
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\TryCatch') {
$fore_arry[0] = $value99;
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Switch_') {
$fore_arry[0] = $value99;
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
// $startdata = '';
if (get_class($value99) == 'PhpParser\Node\Stmt\Label') {
// var_dump($value99);die;
// $newdata[$value->name->name] = $ast[$key+1];
if (!empty($value->stmts[$key99 + 1])) {
if (get_class($value->stmts[$key99 + 1]) != 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 2]->name->name;
}
if (get_class($value->stmts[$key99 - 1]) == 'PhpParser\Node\Stmt\Label' && get_class($value->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 1]->name->name;
foreach ($value->stmts as $key_node => $value_node){
if(!empty($value_node->name->name) && get_class($value_node) != 'PhpParser\Node\Stmt\Goto_' &&$value_node->name->name == $value->stmts[$key99 + 1]->name->name){
if(!empty($value->stmts[$key_node + 1])){
$value->stmts[$key_node+1]->name->isNode = &$nodeValue;
$value_node->name->isNode = &$nodeValue;
}else{
$value->stmts[$key_node]->name->isNode = &$nodeValue;
}
break;
}
}
}
if (get_class($value->stmts[$key99 - 1]) != 'PhpParser\Node\Stmt\Label' && get_class($value->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value->stmts[$key99 + 1];
$value->stmts[$key99 + 1]->name->nextgoto = &$value->stmts[$key99 + 1]->name->name;
}
} else {
$newdata_new[$value99->name->name] = $value->stmts[$key99];
$value->stmts[$key99]->name->finish = &$nodeValue;
}
}
}
foreach ($newdata_new as $key998 => $value998) {
if (empty($value998->name->nextgoto)) {
// var_dump($value998->name);die;
$newdata_new[$key998]->name->nextgoto = null;
}
if ($key998 == $startdata) {
if(get_class($value998) != 'PhpParser\Node\Stmt\Goto_' && get_class($value998) != 'PhpParser\Node\Stmt\Label'){
$firset_data[] = $value998;
}
$nextgoto_old = $value998->name->nextgoto;
}
}
$newdata_new = $this->sortIfData($newdata_new,$startdata);
$newdata_new = $this->checkIfData($newdata_new, $this->foreachType);
if(count($firset_data)>0 && get_class($firset_data[0]) == 'PhpParser\Node\Stmt\If_'){
$nextgoto_old = $firset_data[0]->name->nextgoto;
}
$res = $this->checkdata2($firset_data, $newdata_new, $nextgoto_old,$this->foreachType);
$ast[$key]->stmts = $res;
} else {
if (!empty($ast[$key]->stmts)) {
foreach ($ast[$key]->stmts as $key9527 => $value9527) {
// halt($ast[$key]->stmts);
if (get_class($ast[$key]->stmts[$key9527]) == 'PhpParser\Node\Stmt\Label') {
unset($ast[$key]->stmts[$key9527]);
}
}
}
}
}
if (get_class($ast[$key]) == 'PhpParser\Node\Stmt\Switch_') {
foreach ($ast[$key]->cases as $key2 => $value2) {
if (!empty($value2->stmts[0]->name->name)) {
$startdata = $value2->stmts[0]->name->name;
// var_dump($startdata);die;
$newdata_new = [];
$firset_data = [];
$fore_arry = [];
$nextgoto_old = '';
foreach ($value2->stmts as $key99 => $value99) {
if (get_class($value99) == 'PhpParser\Node\Stmt\Foreach_') {
$fore_arry[0] = $value99;
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value2->stmts[$key99] = $foreachData[0];
// $value2->stmts[$key99] = $this->check_two_data($fore_arry);
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Switch_') {
$fore_arry[0] = $value99;
$foreachData = $this->check_two_data($fore_arry);
$value->stmts[$key99] = $foreachData[0];
}
// $startdata = '';
if (get_class($value99) == 'PhpParser\Node\Stmt\Label') {
// var_dump($value99);die;
// $newdata[$value->name->name] = $ast[$key+1];
if (!empty($value2->stmts[$key99 + 1])) {
if (get_class($value2->stmts[$key99 + 1]) != 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value2->stmts[$key99 + 1];
$value2->stmts[$key99 + 1]->name->nextgoto = &$value2->stmts[$key99 + 2]->name->name;
}
if (get_class($value2->stmts[$key99 - 1]) == 'PhpParser\Node\Stmt\Label' && get_class($value2->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value2->stmts[$key99 + 1];
$value2->stmts[$key99 + 1]->name->nextgoto = &$value2->stmts[$key99 + 1]->name->name;
foreach ($value2->stmts as $key_node => $value_node){
if(!empty($value_node->name->name) && get_class($value_node) != 'PhpParser\Node\Stmt\Goto_' &&$value_node->name->name == $value2->stmts[$key99 + 1]->name->name){
if(!empty($value2->stmts[$key_node + 1])){
$value2->stmts[$key_node+1]->name->isNode = &$nodeValue;
$value_node->name->isNode = &$nodeValue;
}else{
$value2->stmts[$key_node]->name->isNode = &$nodeValue;
}
break;
}
}
}
if (get_class($value2->stmts[$key99 - 1]) != 'PhpParser\Node\Stmt\Label' && get_class($value2->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value2->stmts[$key99 + 1];
$value2->stmts[$key99 + 1]->name->nextgoto = &$value2->stmts[$key99 + 1]->name->name;
}
}else {
$newdata_new[$value99->name->name] = $value2->stmts[$key99];
$value2->stmts[$key99]->name->finish = &$nodeValue;
}
}
}
foreach ($newdata_new as $key998 => $value998) {
if (empty($value998->name->nextgoto)) {
// var_dump($value998->name);die;
$newdata_new[$key998]->name->nextgoto = null;
}
if ($key998 == $startdata) {
if(get_class($value998) != 'PhpParser\Node\Stmt\Goto_' && get_class($value998) != 'PhpParser\Node\Stmt\Label'){
$firset_data[] = $value998;
}
$nextgoto_old = $value998->name->nextgoto;
}
}
// $test_code = $prettyPrinter->prettyPrint($newdata_new);
// halt($newdata_new);
$newdata_new = $this->sortIfData($newdata_new,$startdata);
$newdata_new = $this->checkIfData( $newdata_new, $this->switchType);
if(count($firset_data)>0 && get_class($firset_data[0]) == 'PhpParser\Node\Stmt\If_'){
$nextgoto_old = $firset_data[0]->name->nextgoto;
}
// var_dump($newdata_new);
// halt($newdata_new);
$res = $this->checkdata2($firset_data, $newdata_new, $nextgoto_old,$this->switchType);
// var_dump($prettyPrinter->prettyPrint($res));
// halt($res);
$ast[$key]->cases[$key2]->stmts = $res;
}else {
if (!empty($value2) && !empty($value2->stmts)) {
foreach ($value2->stmts as $key_remove => $value_remove) {
// halt($ast[$key]->stmts);
if (get_class($value_remove) == 'PhpParser\Node\Stmt\Label') {
unset($value2->stmts[$key_remove]);
}
if(get_class($value_remove) == 'PhpParser\Node\Stmt\Goto_'){
$attributes = array();
$breakStd = new \PhpParser\Node\Stmt\Break_(null,$attributes);
$value2->stmts[$key_remove] = $breakStd;
}
}
}
}
}
}
if (get_class($ast[$key]) == 'PhpParser\Node\Stmt\Class_') {
foreach ($ast[$key]->stmts as $key2 => $value2) {
if (get_class($value2) == 'PhpParser\Node\Stmt\ClassMethod') {
if (!empty($value2->stmts[0]->name->name)) {
$startdata = $value2->stmts[0]->name->name;
// var_dump($startdata);die;
$newdata_new = [];
$firset_data = [];
$nextgoto_old = '';
foreach ($value2->stmts as $key99 => $value99) {
if (get_class($value99) == 'PhpParser\Node\Stmt\Foreach_') {
$fore_arry[0] = $value99;
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value2->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\TryCatch') {
$fore_arry[0] = $value99;
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value2->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Function_') {
$fore_arry[0] = $value99;
$foreachData = $this->check_two_data($fore_arry);
$value2->stmts[$key99] = $foreachData[0];
}
if (get_class($value99) == 'PhpParser\Node\Stmt\Switch_') {
$fore_arry[0] = $value99;
$foreachData = $this->check_two_data($fore_arry);
$value2->stmts[$key99] = $foreachData[0];
}
// $startdata = '';
if (get_class($value99) == 'PhpParser\Node\Stmt\Label') {
// var_dump($value99);die;
// $newdata[$value->name->name] = $ast[$key+1];
if (!empty($value2->stmts[$key99 + 1])) {
if (get_class($value2->stmts[$key99 + 1]) != 'PhpParser\Node\Stmt\Goto_') {
// if($value99->name->name == "g0ibM"){
// echo "g0ibM";
// }
$newdata_new[$value99->name->name] = $value2->stmts[$key99 + 1];
$value2->stmts[$key99 + 1]->name->nextgoto = &$value2->stmts[$key99 + 2]->name->name;
}
if (get_class($value2->stmts[$key99 - 1]) == 'PhpParser\Node\Stmt\Label' && get_class($value2->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value2->stmts[$key99 + 1];
$value2->stmts[$key99 + 1]->name->nextgoto = &$value2->stmts[$key99 + 1]->name->name;
// $value2->stmts[$key99 + 1]->name->isNode = &$nodeValue;
foreach ($value2->stmts as $key_node => $value_node){
if(!empty($value_node->name->name) && get_class($value_node) != 'PhpParser\Node\Stmt\Goto_' &&$value_node->name->name == $value2->stmts[$key99 + 1]->name->name){
if(!empty($value2->stmts[$key_node + 1])){
$value2->stmts[$key_node+1]->name->isNode = &$nodeValue;
$value_node->name->isNode = &$nodeValue;
}else{
$value2->stmts[$key_node]->name->isNode = &$nodeValue;
}
break;
}
}
}
if (get_class($value2->stmts[$key99 - 1]) != 'PhpParser\Node\Stmt\Label' && get_class($value2->stmts[$key99 + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata_new[$value99->name->name] = $value2->stmts[$key99 + 1];
$value2->stmts[$key99 + 1]->name->nextgoto = &$value2->stmts[$key99 + 1]->name->name;
}
}else {
$newdata_new[$value99->name->name] = $value2->stmts[$key99];
$value2->stmts[$key99]->name->finish = &$nodeValue;
}
}
}
foreach ($newdata_new as $key998 => $value998) {
if (empty($value998->name->nextgoto)) {
// var_dump($value998->name);die;
$newdata_new[$key998]->name->nextgoto = null;
}
if ($key998 == $startdata) {
if(get_class($value998) != 'PhpParser\Node\Stmt\Goto_' && get_class($value998) != 'PhpParser\Node\Stmt\Label'){
$firset_data[] = $value998;
}
$nextgoto_old = $value998->name->nextgoto;
}
}
$newdata_new = $this->sortIfData($newdata_new,$startdata);
$newdata_new = $this->checkIfData($newdata_new, $this->classType);
if(count($firset_data)>0 && get_class($firset_data[0]) == 'PhpParser\Node\Stmt\If_'){
$nextgoto_old = $firset_data[0]->name->nextgoto;
}
$res = $this->checkdata2($firset_data, $newdata_new, $nextgoto_old,$this->classType);
$ast[$key]->stmts[$key2]->stmts = $res;
}else{
if (!empty($value2) && !empty($value2->stmts)) {
foreach ($value2->stmts as $key_search => $value_search) {
if (get_class($value_search) == 'PhpParser\Node\Stmt\TryCatch' || get_class($value_search) == 'PhpParser\Node\Stmt\Foreach_') {
$fore_arry[0] = $value_search;
// halt($fore_arry);
$foreachData = $this->check_two_data($fore_arry);
$value2->stmts[$key_search] = $foreachData[0];
}
}
}
}
}
}
}
}
return $ast;
}
public function check_first_data($ast, $newdata)
{
$nodeValue = "1";
$emptyString = "";
$astLength = count($ast);
$classLabel = "";
$nodeLabel = "";
foreach ($ast as $key => $value) {
if (get_class($value) == 'PhpParser\Node\Stmt\Label' && ($key + 1 < $astLength) && get_class($ast[$key + 1]) == 'PhpParser\Node\Stmt\Class_') {
$classLabel = $classLabel.$ast[$key]->name->name.",";
}
}
foreach ($ast as $key => $value) {
if (get_class($value) == 'PhpParser\Node\Stmt\Goto_' && empty($startdata)) {
$startdata = $ast[$key]->name->name;
$newdata['startGoto'] = $ast[$key];
$alldata['startdata'] = $startdata;
}
if (get_class($value) == 'PhpParser\Node\Stmt\Goto_') {
}
if (get_class($value) == 'PhpParser\Node\Stmt\Label') {
if (!empty($ast[$key + 1]) && !empty($ast[$key + 2])) {
if (get_class($ast[$key + 1]) != 'PhpParser\Node\Stmt\Goto_') {
$newdata[$value->name->name] = $ast[$key + 1];
$ast[$key + 1]->name->nextgoto = &$ast[$key + 2]->name->name;
}
if (get_class($ast[$key - 1]) == 'PhpParser\Node\Stmt\Label' && get_class($ast[$key + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata[$value->name->name] = $ast[$key + 1];
$ast[$key + 1]->name->nextgoto = &$ast[$key + 1]->name->name;
if(!empty($ast[$key + 1]->name->name)){
if(!strstr($nodeLabel, $ast[$key + 1]->name->name)){
$nodeLabel = $nodeLabel.$ast[$key + 1]->name->name.",";
}
}
}
if (get_class($ast[$key - 1]) != 'PhpParser\Node\Stmt\Label' && get_class($ast[$key + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata[$value->name->name] = $ast[$key + 1];
$ast[$key + 1]->name->nextgoto = &$ast[$key + 1]->name->name;
}
}else if(!empty($ast[$key + 1]) && ($key + 2 == $astLength)){
if (get_class($ast[$key + 1]) != 'PhpParser\Node\Stmt\Goto_') {
$newdata[$value->name->name] = $ast[$key + 1];
}
if (get_class($ast[$key + 1]) == 'PhpParser\Node\Stmt\Goto_') {
$newdata[$value->name->name] = $ast[$key + 1];
$ast[$key + 1]->name->nextgoto = &$ast[$key + 1]->name->name;
}
}elseif(($key + 1 == $astLength)){
$newdata[$value->name->name] = $ast[$key];
$value->name->finish = &$nodeValue;
$value->name->exitFinish = &$nodeValue;
if(get_class($ast[$key - 1]) == 'PhpParser\Node\Stmt\Label'){
$value->name->otherFinishLabel = &$ast[$key - 1]->name->name;
}
}
}elseif (get_class($value) != 'PhpParser\Node\Stmt\Goto_'){
if($key == 0 || ($key > 0 && get_class($ast[$key - 1]) != 'PhpParser\Node\Stmt\Label')){
$tempKey = "notLabel".$this->notLabelNum;
$this->notLabelNum = $this->notLabelNum + 1;
$newdata[$tempKey] = $ast[$key];
if($key >0 && empty($ast[$key - 1]->name->nextgoto)){
if(empty($ast[$key - 1]->name)){
$ast[$key - 1]->name = new \stdClass();
}
$ast[$key - 1]->name->nextgoto = $tempKey;
}
if($key + 1 < $astLength && get_class($ast[$key + 1]) == 'PhpParser\Node\Stmt\Goto_'){
if(empty($ast[$key]->name)){
$ast[$key]->name = new \stdClass();
}
$ast[$key]->name->nextgoto = $ast[$key + 1]->name->name;
}
}
}
}
foreach ($ast as $key_node => $value_node){
if(!empty($value_node->name->name) && get_class($value_node) != 'PhpParser\Node\Stmt\Goto_' && strstr($nodeLabel, $value_node->name->name)){
if(!empty($ast[$key_node + 1])){
$ast[$key_node+1]->name->isNode = &$nodeValue;
$value_node->name->isNode = &$nodeValue;
}else{
$ast[$key_node]->name->isNode = &$nodeValue;
}
}
}
foreach ($newdata as $key => $value) {
if (empty($value->name->nextgoto)) {
$newdata[$key]->name->nextgoto = &$emptyString;
$newdata[$key]->name->nextgoto = null;
}
}
$alldata['newdata'] = $newdata;
return $alldata;
}
public function checkdata($firset_data, $newdata, $nextgoto_new)
{
MYGOD:
foreach ($newdata as $key2 => $value2) {
if ($nextgoto_new == $key2) {
$firset_data[] = $value2;
if (!empty($value2->name->nextgoto)) {
$nextgoto_new = $value2->name->nextgoto;
goto MYGOD;
}
}
}
return $firset_data;
}
public function packageData($firset_data, $newdata, $nextgoto_new,$stopStr="")
{
$this->allFindLabel = "";
if(empty($newdata)){
return $firset_data;
}elseif($nextgoto_new == $stopStr){
return $firset_data;
}
$lastKey = "";
MYGOD:
foreach ($newdata as $key2 => $value2) {
if ($nextgoto_new == $key2) {
if(!strstr($this->allFindLabel, $key2)){
$this->allFindLabel = $this->allFindLabel.$key2.";";
}else{
if(get_class($value2) == 'PhpParser\Node\Stmt\If_'){
if(!empty($value2->stmts[0]->name->name)){
$nextgoto_new = $value2->stmts[0]->name->name;
goto MYGOD;
}
}
goto MYGOD2;
}
if (get_class($value2) != 'PhpParser\Node\Stmt\Goto_' && get_class($value2) != 'PhpParser\Node\Stmt\Label') {
$firset_data[$key2] = $value2;
}
if(get_class($value2) == 'PhpParser\Node\Stmt\Label' && !empty($value2->name->finish) && $value2->name->finish == "1"){
$firset_data[$key2] = $value2;
}
if (!empty($value2->name->nextgoto)) {
if(!empty($stopStr)){
if($value2->name->nextgoto == $stopStr){
goto MYGOD2;
}
}
$nextgoto_new = $value2->name->nextgoto;
$lastKey = $key2;
if(empty($newdata[$nextgoto_new])){
$firset_data[$key2] = $value2;
}
goto MYGOD;
}
}
}
MYGOD2:
return $firset_data;
}
public function checkLoopData($firset_data, $newdata, $nextgoto_new,$type = 0,$stopStr="")
{
$this->allFindLabel = "";
if(empty($newdata)){
return $firset_data;
}
$lastKey = "";
MYGOD:
foreach ($newdata as $key2 => $value2) {
if ($nextgoto_new == $key2) {
if(!strstr($this->allFindLabel, $key2)){
$this->allFindLabel = $this->allFindLabel.$key2.";";
}else{
goto MYGOD2;
}
if (get_class($value2) != 'PhpParser\Node\Stmt\Goto_' && get_class($value2) != 'PhpParser\Node\Stmt\Label') {
$firset_data[] = &$value2;
}
if (get_class($value2) == 'PhpParser\Node\Stmt\Return_') {
// code...
goto MYGOD2;
}
if (!empty($value2->expr)) {
if (get_class($value2->expr) == 'PhpParser\Node\Expr\Exit_') {
// code...
// var_dump(get_class($value2->expr));
goto MYGOD2;
}
}
if (!empty($value2->name->nextgoto)) {
$nextgoto_new = $value2->name->nextgoto;
if($type == $this->switchType && empty($newdata[$nextgoto_new])){
$attributes = array();
$breakStd = new \PhpParser\Node\Stmt\Break_(null,$attributes);
$firset_data[] = $breakStd;
}
if(!empty($stopStr)){
if($value2->name->nextgoto == $stopStr){
goto MYGOD2;
}
}
$lastKey = $key2;
goto MYGOD;
}
}
}
MYGOD2:
return $firset_data;
}
//提取if的语句
public function extractIfData($newdata,$nextgoto_new,$lastLabel=""){
$ifDataArray = [];
// $lastLabel = "";
while (!empty($nextgoto_new)){
if(!empty($newdata[$nextgoto_new]) && !strstr($this->allFindLabel, $nextgoto_new)){
$this->allFindLabel = $this->allFindLabel.$nextgoto_new.";";
$value = $newdata[$nextgoto_new];
if (get_class($value) == 'PhpParser\Node\Stmt\If_') {
if(empty($value->name)){
$value->name = new \stdClass();
}
if(empty($value->name->lastLabelOne)){
$value->name->lastLabelOne = $lastLabel;
}else{
$value->name->lastLabelTwo = $lastLabel;
}
$ifDataArray[$nextgoto_new] = $value;
if(!empty($value->stmts) && !empty($value->stmts[0]->name->name)){
if (get_class($value) != 'PhpParser\Node\Stmt\Goto_' && get_class($value) != 'PhpParser\Node\Stmt\Label'){
$lastLabel = $nextgoto_new;
}
$insideArray = $this->extractIfData($newdata,$value->stmts[0]->name->name,$lastLabel);
$ifDataArray = array_merge($ifDataArray,$insideArray);
}
}
if (!empty($value->name->nextgoto)) {
if (get_class($value) != 'PhpParser\Node\Stmt\Goto_' && get_class($value) != 'PhpParser\Node\Stmt\Label'){
$lastLabel = $nextgoto_new;
}
// $lastLabel = $nextgoto_new;
$nextgoto_new = $value->name->nextgoto;
}else{
$nextgoto_new = "";
}
}else {
$nextgoto_new = "";
}
}
return $ifDataArray;
}
//把if按顺序排
public function sortIfData($newdata,$nextgoto_new)
{
$this->allFindLabel = "";
$ifDataArray = [];
// $allDataArray = [];
if(empty($newdata)){
return $ifDataArray;
}
$ifDataArray = $this->extractIfData($newdata,$nextgoto_new);
$otherDataArray = array();
foreach ($newdata as $key => $value){
if(empty($ifDataArray[$key])){
// $ifDataArray[$key] = $value;
$otherDataArray[$key] = $value;
}
}
$allDataArray = array_merge_recursive($otherDataArray,$ifDataArray);
return $allDataArray;
}
public function checkdata2($firset_data, &$newdata, $nextgoto_new,$type = 0,$stopStr="",$nowKey="")
{
$start_nextgot = $nextgoto_new;
$this->allFindLabel = "";
if(!empty($nowKey)){
$this->allFindLabel = $nowKey.",";
}
if(empty($newdata)){
return $firset_data;
}
$lastKey = "";
MYGOD:
foreach ($newdata as $key2 => $value2) {
if ($nextgoto_new == $key2) {
if(!strstr($this->allFindLabel, $key2)){
$this->allFindLabel = $this->allFindLabel.$key2.",";
}else{
if($nowKey == $key2){
$newdata["$nowKey"]->name->isWhile = &$this->existValue;
}
goto MYGOD2;
}
if (get_class($value2) != 'PhpParser\Node\Stmt\Goto_' && get_class($value2) != 'PhpParser\Node\Stmt\Label') {
$firset_data[] = $value2;
}
if (get_class($value2) == 'PhpParser\Node\Stmt\Return_') {
// code...
goto MYGOD2;
}
if (!empty($value2->expr)) {
if (get_class($value2->expr) == 'PhpParser\Node\Expr\Exit_') {
goto MYGOD2;
}
}
//最后一个label
if(!empty($value2->name->exitFinish) && $value2->name->exitFinish == 1 && get_class($value2) == 'PhpParser\Node\Stmt\Label'){
if(!empty($nowKey) && get_class($newdata[$nowKey]) == 'PhpParser\Node\Stmt\If_'){
if($start_nextgot != $newdata[$nowKey]->name->nextgoto){
$attributes = array();
$attributes['kind'] = 1;
$exitStd = new \PhpParser\Node\Expr\Exit_(null,$attributes);
$expressionStd = new \PhpParser\Node\Stmt\Expression($exitStd,$attributes);
$firset_data[] = $expressionStd;
}
}
}
if (!empty($value2->name->nextgoto)) {
$nextgoto_new = $value2->name->nextgoto;
if($type == $this->switchType && empty($newdata[$nextgoto_new])){
$attributes = array();
$breakStd = new \PhpParser\Node\Stmt\Break_(null,$attributes);
$firset_data[] = $breakStd;
}
if(!empty($stopStr)){
if($value2->name->nextgoto == $stopStr){
goto MYGOD2;
}
}
$lastKey = $key2;
goto MYGOD;
}
}
}
MYGOD2:
return $firset_data;
}
//检查if语句部分的代码是否需要反向解密
public function checkIfData($newdata,$type)
{
foreach ($newdata as $key => $value) {
if (get_class($value) == 'PhpParser\Node\Stmt\If_' || get_class($value) == 'PhpParser\Node\Stmt\Foreach_') {
// halt($value);
if (!empty($value->stmts[0]->name->name)) {
$insideLabel = $value->stmts[0]->name->name;
if(!empty($newdata[$insideLabel])){
$firset_data = [];
// if($key == "YwAsH"){
// echo "UZkI3";
// }
if (get_class($value) == 'PhpParser\Node\Stmt\If_' && !empty($value->name->nextgoto)){
$firstStr = $this->findIFLabel($value->stmts[0]->name->name, $newdata);
if(!empty($firstStr) && empty($newdata[$firstStr]->name->nextgoto) && !empty($newdata[$firstStr]->name->finish) &&
$newdata[$firstStr]->name->finish == "1"){
if(!empty($newdata[$firstStr]->name->otherFinishLabel)){
$firstStr = $newdata[$firstStr]->name->otherFinishLabel;
}
}
// echo "key:".$key.";";
$this->allFindLabelStr = "";
$nextStr = $this->compareNextLabel($value->name->nextgoto, $newdata,$firstStr,$type,$key);
if(!empty($nextStr) && !empty($value->name->whileLabel) && $nextStr == $newdata[$value->name->whileLabel]->name->nextgoto){
$nextStr = "";
}elseif(!empty($value->name->whileLabel) && $value->name->whileLabel == $value->name->nextgoto){
$nextStr = "";
$value->name->isChange = "";
}
if(!empty($nextStr) || !empty($value->name->isChange) || !empty($value->name->isWhile) || !empty($value->name->isBreak)){
// //条件跳转跟下一句的nextgoto跳转相同
// //条件需要反向的处理
if(get_class($value->cond) == 'PhpParser\Node\Expr\BooleanNot'){
$tempCond = $value->cond->expr;
$value->cond = $tempCond;
}else{
$tempCond = $value->cond;
$attributes = $tempCond->getAttributes();;
$user = new \PhpParser\Node\Expr\BooleanNot($tempCond,$attributes);
$value->cond = $user;
}
$value->stmts[0]->name->name = $value->name->nextgoto;
$value->name->nextgoto = $firstStr;
if(!empty($value->name->isInsideLoop) && empty($value->name->isWhile)){
$value->name->stopgoto = $value->name->isInsideLoop;
$value->name->isWhile = &$this->existValue;
}
if(!empty($value->name->isWhile) && !empty($this->allFindLabelStr)){
$this->allFindLabel = $key.",";
$this->setWhileData($value->stmts[0]->name->name,$newdata,$key);
}
if(!empty($nextStr)){
$value->name->stopgoto = $nextStr;
}elseif(!empty($value->name->isChange)){
$value->name->stopgoto = $value->name->isChange;
if(!empty($value->name->isWhile)){
$checkDataResult = $this->packageData($firset_data, $newdata, $value->stmts[0]->name->name,$key);
}else{
$checkDataResult = $this->packageData($firset_data, $newdata, $value->stmts[0]->name->name);
}
$firset_data = [];
$checkNextDataResult = $this->packageData($firset_data, $newdata, $value->name->nextgoto,$value->name->stopgoto);
$sameNodeStr = $this->selectSameNode($checkDataResult,$checkNextDataResult);
if(!empty($sameNodeStr)){
//存在else的情况
$value->name->elseStr = $sameNodeStr;
$newdata[$key]->name->oldnextgoto = $value->name->nextgoto;
$newdata[$key]->name->nextgoto = $sameNodeStr;
$value->name->stopgoto = "";
}
}elseif(!empty($value->name->isWhile) && empty($value->name->stopgoto)){
$value->name->stopgoto = $key;
}
else {
// $value->name->stopgoto = $value->name->isBreak;
}
}elseif(!empty($value->name->isInsideLoop)){
$value->name->stopgoto = $value->name->isInsideLoop;
$value->name->isWhile = &$this->existValue;
}
else{
if(!empty($value->name->whileLabel)){
$whileLabel = $value->name->whileLabel;
}else{
$whileLabel = "";
}
$checkDataResult = $this->packageData($firset_data, $newdata, $insideLabel,$whileLabel);
$checkNextDataResult = $this->packageData($firset_data, $newdata, $value->name->nextgoto,$whileLabel);
$sameNodeStr = $this->selectSameNode($checkDataResult,$checkNextDataResult);
if(!empty($sameNodeStr)){
//存在else的情况
$value->name->elseStr = $sameNodeStr;
$newdata[$key]->name->oldnextgoto = $value->name->nextgoto;
$newdata[$key]->name->nextgoto = $sameNodeStr;
}
}
$newdata[$key]->name->oldIfLabel = $key;
}
}
}
}
}
//处理if中的
foreach ($newdata as $key => $value) {
if (get_class($value) == 'PhpParser\Node\Stmt\If_' || get_class($value) == 'PhpParser\Node\Stmt\Foreach_') {
// halt($value);
if (!empty($value->stmts[0]->name->name)) {
foreach ($newdata as $key996 => $value996) {
if ($key996 == $value->stmts[0]->name->name) {
$firset_data = [];
if($type == $this->foreachType || $type == $this->switchType){
$code2 = '<?php break;';
$code2 = $this->parserObj->parse($code2);
}else {
$code2 = '<?php return false;';
$code2 = $this->parserObj->parse($code2);
}
// if($key == "UZkI3"){
// echo "UZkI3";
// }
if (get_class($value) == 'PhpParser\Node\Stmt\If_' && !empty($value->name->nextgoto)){
if(!empty($value->name->stopgoto)){
if(!empty($value->name->isWhile)){
// $this ->restoreWhile($key,$newdata);
// $checkDataResult = $this->checkdata2($firset_data, $newdata, $key996,$type,$stopStr);
$checkDataResult = $this->checkdata2($firset_data, $newdata, $value->stmts[0]->name->name,0,$value->name->stopgoto,$key);
$newdata[$key]->stmts = !empty($checkDataResult) ? $checkDataResult : $code2;
}else{
$stopStr = $value->name->stopgoto;
$checkDataResult = $this->checkdata2($firset_data, $newdata, $key996,$type,$stopStr,$key);
if(!empty($value->name->whileLabel)){
if(!empty($value->name->isChange)){
$tempWhileLabel = $value->name->isChange;
}else {
$tempWhileLabel = $value->name->whileLabel;
}
//判断是否有break的情况
$whileLabelNext = $newdata[$tempWhileLabel]->name->nextgoto;
if(strstr($this->allFindLabel,$whileLabelNext)){
$checkDataResult = $this->checkdata2($firset_data, $newdata, $key996,$type,$whileLabelNext,$key);
$attributes = array();
$breakStd = new \PhpParser\Node\Stmt\Break_(null,$attributes);
$checkDataResult[] = $breakStd;
}
}
$newdata[$key]->stmts = !empty($checkDataResult) ? $checkDataResult : $code2;
}
}elseif(!empty($value->name->elseStr)){
// $this->judgeElseIf($newdata,$sameNodeStr,$key,$key996,$value->name->oldnextgoto,$type);
//存在else的情况
$sameNodeStr = $value->name->elseStr;
$checkDataResult = $this->checkdata2($firset_data, $newdata, $key996,$type,$sameNodeStr,$key);
$newdata[$key]->stmts = $checkDataResult;
$firset_data = [];
$checkNextDataResult = $this->checkdata2($firset_data, $newdata, $value->name->oldnextgoto,$type,$sameNodeStr,$key);
$attributes = array();
$elseStd = new \PhpParser\Node\Stmt\Else_($checkNextDataResult,$attributes);
$newdata[$key]->else = $elseStd;
$newdata[$key]->name->nextgoto = $sameNodeStr;
}else{
if(!empty($value->name->whileLabel)){
$stopStr = $value->name->whileLabel;
}else{
$stopStr = "";
}
$checkDataResult = $this->checkdata2($firset_data, $newdata, $key996,$type,$stopStr,$key);
$newdata[$key]->stmts = !empty($checkDataResult) ? $checkDataResult : $code2;
}
}else{
$checkDataResult = $this->checkdata2($firset_data, $newdata, $key996,$type,"",$key);
$newdata[$key]->stmts = !empty($checkDataResult) ? $checkDataResult : $code2;
}
break;
}
}
}
}
}
$this->allFindLabelStr ="";
foreach ($newdata as $key => $value){
if (get_class($value) == 'PhpParser\Node\Stmt\If_'){
$this->allFindLabelStr = $key.",";
if(!empty($value->name->isWhile)){
//条件跳转跟下一句的nextgoto跳转相同
//条件反向的处理,并把if改为while
$oldName = $value->name;
$attributes = $value->cond->getAttributes();
$whileObj = new \PhpParser\Node\Stmt\While_( $value->cond,$value->stmts,$attributes);
$value = $whileObj;
$value->name = $oldName;
$newdata[$key] = $value;
if( !empty($newdata[$key] ->stmts)){
$this->restoreWhile($newdata[$key] ->stmts);
$this->allFindLabelStr ="";
}
}elseif(!empty($newdata[$key] ->stmts)){
$this->restoreWhile($newdata[$key] ->stmts);
$this->allFindLabelStr ="";
if(!empty($newdata[$key] ->else->stmts)){
$this->restoreWhile($newdata[$key] ->else->stmts);
$this->allFindLabelStr ="";
}
}
}
}
// $this->restoreWhile($newdata);
return $newdata;
}
// /* 判断是否存在elseIf的情况 */
// public function judgeElseIf(&$newdata, $sameNodeStr,$key,$startLabel,$oldnextgoto,$type){
// $firstStr = $this->findIFLabel($sameNodeStr, $newdata);
// $elseIfArray = array();
// while(!empty($firstStr) && !empty($newdata[$firstStr]) && get_class($newdata[$firstStr]) == "PhpParser\Node\Stmt\If_"){
// $firset_data = [];
// //存在elseif的情况
// $checkDataResult = $this->checkdata2($firset_data, $newdata, $startLabel,$type,$sameNodeStr);
// $newdata[$key]->stmts = $checkDataResult;
// $checkNextDataResult = $this->checkdata2($firset_data, $newdata, $oldnextgoto,$type,$sameNodeStr);
// $attributes = array();
$newdata[$key]->elseifs[] =
// $elseStd = new \PhpParser\Node\Stmt\Else_($checkNextDataResult,$attributes);
// $elseIfArray
// $newdata[$key]->else = $elseStd;
// $newdata[$key]->name->nextgoto = $sameNodeStr;
// }
// if(!empty($firstStr) && !empty($newdata[$firstStr]) && get_class($newdata[$firstStr]) == "PhpParser\Node\Stmt\If_"){
//
// }
// }
public function selectSameNode($startArray, $nextArray){
$tabelStr = "";
if(empty($startArray) || empty($nextArray)){
return $tabelStr;
}
$firstArray = array();
$secondArray = array();
foreach ($startArray as $key =>$value){
if(!empty($value->name->isNode) && $value->name->isNode == 1 ){
$firstArray[$key] = $value;
}
}
foreach ($nextArray as $key =>$value){
if(!empty($value->name->isNode) && $value->name->isNode == 1 ){
$secondArray[$key] = $value;
}
}
if(empty($firstArray) || empty($secondArray)){
return $tabelStr;
}
foreach ($secondArray as $key_second =>$value_second){
foreach ($firstArray as $key_first =>$value_first){
if($key_second == $key_first){
$tabelStr = $key_second;
return $tabelStr;
}
}
}
return $tabelStr;
}
//寻找if语句goto的第一条有效代码的label
public function findIFLabel($findStr, $res){
$tabelStr = "";
foreach ($res as $keyFind => $valueFind) {
if ($keyFind == $findStr) {
if(get_class($valueFind) == 'PhpParser\Node\Stmt\Goto_'){
$tabelStr = $this->findIFLabel($valueFind->name,$res);
}elseif (get_class($valueFind) == 'PhpParser\Node\Stmt\Label' && !empty($valueFind->name->nextgoto)){
$tabelStr = $this->findIFLabel($valueFind->name->nextgoto,$res);
} else{
$tabelStr = $keyFind;
}
break;
}
}
return $tabelStr;
}
public function findFirstNextLabel($findStr, $res,$rowCount){
$tabelStr = "";
foreach ($res as $keyFind => $valueFind) {
if ($keyFind == $findStr) {
if(get_class($valueFind) == 'PhpParser\Node\Stmt\Goto_'){
$tabelStr = $this->findFirstNextLabel($valueFind->name,$res,$rowCount);
}elseif(get_class($valueFind) == 'PhpParser\Node\Stmt\Label' && empty($valueFind->stmts)){
$tabelStr = $this->findFirstNextLabel($valueFind->name->nextgoto,$res,$rowCount);
}
else{
if($rowCount != 0){
$rowCount = $rowCount - 1;
$tabelStr = $this->findFirstNextLabel($valueFind->name->nextgoto,$res,$rowCount);
}else{
$tabelStr = $keyFind;
}
// $tabelStr = $keyFind;
}
break;
}
}
return $tabelStr;
}
public function compareNextLabel2($findStr, &$res,$compareStr,$whileLabel = ""){
if(empty($compareStr) || empty($res)){
return "";
}
STARTCOMPARE:
$tabelStr = "";
if(!empty($res[$findStr])){
$valueFind = $res[$findStr];
//判断是否进入死循环
if(!strstr($this->allFindLabel, $findStr)){
$this->allFindLabel = $this->allFindLabel.$findStr.",";
}else{
return "";
}
if(!empty($whileLabel) && $findStr == $whileLabel){
return "";
}
if(get_class($valueFind) == 'PhpParser\Node\Stmt\Goto_'){
// $tabelStr = $this->compareNextLabel2($valueFind->name->name,$res,$compareStr,$whileLabel);
$findStr = $valueFind->name->name;
goto STARTCOMPARE;
}elseif(get_class($valueFind) == 'PhpParser\Node\Stmt\Label' && empty($valueFind->stmts) && !empty($valueFind->name->nextgoto)){
// $tabelStr = $this->compareNextLabel2($valueFind->name->nextgoto,$res,$compareStr,$whileLabel);
$findStr = $valueFind->name->nextgoto;
goto STARTCOMPARE;
}
else{
if($findStr == $compareStr){
if( $this->checkExistWhile($this->allFindLabelStr,$res)){
return "";
}
$tabelStr = $findStr;
goto STOPCOMPARE;
}else{
if(!empty($this->allFindLabel)){
$allLabelAry = explode(',', $this->allFindLabel);
if(count($allLabelAry)>480){
return "";
}
}
if(!empty($valueFind->name->nextgoto)){
// $tabelStr = $this->compareNextLabel2($valueFind->name->nextgoto,$res,$compareStr,$whileLabel);
$findStr = $valueFind->name->nextgoto;
goto STARTCOMPARE;
}
}
}
}else{
return "";
}
STOPCOMPARE:
return $tabelStr;
}
// public function compareNextLabel2($findStr, &$res,$compareStr,$whileLabel = ""){
// if(empty($compareStr)){
// return "";
// }
// $tabelStr = "";
// foreach ($res as $keyFind => $valueFind) {
// if ($keyFind == $findStr) {
// //判断是否进入死循环
// if(!strstr($this->allFindLabel, $keyFind)){
// $this->allFindLabel = $this->allFindLabel.$keyFind.",";
echo "$this->allFindLabel";
echo "<br>";
// }else{
if(get_class($valueFind) == 'PhpParser\Node\Stmt\If_'){
$tempNextgoto = $valueFind->stmts[0]->name->name;
$ifNodeStr = $keyFind;
}else{
$allLabelAry = explode(',', $this->allFindLabel);
$ifNodeStr = $allLabelAry[count($allLabelAry)-2];
$tempNextgoto = $res[$ifNodeStr] ->stmts[0]->name->name;
}
$res[$ifNodeStr] ->name->isWhile = &$this->existValue;
// $this->restoreWhile($ifNodeStr,$res);
$tabelStr = $this->compareNextLabel2($tempNextgoto,$res,$compareStr);
// return "";
// }
//
// if(!empty($whileLabel) && $keyFind == $whileLabel){
// return "";
// }
// if(get_class($valueFind) == 'PhpParser\Node\Stmt\Goto_'){
// $tabelStr = $this->compareNextLabel2($valueFind->name->name,$res,$compareStr,$whileLabel);
// }elseif(get_class($valueFind) == 'PhpParser\Node\Stmt\Label' && empty($valueFind->stmts) && !empty($valueFind->name->nextgoto)){
// $tabelStr = $this->compareNextLabel2($valueFind->name->nextgoto,$res,$compareStr,$whileLabel);
// }
// else{
// if($keyFind == $compareStr){
// if( $this->checkExistWhile($this->allFindLabelStr,$res)){
// return "";
// }
// $tabelStr = $keyFind;
// }else{
// if(!empty($this->allFindLabel)){
// $allLabelAry = explode(',', $this->allFindLabel);
// if(count($allLabelAry)>480){
// return "";
// }
// }
// if(!empty($valueFind->name->nextgoto)){
// $tabelStr = $this->compareNextLabel2($valueFind->name->nextgoto,$res,$compareStr,$whileLabel);
// }
// }
// }
// break;
// }
// }
// return $tabelStr;
// }
//比较后面代码是否有相同的label
public function compareNextLabel($findStr, &$res,$compareStr,$type=0,$ifKey=""){
if(empty($compareStr)){
return "";
}
if(empty($this->allFindLabelStr)){
if(get_class($res[$ifKey]) == 'PhpParser\Node\Stmt\If_' && !empty($res[$ifKey]->stmts)){
$this->allFindLabel = "";
if(!empty($res[$ifKey]->stmts[0]->name->name)){
$tabelStr = $this->compareNextLabel2($res[$ifKey]->stmts[0]->name->name,$res,$ifKey);
if(!empty($tabelStr)){
if(!empty($res[$ifKey]->name->lastLabelOne) && strstr($this->allFindLabel, $res[$ifKey]->name->lastLabelOne)){
echo "tabelStr=".$tabelStr;
}else{
// $res[$ifKey]->name->isWhile = &$this->existValue;
$res[$ifKey]->name->isInsideLoop = $tabelStr;
}
}
}
}
}
$tabelStr = "";
foreach ($res as $keyFind => $valueFind) {
if ($keyFind == $findStr) {
if($keyFind == $ifKey){
if( $this->checkExistWhile($this->allFindLabelStr,$res)){
return "";
}
$tempNextgoto = $valueFind->stmts[0]->name->name;
$res[$keyFind] ->name->isWhile = &$this->existValue;
// $tabelStr = $this->compareNextLabel($tempNextgoto,$res,$compareStr,$type,$ifKey);
return $keyFind;
}
if(!empty($this->allFindLabelStr)){
$allLabelAry = explode(',', $this->allFindLabelStr);
if(count($allLabelAry)>480){
return "";
}
}
//判断是否进入死循环
if(!strstr($this->allFindLabelStr, $keyFind)){
$this->allFindLabelStr = $this->allFindLabelStr.$keyFind.",";
}else{
if(get_class($valueFind) == 'PhpParser\Node\Stmt\If_'){
$tempNextgoto = $valueFind->stmts[0]->name->name;
$ifNodeStr = $keyFind;
if($valueFind != $ifKey){
$tabelStr = $this->compareNextLabel($tempNextgoto,$res,$compareStr,$type,$ifKey);
return $tabelStr;
}
}else{
$allLabelAry = explode(',', $this->allFindLabelStr);
$ifNodeStr = $allLabelAry[count($allLabelAry)-2];
if(get_class( $res[$ifNodeStr]) != 'PhpParser\Node\Stmt\If_'){
return "";
}
}
$res[$ifNodeStr] ->name->isWhile = &$this->existValue;
// $this->restoreWhile($ifNodeStr,$res);
// $tabelStr = $this->compareNextLabel($tempNextgoto,$res,$compareStr,$type,$ifKey);
return $keyFind;
}
if(get_class($valueFind) == 'PhpParser\Node\Stmt\If_' && !empty($valueFind->stmts)){
$this->allFindLabel = "";
if(!empty($valueFind->stmts[0]->name->name)){
if(!empty($res[$ifKey]->name->whileLabel)){
$whileLabel = $res[$ifKey]->name->whileLabel;
}else{
$whileLabel = "";
}
$tabelStr = $this->compareNextLabel2($valueFind->stmts[0]->name->name,$res,$ifKey,$whileLabel);
if(!empty($tabelStr)){
if(!empty($res[$ifKey]->name->lastLabelOne) && strstr($this->allFindLabel, $res[$ifKey]->name->lastLabelOne)){
$tabelStr = "";
}else{
$res[$ifKey]->name->isWhile = &$this->existValue;
$res[$keyFind]->name->isChange = $tabelStr;
}
}
}
}
if(get_class($valueFind) == 'PhpParser\Node\Stmt\Goto_'){
if(empty($res[$valueFind->name->name]) && $type == $this->foreachType){
$res[$ifKey]->name->isBreak = $valueFind->name->name;
}
$tabelStr = $this->compareNextLabel($valueFind->name->name,$res,$compareStr,$type,$ifKey);
}elseif(get_class($valueFind) == 'PhpParser\Node\Stmt\Label' && empty($valueFind->stmts) && !empty($valueFind->name->nextgoto)){
$tabelStr = $this->compareNextLabel($valueFind->name->nextgoto,$res,$compareStr,$type,$ifKey);
}
else{
if($keyFind == $compareStr){
$tabelStr = $keyFind;
}else{
if(!empty($valueFind->name->nextgoto)){
$tabelStr = $this->compareNextLabel($valueFind->name->nextgoto,$res,$compareStr,$type,$ifKey);
}
}
}
break;
}
}
return $tabelStr;
}
//给while块里面的if语句设置标签
public function setWhileData($findStr,&$res,$compareStr,$stopLabel=""){
if(empty($compareStr)){
return "";
}
$tabelStr = "";
foreach ($res as $keyFind => $valueFind) {
if ($keyFind == $findStr) {
//判断是否进入死循环
if(!strstr($this->allFindLabel, $keyFind)){
$this->allFindLabel = $this->allFindLabel.$keyFind.",";
}else{
return "";
}
if(get_class($res[$keyFind]) == 'PhpParser\Node\Stmt\If_'){
$res[$keyFind]->name->whileLabel = $compareStr;
if(!empty($valueFind->stmts[0]->name->name)){
$tabelStr = $this->setWhileData($valueFind->stmts[0]->name->name,$res,$compareStr,$stopLabel);
}
}
if(get_class($valueFind) == 'PhpParser\Node\Stmt\Goto_'){
$tabelStr = $this->setWhileData($valueFind->name->name,$res,$compareStr,$stopLabel);
}elseif(get_class($valueFind) == 'PhpParser\Node\Stmt\Label' && empty($valueFind->stmts) && !empty($valueFind->name->nextgoto)){
$tabelStr =
$this->setWhileData($valueFind->name->nextgoto,$res,$compareStr,$stopLabel);
}
else{
if($keyFind == $compareStr){
$tabelStr = $keyFind;
}else{
if(!empty($this->allFindLabel)){
$allLabelAry = explode(',', $this->allFindLabel);
if(count($allLabelAry)>480){
return "";
}
}
if(!empty($valueFind->name->nextgoto)){
$tabelStr = $this->setWhileData($valueFind->name->nextgoto,$res,$compareStr,$stopLabel);
}
}
}
break;
}
}
return $tabelStr;
}
//检查是否存在while语句
public function checkExistWhile($allFindStr,$res){
$allLabelAry = explode(',', $allFindStr);
foreach ($allLabelAry as $key => $value){
if(!empty($value) && get_class($res[$value]) == "PhpParser\Node\Stmt\If_"){
if(!empty($res[$value]->name->isWhile) && $res[$value]->name->isWhile == $this->existValue){
return true;
}
}
}
return false;
}
//检查while语句
public function checkWhile($whileKey,&$res,$whileNext){
foreach ($res as $key => $value ){
if(get_class($value) == 'PhpParser\Node\Stmt\If_' && empty($value->name->oldIfLabel)){
if(!empty($value->stmts) && count($value->stmts)>0){
$this->checkWhile($whileKey,$value->stmts,$whileNext);
}
}elseif(get_class($value) == 'PhpParser\Node\Stmt\While_'){
if(!empty($value->stmts) && count($value->stmts)>0){
$this->checkWhile($whileKey,$value->stmts,$whileNext);
}
}else {
if(!empty($value->name->oldIfLabel) && $value->name->oldIfLabel == $whileNext){
$attributes = array();
$breakStd = new \PhpParser\Node\Stmt\Break_(null,$attributes);
$res[$key] = $breakStd;
}
}
}
}
//恢复while语句
public function restoreWhile(&$res){
foreach ($res as $key => $value){
if (get_class($value) == 'PhpParser\Node\Stmt\If_'){
if(empty($res[$key]->name->oldIfLabel)){
continue;
}
$ifLabel = $res[$key]->name->oldIfLabel;
if(!strstr($this->allFindLabelStr, $ifLabel)){
$this->allFindLabelStr = $this->allFindLabelStr.$ifLabel.",";
// $failLabel = "t6X3c,IxelL,OTFhY,Ab4dP,c4iI1,wWVDk,aBDVw,cGQ2R,Hhab6,hxI8v";
// if(strstr($failLabel,$ifLabel)){
// echo $ifLabel;
// }
}else{
// if($ifLabel == "aBDVw"){
// echo $ifLabel;
// }
// echo $ifLabel."重复=".$this->allFindLabelStr.";<br>";
}
if(!empty($value->name->isWhile)){
//条件跳转跟下一句的nextgoto跳转相同
//条件反向的处理,并把if改为while
$oldName = $value->name;
$attributes = $value->cond->getAttributes();
$whileObj = new \PhpParser\Node\Stmt\While_( $value->cond,$value->stmts,$attributes);
$value = $whileObj;
$value->name = $oldName;
$res[$key] = $value;
if( !empty($res[$key] ->stmts)){
$this->restoreWhile($res[$key] ->stmts);
}
}elseif(!empty($res[$key] ->stmts)){
$this->restoreWhile($res[$key] ->stmts);
if(!empty($res[$key] ->else->stmts)){
$this->restoreWhile($res[$key] ->else->stmts);
}
}
}
}
}
public function getPrettyCode($prettyPrinter, $res){
$res_code = "";
if(!empty($res)){
$arrayLength = count($res);
$tempArray = array();
$find = array("?>\n","?>","<?php","<?php");
for($i = 0;$i < $arrayLength;$i++){
if (get_class($res[$i]) == 'PhpParser\Node\Stmt\Switch_'&& !empty($res[$i]->cases) && count($res[$i]->cases)>0) {
foreach ($res[$i]->cases as $key2 => $value2) {
if (!empty($value2->stmts) && count($value2->stmts)>0) {
echo date('h:i:s', time())." YY/";
$if_code = $this->getPrettyCode($prettyPrinter, $value2->stmts);
if(!empty($this->parserObj)){
$if_code = str_ireplace( $find,"",$if_code,$count);
$this->replaceTip = $this->parserObj->parse($if_code);
}
$value2->stmts = $this->replaceTip;
$tempArray[0] = $value2;
$old_code = $prettyPrinter->prettyPrint($tempArray);
$one_code = str_ireplace( $find,"",$old_code,$count);
echo date('h:i:s', time())." YY/";
$memoryValue = number_format(memory_get_usage());
echo $memoryValue . " /";
echo date('h:i:s', time())." /";
}
}
$tempArray[0] = $res[$i];
$old_code = $prettyPrinter->prettyPrint($tempArray);
$one_code = str_ireplace( $find,"",$old_code,$count);
}else if(get_class($res[$i]) == 'PhpParser\Node\Stmt\If_' && !empty($res[$i]->stmts) && count($res[$i]->stmts)>0){
$if_code = $this->getPrettyCode($prettyPrinter, $res[$i]->stmts);
if(!empty($this->parserObj)){
$if_code = str_ireplace( $find,"",$if_code,$count);
$this->replaceTip = $this->parserObj->parse($if_code);
}
$res[$i]->stmts = $this->replaceTip;
$tempArray[0] = $res[$i];
$old_code = $prettyPrinter->prettyPrint($tempArray);
// $one_code = str_ireplace( $this->replaceTipStr,$if_code,$old_code,$count);
$one_code = str_ireplace( $find,"",$old_code,$count);
$this->printCount = $this->printCount +1;
}else if(get_class($res[$i]) == 'PhpParser\Node\Stmt\Foreach_' && !empty($res[$i]->stmts) && count($res[$i]->stmts)>0){
$if_code = $this->getPrettyCode($prettyPrinter, $res[$i]->stmts);
if(!empty($this->parserObj)){
$if_code = str_ireplace( $find,"",$if_code,$count);
$this->replaceTip = $this->parserObj->parse($if_code);
}
$res[$i]->stmts = $this->replaceTip;
$tempArray[0] = $res[$i];
$old_code = $prettyPrinter->prettyPrint($tempArray);
// $one_code = str_ireplace( $this->replaceTipStr,$if_code,$old_code,$count);
$one_code = str_ireplace( $find,"",$old_code,$count);
$this->printCount2 = $this->printCount2 +1;
}
else{
$tempArray[0] = $res[$i];
$one_code = $prettyPrinter->prettyPrint($tempArray);
$this->printCount1 = $this->printCount1 +1;
}
$res_code = $res_code.$one_code;
}
}
return $res_code;
}
public function prettyWriteCode($fileName,$prettyPrinter, $res){
if(!empty($res)){
$arrayLength = count($res);
$myfile = fopen($fileName, "a+") or die("Unable to open file!");
$tempArray = array();
for($i = 0;$i < $arrayLength;$i++){
$tempArray[0] = $res[$i];
$res_code = $prettyPrinter->prettyPrint($tempArray);
if($i == 0){
$res_code = "<?php" . "\n" . $res_code;
}
echo "i=".$i."\n";
fwrite($myfile, $res_code);
}
fclose($myfile);
}
}
public function writeFile($fileName, $content)
{
$myfile = fopen($fileName, "w") or die("Unable to open file!");
fwrite($myfile, $content);
fclose($myfile);
}
}
本文摘自:https://www.sharecode.site/6310.html?
|