mirror of
https://github.com/scr34m/php-malware-scanner.git
synced 2026-06-16 12:30:35 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5883c68f54 | ||
|
|
22b51a1ee3 | ||
|
|
2b1a0c1266 | ||
|
|
c495cc822c | ||
|
|
e9a45d4bdc |
16
README.md
16
README.md
@@ -113,6 +113,22 @@ It is guaranteed that IF 'base64_decode' was present in the plain text code, the
|
||||
The presence of 'YmFzZTY0X2RlY29kZ' in a block of code may be because 'ase64_decod' was in the original code.
|
||||
ote the missing edge characters which is due to bit misalignment and character bleed.
|
||||
|
||||
Using as library
|
||||
----------------
|
||||
|
||||
The scan.php perform a check, that it's called by commandline or not, so to use as library use different directory than scan.php it self.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
require_once '../scan.php';
|
||||
|
||||
$scan = new MalwareScanner();
|
||||
$scan->setFlagHideWhitelist(true);
|
||||
$scan->setFlagHideOk(true);
|
||||
$scan->run('../samples/test');
|
||||
```
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#This file contains raw strings that will be matched case-insensitive.
|
||||
#Comments and whitespace are possible, but comments must have '#' at the first character of the line.
|
||||
# This file contains raw strings that will be matched case-insensitive.
|
||||
# Comments and whitespace are possible, but comments must have '#' at the first character of the line.
|
||||
|
||||
#List of security service providers that phishers often block.
|
||||
# List of security service providers that phishers often block.
|
||||
abovenet
|
||||
avira
|
||||
bitdefender
|
||||
@@ -17,3 +17,6 @@ phishtank
|
||||
sophos
|
||||
surfright
|
||||
symantec
|
||||
|
||||
# SEO poison, pharmacy redirect
|
||||
dealonline.su
|
||||
@@ -371,3 +371,7 @@ ZeroByte
|
||||
|
||||
# JS escaped: String.fromCharCode(
|
||||
83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40
|
||||
|
||||
# SEO poisoning control site call
|
||||
"http://$xxx
|
||||
?useragent=$botbotbot
|
||||
|
||||
@@ -4,10 +4,13 @@ eval\/\*[a-z0-9]+\*\/
|
||||
#
|
||||
eval\([a-z0-9]{4,}\(\$[a-z0-9]{4,}, \$[0-9a-z]{4,}\)\);
|
||||
|
||||
#
|
||||
# chr(101).chr(118).chr(97)
|
||||
(chr\(\d+\^\d+\)\.){4,}
|
||||
|
||||
#
|
||||
# $_uU(101).$_uU(118).$_uU(97)
|
||||
(\$\_[a-z0-9]{2,}\(\d+\)\.){4,}
|
||||
|
||||
# $uUx[101].$uUx[118].$uUx[97]
|
||||
(\$[a-z0-9]{3,}\[\d+\]\.){4,}
|
||||
|
||||
#
|
||||
@@ -37,6 +40,9 @@ Googlebot['"]{0,1}\s*\)\){echo\s+file_get_contents
|
||||
#execute base64 code
|
||||
eVaL\(\s*trim\(\s*baSe64_deCoDe\(
|
||||
|
||||
# execute escaped code
|
||||
exec\("(\\[0-9a-fx]{2,3}){3,}
|
||||
|
||||
#
|
||||
if\s*\(\s*mail\s*\(\s*\$mails\[\$i\]\s*,\s*\$tema\s*,\s*base64_encode\s*\(\s*\$text
|
||||
|
||||
@@ -107,4 +113,7 @@ function\s+_[0-9]{8,}\(
|
||||
@include ".*?(\\x[0-9a-f]{2,}.*?){2,}.*?";
|
||||
|
||||
# create_function is dangerous as like eval() see http://php.net/manual/en/function.create-function.php
|
||||
create_function\s*\(\s*['"]{2}
|
||||
create_function\s*\(\s*['"]{2}
|
||||
|
||||
# control concated from cookie at the call
|
||||
(\$[a-z]{2,}=urldecode\(\$_COOKIE\['[a-z]{2,}'\]\);){3,}
|
||||
50
scan.php
50
scan.php
@@ -69,16 +69,31 @@ class MalwareScanner
|
||||
if ($cli === true) {
|
||||
//Read Run Options
|
||||
$this->parseArgs();
|
||||
$this->dir = realpath($this->dir);
|
||||
|
||||
$dirs = array();
|
||||
if (is_array($this->dir)) {
|
||||
// allow multiple directory aka. array
|
||||
foreach ($this->dir as $path) {
|
||||
$dirs[] = realpath($path);
|
||||
}
|
||||
} elseif ($bpos = strpos($this->dir, '{')) {
|
||||
// Check path has a "brace", expand it to subdirectories
|
||||
foreach (glob($this->dir, GLOB_BRACE) as $path) {
|
||||
$dirs[] = realpath($path);
|
||||
}
|
||||
} else {
|
||||
// only one directory specified
|
||||
$dirs = array (realpath($this->dir));
|
||||
}
|
||||
|
||||
//Make sure a directory was specified.
|
||||
if ($this->dir === '') {
|
||||
if (empty($dirs)) {
|
||||
$this->error('No directory specified or directory doesn\'t exist');
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//Initiate Scan
|
||||
if (!$this->run($this->dir)) {
|
||||
if (!$this->run($dirs)) {
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
@@ -188,7 +203,7 @@ class MalwareScanner
|
||||
}
|
||||
}
|
||||
|
||||
private function addWordpressChecksums($wp_version)
|
||||
public function addWordpressChecksums($wp_version)
|
||||
{
|
||||
$apiurl = 'https://api.wordpress.org/core/checksums/1.0/?version=' . $wp_version;
|
||||
$json = json_decode(file_get_contents($apiurl));
|
||||
@@ -592,18 +607,11 @@ class MalwareScanner
|
||||
* - Fetch and load combined whitelist
|
||||
* - Calls the process and report functions.
|
||||
*
|
||||
* @param $dir
|
||||
* @param string|array $dir A directory path or a list of paths in array
|
||||
* @return bool
|
||||
*/
|
||||
public function run($dir)
|
||||
{
|
||||
// Make sure the input is a valid directory path.
|
||||
$dir = rtrim($dir, '/');
|
||||
if (!is_dir($dir)) {
|
||||
$this->error('Specified path is not a directory: ' . $dir);
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->initializePatterns();
|
||||
|
||||
$this->loadWhitelist();
|
||||
@@ -613,9 +621,23 @@ class MalwareScanner
|
||||
}
|
||||
|
||||
$start = time();
|
||||
$this->process($dir . '/');
|
||||
|
||||
if (!is_array($dir)) {
|
||||
$dir = array ($dir);
|
||||
}
|
||||
|
||||
foreach ($dir as $path) {
|
||||
// Make sure the input is a valid directory path.
|
||||
$path = rtrim($path, '/');
|
||||
if (!is_dir($path)) {
|
||||
$this->error('Specified path is not a directory: ' . $path);
|
||||
return false;
|
||||
}
|
||||
$this->process($path . '/');
|
||||
}
|
||||
|
||||
if (!$this->flagDisableStats) {
|
||||
$this->report($start, $dir . '/');
|
||||
$this->report($start, implode(', ', $dir));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user