PHP Web木马扫描器代码分享


Posted in PHP onSeptember 06, 2015

不废话了,直接贴代码了。

代码如下:

<?php 
header('content-type:text/html;charset=gbk'); 
set_time_limit(0);//防止超时 
/** 
* 
* php目录扫描监控增强版 
* 
* @version 1.0 
* 
下面几个变量使用前需要手动设置 
* 
**/ 
/*===================== 程序配置 =====================*/ 
$pass="test";//设置密码 
$jkdir="."; //设置监控扫描的目录,当前目录为'.',上一级目录为'..',也可以设置绝对路径,后面不要加斜杠,默认为当前目录 
$logfilename="./m.log";//设置存储log的路径,可以放置在任意位置 
$exclude=array('data','images');//排除目录 
$danger='eval|cmd|passthru|gzuncompress';//设置要查找的危险的函数 以确定是否木马文件 
$suffix='php|inc';//设置要扫描文件的后缀 
/*===================== 配置结束 =====================*/ 
$filename=$_GET['filename']; 
$check=$_GET['check']; 
$jumpoff=false; 
$url = $_SERVER['PHP_SELF']; 
$thisfile = end(explode('/',$url)); 
$jump="{$thisfile}|".implode('|',$exclude); 
$jkdir_num=$file_num=$danger_num=0; 
define('M_PATH',$jkdir); 
define('M_LOG',$logfilename); 
if ($check=='check') 
{ 
$safearr = explode("|",$jump); 
$start_time=microtime(true); 
safe_check($jkdir); 
$end_time=microtime(true); 
$total=$end_time-$start_time; 
$file_num=$file_num-$jkdir_num; 
$message= " 文件数:".$file_num; 
$message.= " 文件夹数:".$jkdir_num; 
$message.= " 可疑文件数:".$danger_num; 
$message.= " 执行时间:".$total; 
echo $message; 
}else{ 
if ($_GET['m']=="del") Delete();//处理文件删除 
//读取文件内容 
if(isset($_GET['readfile'])){ 
//输出查看密码,密码校验正确以后输出文件内容 
if(empty($_POST['passchack'])){ 
  echo"<form id=\"form1\" name=\"form1\" method=\"post\">" 
  . " <label>pass" 
  . " <input type=\"text\" name=\"passchack\" />" 
  . " </label>" 
  . " <input type=\"submit\" name=\"Submit\" value=\"提交\" />" 
  . "</form>" 
  .""; 
  exit; 
}elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){ 
  $code=file_get_contents($_GET['readfile']); 
  echo"<textarea name=\"code\" cols=\"150\" rows=\"30\" id=\"code\" style='width:100%;height:450px;background:#cccccc;'>{$code}</textarea>"; 
  exit; 
}else{ 
  exit; 
} 
}else{ 
record_md5(M_PATH); 
if(file_exists(M_LOG)){ 
    $log = unserialize(file_get_contents(M_LOG)); 
}else{ 
    $log = array(); 
} 
if($_GET['savethis']==1){ 
//保存当前文件md5到日志文件 
@unlink(M_LOG); 
file_put_contents(M_LOG,serialize($file_list)); 
echo "<a href='scandir.php'>保存成功!点击返回</a>"; 
exit; 
} 
if(empty($log)){ 
echo "当前还没有创建日志文件!点击[保存当前]创建日志文件!"; 
}else{ 
if($file_list==$log){ 
  echo "本文件夹没有做过任何改动!"; 
}else{ 
  if(count($file_list) > 0 ){ 
  foreach($file_list as $file => $md5){ 
  if(!isset($log[$file])){ 
   echo "新增文件:<a href={$file} target='_blank'>".$file."</a>"." 创建时间:".date("Y-m-d H:i:s",filectime($file))." 修改时间:".date("Y-m-d H:i:s",filemtime($file))." <a href=?readfile={$file} target='_blank'>源码</a><a href='?m=del&filename={$file}' target='_blank'>删除</u></a><br />"; 
  }else{ 
   if($log[$file] != $md5){ 
   echo "修改文件:<a href={$file} target='_blank'>".$file."</a>"." 创建时间:".date("Y-m-d H:i:s",filectime($file))." 修改时间:".date("Y-m-d H:i:s",filemtime($file))." <a href=?readfile={$file} target='_blank'>源码</a><br />"; 
   unset($log[$file]); 
   }else{ 
   unset($log[$file]); 
   } 
  } 
  } 
  } 
  if(count($log)>0){ 
  foreach($log as $file => $md5){ 
  echo "删除文件:<a href={$file} target='_blank'>".$file."</a><br />"; 
  } 
  } 
  } 
} 
} 
} 
//计算md5 
function record_md5($jkdir){ 
    global $file_list,$exclude; 
    if(is_dir($jkdir)){ 
        $file=scandir($jkdir); 
        foreach($file as $f){ 
            if($f!='.' && $f!='..' && !in_array($f, $exclude)){ 
                $path = $jkdir.'/'.$f; 
                if(is_dir($path)){ 
                    record_md5($path); 
                }else{ 
                    $file_list[$path]=md5_file($path); 
                } 
            } 
        } 
    } 
} 
function Safe_Check($jkdir)//遍历文件 
{ 
global $danger ,$suffix ,$jkdir_num ,$file_num ,$danger_num; 
) or die('文件夹不存在') ; 
while ($file=$hand->read()) 
{ 
  $filename=$jkdir.'/'.$file; 
  if (!$jumpoff) { 
  if(Jump($filename))continue; 
  } 
  if(@is_dir($filename) && $file != '.' && $file!= '..'&& $file!='./..') 
  {  $jkdir_num++; 
  Safe_Check($filename); 
  } 
  if (preg_match_all ("/\.($suffix)/i",$filename,$out)) 
  { 
  $str=''; 
  $fp = @fopen($filename,'r')or die('没有权限'); 
  while(!feof($fp)) 
  { 
  $str .= fgets($fp,1024); 
  } 
  fclose($fp); 
  if( preg_match_all ("/($danger)[ \r\n\t]{0,}([\[\(])/i",$str,$out)) 
  { 
  echo "<font color='green' style='font-size:14px'>可疑文件:{$filename}</font>"." 创建时间:".date("Y-m-d H:i:s",filectime($filename))." 修改时间:".date("Y-m-d H:i:s",filemtime($filename))." <a href='?readfile={$filename}' target='_blank'><u>查看代码</u></a> <a href='?m=del&filename=$filename' target='_blank'>删除</u></a><br>"; 
  $danger_num++; 
  } 
  } 
  $file_num++; 
} 
} 
function Edit()//查看可疑文件 
{ 
global $filename; 
$filename = str_replace("..","",$filename); 
$file = $filename; 
$content = ""; 
if(is_file($file)) 
{ 
  $fp = fopen($file,"r")or die('没有权限'); 
  $content = fread($fp,filesize($file)); 
  fclose($fp); 
  $content = htmlspecialchars($content); 
} 
echo "<textarea name='str' style='width:100%;height:450px;background:#cccccc;'>$content</textarea>\r\n"; 
exit(); 
} 
function Delete()//删除文件 
{ global $filename,$pass; 
if(empty($_POST['passchack'])){ 
  echo"<form id=\"form1\" name=\"form1\" method=\"post\">" 
  . " <label>pass" 
  . " <input type=\"text\" name=\"passchack\" />" 
  . " </label>" 
  . " <input type=\"submit\" name=\"Submit\" value=\"提交\" />" 
  . "</form>" 
  .""; 
  exit; 
}elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){ 
  (is_file($filename))?($mes=unlink($filename)?'删除成功':'删除失败 查看权限'):''; 
  echo $mes; 
  exit(); 
}else{ 
  echo '密码错误!'; 
  exit; 
} 
} 
function Jump($file)//跳过文件 
{ 
global $jump,$safearr; 
if($jump != '') 
{ 
  foreach($safearr as $v) 
  { 
  if($v=='') continue; 
  if( eregi($v,$file) ) return true ; 
  } 
} 
return false; 
} 
?> 
<a href="scandir.php">[查看文件改动]</a>|<a href="scandir.php?savethis=1">[保存当前文件指纹]</a>|<a href="scandir.php?check=check">[扫描可疑文件]</a>

以上代码就是php web木马扫描器代码分享,本文附有注释,有不明白的欢迎给我留言,相信实现方法也不止以上一种,欢迎大家多多分享不同的实现方法。

PHP 相关文章推荐
用Apache反向代理设置对外的WWW和文件服务器
Oct 09 PHP
站长助手-网站web在线管理程序 v1.0 下载
May 12 PHP
几个php应用技巧
Mar 27 PHP
PHP实现MySQL更新记录的代码
Jun 07 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
php支持中文字符串分割的函数
May 28 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
浅谈laravel-admin的sortable和orderby使用问题
Oct 03 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 PHP
使用php-timeit估计php函数的执行时间
Sep 06 #PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 #PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 #PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 #PHP
PHP中error_reporting()用法详解
Aug 31 #PHP
大家在抢红包,程序员在研究红包算法
Aug 31 #PHP
微信公众平台开发之天气预报功能
Aug 31 #PHP
You might like
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
js中取得变量绝对值的方法
2015/01/03 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
初学Python函数的笔记整理
2015/04/07 Python
Python入门教程之if语句的用法
2015/05/14 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
对python中Json与object转化的方法详解
2018/12/31 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
python序列类型种类详解
2020/02/26 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
招商经理岗位职责
2013/11/16 职场文书
环境日宣传活动总结
2014/07/09 职场文书
医学专业大学生求职信
2014/07/12 职场文书
股份合作协议书
2014/09/10 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
首都博物馆观后感
2015/06/05 职场文书
党纪处分决定书
2015/06/24 职场文书