通过 PHP 检测包含混合内容 (PHP/HTML) 的文件中的 PHP 代码以进行混淆?
Detect PHP code in files with mixed content (PHP/HTML) by PHP for Obfuscate?
只是想知道 class 或函数是否只允许检测和替换 php 文件中的 php 代码。我只想混淆 PHP 代码并保持 HTML 不变,我认为 preg_match 不是最好的方法。到目前为止我有这个:
function replace_between($str) {
require_once 'plugins/Obfuscator.php';
$search = "/(<?php )(.*?)( ?>)/";
$check_str = preg_match($search,$str,$match);
$sData = <<<'DATA'
echo $match[1];
DATA;
$sObfusationData = new Obfuscator($sData, 'Class/Code NAME');
$new = preg_replace($search,$sObfusationData,$str);
return $new;
上面的示例由于某些原因不起作用,例如我想要得到的东西。
Detect PHP code in files with mixed content (PHP/HTML) by PHP for
Obfuscate?
您可以使用 PHP 分词器扩展来实现此 properly.An 例如下面的函数:
function findPHP($string){
if(!is_string($string)) return false;
$tokens=token_get_all($string);
$php_code='';
$result=array();
$start=false;
foreach($tokens as $key=>$token){
if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
$start=true;
continue;
}
if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
$start=false;
$result[]=$php_code;
$php_code='';
continue;
}
if($start){
if(is_array($token))
$php_code.=$token[1];
else
$php_code.=$token;
}
}
return $result;
}
print_r(findPHP(file_get_contents('get_path.php')));
此函数仅检测任何包含混合内容的文件中的 PHP 代码和 return 包含所有 PHP 代码出现的数组。
然后你所要做的就是像你一样使用你的混淆器want.All,它说你可以稍微改变上面的功能来实现你的purpose.Example:
function find_and_offuscate_PHP($string){
if(!is_string($string)) return false;
$tokens=token_get_all($string);
$php_code='';
$result=array();
$start=false;
$from=false;
foreach($tokens as $key=>$token){
if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
$from=$key;
$start=true;
continue;
}
if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
$start=false;
$result[$from]=$php_code;
$from=false;
$php_code='';
continue;
}
if($start){
if(is_array($token))
$php_code.=$token[1];
else
$php_code.=$token;
unset($tokens[$key]);
}
}
if($start&&$from&&$php_code){
$result[$from]=$php_code;
unset($start,$from,$php_code);
}
// require_once 'plugins/Obfuscator.php';
$result=array_map(function($php_code){
// return new Obfuscator($php_code, 'Class/Code NAME');
return base64_encode($php_code);
},$result);
$tokens=array_map(function($token){return is_array($token)?$token[1]:$token;},$tokens);
foreach($result as $from=> $offuscated){
$tokens[$from] .= " $offuscated";
unset($result[$from]);
}
return join(' ',$tokens);
}
请注意,在这段代码中,我只是使用 base64_encode 进行测试,但我保留了使用您自己的 offuscator 的行,您只需取消注释,该功能就可以在您的应用程序中使用了。
只是想知道 class 或函数是否只允许检测和替换 php 文件中的 php 代码。我只想混淆 PHP 代码并保持 HTML 不变,我认为 preg_match 不是最好的方法。到目前为止我有这个:
function replace_between($str) {
require_once 'plugins/Obfuscator.php';
$search = "/(<?php )(.*?)( ?>)/";
$check_str = preg_match($search,$str,$match);
$sData = <<<'DATA'
echo $match[1];
DATA;
$sObfusationData = new Obfuscator($sData, 'Class/Code NAME');
$new = preg_replace($search,$sObfusationData,$str);
return $new;
上面的示例由于某些原因不起作用,例如我想要得到的东西。
Detect PHP code in files with mixed content (PHP/HTML) by PHP for Obfuscate?
您可以使用 PHP 分词器扩展来实现此 properly.An 例如下面的函数:
function findPHP($string){
if(!is_string($string)) return false;
$tokens=token_get_all($string);
$php_code='';
$result=array();
$start=false;
foreach($tokens as $key=>$token){
if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
$start=true;
continue;
}
if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
$start=false;
$result[]=$php_code;
$php_code='';
continue;
}
if($start){
if(is_array($token))
$php_code.=$token[1];
else
$php_code.=$token;
}
}
return $result;
}
print_r(findPHP(file_get_contents('get_path.php')));
此函数仅检测任何包含混合内容的文件中的 PHP 代码和 return 包含所有 PHP 代码出现的数组。
然后你所要做的就是像你一样使用你的混淆器want.All,它说你可以稍微改变上面的功能来实现你的purpose.Example:
function find_and_offuscate_PHP($string){
if(!is_string($string)) return false;
$tokens=token_get_all($string);
$php_code='';
$result=array();
$start=false;
$from=false;
foreach($tokens as $key=>$token){
if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
$from=$key;
$start=true;
continue;
}
if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
$start=false;
$result[$from]=$php_code;
$from=false;
$php_code='';
continue;
}
if($start){
if(is_array($token))
$php_code.=$token[1];
else
$php_code.=$token;
unset($tokens[$key]);
}
}
if($start&&$from&&$php_code){
$result[$from]=$php_code;
unset($start,$from,$php_code);
}
// require_once 'plugins/Obfuscator.php';
$result=array_map(function($php_code){
// return new Obfuscator($php_code, 'Class/Code NAME');
return base64_encode($php_code);
},$result);
$tokens=array_map(function($token){return is_array($token)?$token[1]:$token;},$tokens);
foreach($result as $from=> $offuscated){
$tokens[$from] .= " $offuscated";
unset($result[$from]);
}
return join(' ',$tokens);
}
请注意,在这段代码中,我只是使用 base64_encode 进行测试,但我保留了使用您自己的 offuscator 的行,您只需取消注释,该功能就可以在您的应用程序中使用了。