不废话了,直接贴代码了。
代码如下:
<?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木马扫描器代码分享,本文附有注释,有不明白的欢迎给我留言,相信实现方法也不止以上一种,欢迎大家多多分享不同的实现方法。
本文地址:https://www.stayed.cn/item/885
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我