公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站php文件都存在恶意代码,就写了个简单的脚本清除。
恶意代码示例
恶意代码清理程序
<?php
/**
* 文件名:delunwantedcode.php
* 功能:删除ftp里恶意代码
* 使用说明:
* 请将文件上传到需要清除恶意代码的目录,然后通过cli或浏览器访问即可,原有被感染的文件会自动备份
*/
$path = dirname(__file__); #定义需要处理的目录
$bak_path = $path.directory_separator.basename(__file__,'.php'); #定义源文件备份目录,程序过滤恶意代码前,先按原有的路径备份文档到此目录
$filetype = array('php'); #定义需要处理的文件类型(后缀名),小写
$search = array('@<\?php\s*if\(\!isset\(\$globals\["\\\x61\\\156\\\x75\\\156\\\x61"\]\)\).*\$bssaiikhvn=\$jtgibaqypx-1;\s*\?>@si'); #定义需要过滤的恶意代码规则
$search_count = array(
'all_file'=>array(), #所有文件
'search_file0'=>array(), #没有恶意代码文件
'search_file1'=>array() #含有恶意代码文件
);
$filelist = listdir($path,$filetype,false); #读取目录里符合条件文件列表
if(!empty($filelist)){
foreach ($filelist as $file){
$file = (isset($file['name'])?$file['name']:$file);
$search_count['all_file'][] = $file;
$filecontent = file_get_contents($file);
$compile_filecontent = preg_replace($search, '', $filecontent);
if(strlen($filecontent) != strlen($compile_filecontent) && str_replace($bak_path, '', $file)==$file){
#过滤后文件长度不一致,则表示含有恶意代码(备份文件所在目录不过滤)
$search_count['search_file1'][] = $file;
############备份原有文件 开始###############
$bakfile = str_replace($path, $bak_path, $file);
@make_dir(dirname($bakfile));
@file_put_contents($bakfile, $filecontent);
############备份原有文件 结束###############
#重新写入过滤后的内容到原有的php文件
@file_put_contents($file, $compile_filecontent);
}else{
$search_count['search_file0'][] = $file;
}
}
}
#print_r($search_count);die;
echo sprintf('从%s里共搜索到%s个符合条件的文件,其中%s个存在恶意代码,已处理结束',$path,count($search_count['all_file']), count($search_count['search_file1']));die;
########################
## 辅助函数
########################
/**
* 检查目标文件夹是否存在,如果不存在则自动创建该目录
*
* @access public
* @param string folder 目录路径。不能使用相对于网站根目录的url
*
* @return bool
*/
function make_dir($folder){
$reval = false;
if (!file_exists($folder)){
#如果目录不存在则尝试创建该目录
@umask(0);
#将目录路径拆分成数组
preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);
#如果第一个字符为/则当作物理路径处理
$base = ($atmp[0][0] == '/') ? '/' : '';
#遍历包含路径信息的数组
foreach ($atmp[1] as $val){
if ('' != $val){
$base .= $val;
if ('..' == $val || '.' == $val){
#如果目录为.或者..则直接补/继续下一个循环
$base .= '/';
continue;
}
}else{
continue;
}
$base .= '/';
if (!file_exists($base)){
#尝试创建目录,如果创建失败则继续循环
if (@mkdir(rtrim($base, '/'), 0777)){
@chmod($base, 0777);
$reval = true;
}
}
}
}else{
#路径已经存在。返回该路径是不是一个目录
$reval = is_dir($folder);
}
clearstatcache();
return $reval;
}
########获取目录下所有文件,包括子目录 开始################
function listdir($path,$filetype=array(),$fileinfo=true){
$path = str_replace(array('/','\\'), directory_separator, $path);
if(!file_exists($path)||!is_dir($path)){
return '';
}
if(substr($path, -1,1)==directory_separator){
$path = substr($path, 0,-1);
}
$dirlist=array();
$dir=opendir($path);
while($file=readdir($dir)){
#若有定义$filetype,并且文件类型不在$filetype范围内或文件是一个目录,则跳过
if($file!=='.'&&$file!=='..'){
$file = $path.directory_separator.$file;
if(is_dir($file)){
if(empty($filetype)){
$dirlist[] = ($fileinfo==true?array('name'=>$file,'isdir'=>intval(is_dir($file))):$file);
}
$dirlist = array_merge($dirlist,listdir($file,$filetype));
}elseif(!empty($filetype) && (in_array(pathinfo($file, pathinfo_extension), $filetype))){
$dirlist[] = ($fileinfo==true?array('name'=>$file,'isdir'=>intval(is_dir($file)),'md5_file'=>md5_file($file),'filesize'=>filesize($file),'filemtime'=>filemtime($file)):$file);
}
};
};
closedir($dir);
return $dirlist;
}
########获取目录下所有文件,包括子目录 结束################
删除ftp里恶意代码(支持任意数量的文件处理)
<?php
/**
* 文件名:delallunwantedcode.php
* 功能:删除ftp里恶意代码(支持任意数量的文件处理)
* 使用说明:
* 请将文件上传到需要清除恶意代码的目录,然后通过cli或浏览器访问即可,原有被感染的文件会自动备份
*/
set_time_limit(0);ignore_user_abort(true);
$path = dirname(__file__); #定义需要处理的目录
$bak_path = $path.directory_separator.basename(__file__,'.php'); #定义源文件备份目录,程序过滤恶意代码前,先按原有的路径备份文档到此目录
$filetype = array('php'); #定义需要处理的文件类型(后缀名),小写
$search = array('@<\?php\s*if\(\!isset\(\$globals\["\\\x61\\\156\\\x75\\\156\\\x61"\]\)\).*\$bssaiikhvn=\$jtgibaqypx-1;\s*\?>@si'); #定义需要过滤的恶意代码规则
$file_count = array(
'all_file'=>0, #所有文件
'filter_file'=>0 #含有恶意代码文件
);
replaceunwantedcode($path); #执行过滤
#print_r($search_count);die;
echo sprintf('从%s里共搜索到%s个符合条件的文件,其中%s个存在恶意代码已清理,原始文件保存在%s',$path, ($file_count['all_file']), ($file_count['filter_file']), $bak_path);die;
function replaceunwantedcode($path){
global $bak_path,$filetype,$search,$file_count;
$path = str_replace(array('/','\\'), directory_separator, $path);
if(!file_exists($path)||!is_dir($path)){
return '';
}
if(substr($path, -1,1)==directory_separator){
$path = substr($path, 0,-1);
}
$dir=opendir($path);
while($file=readdir($dir)){
#若有定义$filetype,并且文件类型不在$filetype范围内或文件是一个目录,则跳过
if($file!=='.'&&$file!=='..'){
$file = $path.directory_separator.$file;
if(is_dir($file)){
replaceunwantedcode($file);
}elseif(!empty($filetype) && (in_array(pathinfo($file, pathinfo_extension), $filetype))){
################################
@$file_count['all_file']++;
$filecontent = file_get_contents($file); #文件原始代码
$compile_filecontent = preg_replace($search, '', $filecontent); #过滤后的内容
if(strlen($filecontent) != strlen($compile_filecontent) && str_replace($bak_path, '', $file)==$file){
#过滤后文件长度不一致,则表示含有恶意代码(备份文件所在目录不过滤)
$file_count['filter_file']++;
############备份原有文件 开始###############
$bakfile = str_replace($path, $bak_path, $file);
@make_dir(dirname($bakfile));
@file_put_contents($bakfile, $filecontent);
############备份原有文件 结束###############
#重新写入过滤后的内容到原有的php文件
@file_put_contents($file, $compile_filecontent);
}
################################
unset($filecontent,$compile_filecontent);
}
};
};
closedir($dir);
return true;
}
########################
## 辅助函数
########################
/**
* 检查目标文件夹是否存在,如果不存在则自动创建该目录
*
* @access public
* @param string folder 目录路径。不能使用相对于网站根目录的url
*
* @return bool
*/
function make_dir($folder){
$reval = false;
if (!file_exists($folder)){
#如果目录不存在则尝试创建该目录
@umask(0);
#将目录路径拆分成数组
preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);
#如果第一个字符为/则当作物理路径处理
$base = ($atmp[0][0] == '/') ? '/' : '';
#遍历包含路径信息的数组
foreach ($atmp[1] as $val){
if ('' != $val){
$base .= $val;
if ('..' == $val || '.' == $val){
#如果目录为.或者..则直接补/继续下一个循环
$base .= '/';
continue;
}
}else{
continue;
}
$base .= '/';
if (!file_exists($base)){
#尝试创建目录,如果创建失败则继续循环
if (@mkdir(rtrim($base, '/'), 0777)){
@chmod($base, 0777);
$reval = true;
}
}
}
}else{
#路径已经存在。返回该路径是不是一个目录
$reval = is_dir($folder);
}
clearstatcache();
return $reval;
}
评论列表:
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论
发布于 1天前回复该评论