webshell-analyzer 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- webshell_analyzer/__init__.py +0 -0
- webshell_analyzer/cli/__init__.py +0 -0
- webshell_analyzer/cli/cli.py +151 -0
- webshell_analyzer/extractor/ast_extraction/composer.json +5 -0
- webshell_analyzer/extractor/ast_extraction/composer.lock +77 -0
- webshell_analyzer/extractor/ast_extraction/src/NodeVisitor.php +85 -0
- webshell_analyzer/extractor/ast_extraction/src/astBuilder.php +50 -0
- webshell_analyzer/extractor/ast_extraction/src/astExtractor.php +50 -0
- webshell_analyzer/extractor/ast_extraction/src/featuresDeclare.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/autoload.php +25 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/ClassLoader.php +579 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/InstalledVersions.php +378 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_classmap.php +10 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_namespaces.php +9 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_psr4.php +10 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_real.php +38 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_static.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/installed.json +67 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/installed.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/platform_check.php +26 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php +150 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php +151 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php +50 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php +86 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php +116 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php +73 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php +67 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php +94 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php +147 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +171 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php +223 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php +65 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php +145 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php +83 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder.php +12 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +375 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php +338 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php +6 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Comment.php +209 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php +6 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php +237 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Error.php +173 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php +43 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php +12 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php +31 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php +178 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php +71 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php +237 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php +282 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php +108 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php +230 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php +93 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php +26 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php +60 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php +19 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php +60 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PipeOperatorEmulator.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php +19 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php +31 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php +31 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/VoidCastEmulator.php +98 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer.php +116 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php +85 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NameContext.php +284 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php +44 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php +43 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php +13 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php +84 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pipe.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php +60 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php +16 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Void_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php +25 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php +86 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php +38 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php +38 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php +35 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php +35 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php +35 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php +8 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php +85 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php +278 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php +123 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php +105 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php +78 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php +82 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php +161 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php +6 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php +39 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php +77 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php +109 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php +154 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php +94 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php +44 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php +47 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php +50 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php +81 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php +41 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php +46 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php +16 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php +121 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php +12 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php +47 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php +8 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php +55 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php +16 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node.php +150 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php +181 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php +299 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php +90 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php +287 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php +26 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php +19 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php +82 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php +47 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php +269 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php +73 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php +51 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php +124 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php +24 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +2919 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php +2917 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Parser.php +24 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php +1335 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php +42 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php +175 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php +1232 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php +51 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php +1706 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Token.php +18 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php +71 -0
- webshell_analyzer/extractor/extractor.py +73 -0
- webshell_analyzer/extractor/lexical_extraction/lexicalExtractor.py +31 -0
- webshell_analyzer/extractor/statistical_extraction/statisticalExtractor.py +60 -0
- webshell_analyzer/model/features_selected.json +1 -0
- webshell_analyzer/model/model_loader.py +19 -0
- webshell_analyzer/model/rf_webshell_model.joblib +0 -0
- webshell_analyzer/modules/__init__.py +0 -0
- webshell_analyzer/modules/detector.py +174 -0
- webshell_analyzer/modules/scanner.py +68 -0
- webshell_analyzer-1.0.0.dist-info/METADATA +105 -0
- webshell_analyzer-1.0.0.dist-info/RECORD +304 -0
- webshell_analyzer-1.0.0.dist-info/WHEEL +5 -0
- webshell_analyzer-1.0.0.dist-info/entry_points.txt +2 -0
- webshell_analyzer-1.0.0.dist-info/licenses/LICENSE +21 -0
- webshell_analyzer-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A PHP token. On PHP 8.0 this extends from PhpToken.
|
|
7
|
+
*/
|
|
8
|
+
class Token extends Internal\TokenPolyfill {
|
|
9
|
+
/** Get (exclusive) zero-based end position of the token. */
|
|
10
|
+
public function getEndPos(): int {
|
|
11
|
+
return $this->pos + \strlen($this->text);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Get 1-based end line number of the token. */
|
|
15
|
+
public function getEndLine(): int {
|
|
16
|
+
return $this->line + \substr_count($this->text, "\n");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser;
|
|
4
|
+
|
|
5
|
+
if (!\function_exists('PhpParser\defineCompatibilityTokens')) {
|
|
6
|
+
function defineCompatibilityTokens(): void {
|
|
7
|
+
$compatTokens = [
|
|
8
|
+
// PHP 8.0
|
|
9
|
+
'T_NAME_QUALIFIED',
|
|
10
|
+
'T_NAME_FULLY_QUALIFIED',
|
|
11
|
+
'T_NAME_RELATIVE',
|
|
12
|
+
'T_MATCH',
|
|
13
|
+
'T_NULLSAFE_OBJECT_OPERATOR',
|
|
14
|
+
'T_ATTRIBUTE',
|
|
15
|
+
// PHP 8.1
|
|
16
|
+
'T_ENUM',
|
|
17
|
+
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
|
|
18
|
+
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
|
|
19
|
+
'T_READONLY',
|
|
20
|
+
// PHP 8.4
|
|
21
|
+
'T_PROPERTY_C',
|
|
22
|
+
'T_PUBLIC_SET',
|
|
23
|
+
'T_PROTECTED_SET',
|
|
24
|
+
'T_PRIVATE_SET',
|
|
25
|
+
// PHP 8.5
|
|
26
|
+
'T_PIPE',
|
|
27
|
+
'T_VOID_CAST',
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
// PHP-Parser might be used together with another library that also emulates some or all
|
|
31
|
+
// of these tokens. Perform a sanity-check that all already defined tokens have been
|
|
32
|
+
// assigned a unique ID.
|
|
33
|
+
$usedTokenIds = [];
|
|
34
|
+
foreach ($compatTokens as $token) {
|
|
35
|
+
if (\defined($token)) {
|
|
36
|
+
$tokenId = \constant($token);
|
|
37
|
+
if (!\is_int($tokenId)) {
|
|
38
|
+
throw new \Error(sprintf(
|
|
39
|
+
'Token %s has ID of type %s, should be int. ' .
|
|
40
|
+
'You may be using a library with broken token emulation',
|
|
41
|
+
$token, \gettype($tokenId)
|
|
42
|
+
));
|
|
43
|
+
}
|
|
44
|
+
$clashingToken = $usedTokenIds[$tokenId] ?? null;
|
|
45
|
+
if ($clashingToken !== null) {
|
|
46
|
+
throw new \Error(sprintf(
|
|
47
|
+
'Token %s has same ID as token %s, ' .
|
|
48
|
+
'you may be using a library with broken token emulation',
|
|
49
|
+
$token, $clashingToken
|
|
50
|
+
));
|
|
51
|
+
}
|
|
52
|
+
$usedTokenIds[$tokenId] = $token;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Now define any tokens that have not yet been emulated. Try to assign IDs from -1
|
|
57
|
+
// downwards, but skip any IDs that may already be in use.
|
|
58
|
+
$newTokenId = -1;
|
|
59
|
+
foreach ($compatTokens as $token) {
|
|
60
|
+
if (!\defined($token)) {
|
|
61
|
+
while (isset($usedTokenIds[$newTokenId])) {
|
|
62
|
+
$newTokenId--;
|
|
63
|
+
}
|
|
64
|
+
\define($token, $newTokenId);
|
|
65
|
+
$newTokenId--;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
defineCompatibilityTokens();
|
|
71
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess
|
|
3
|
+
import json
|
|
4
|
+
from webshell_analyzer.extractor.statistical_extraction.statisticalExtractor import extract_statistical_features
|
|
5
|
+
from webshell_analyzer.extractor.lexical_extraction.lexicalExtractor import extract_lexical_features
|
|
6
|
+
from webshell_analyzer.model.model_loader import load_feature_columns
|
|
7
|
+
|
|
8
|
+
feature_columns = load_feature_columns()
|
|
9
|
+
|
|
10
|
+
base_dir = os.path.dirname(os.path.dirname(__file__))
|
|
11
|
+
|
|
12
|
+
def extract_ast(filepath):
|
|
13
|
+
#call the AST extractor script
|
|
14
|
+
php_ast_path = os.path.abspath(os.path.join(base_dir, "extractor", "ast_extraction", "src", "astExtractor.php"))
|
|
15
|
+
target_file = os.path.abspath(filepath)
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
result = subprocess.run(["php", php_ast_path, target_file], capture_output=True, text=True)
|
|
19
|
+
|
|
20
|
+
#Handle errors if the PHP script execution fails
|
|
21
|
+
if result.returncode != 0:
|
|
22
|
+
return None
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
return json.loads(result.stdout)
|
|
26
|
+
|
|
27
|
+
#error handling for invalid JSON output from the PHP script
|
|
28
|
+
except json.JSONDecodeError:
|
|
29
|
+
print(f"[WARNING] invalid ast output")
|
|
30
|
+
|
|
31
|
+
except Exception:
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def align_features(features_dict):
|
|
36
|
+
return [features_dict.get(col, 0) for col in feature_columns]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def extract_features(filepath):
|
|
40
|
+
features = {}
|
|
41
|
+
|
|
42
|
+
#Extract AST features
|
|
43
|
+
ast_features = extract_ast(filepath)
|
|
44
|
+
if ast_features is not None:
|
|
45
|
+
features.update(ast_features)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
#read file content for lexical and statistical extraction
|
|
50
|
+
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
|
|
51
|
+
code = f.read().strip()
|
|
52
|
+
except Exception:
|
|
53
|
+
print("[ERROR] Failed to read file")
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
#extract lexical features
|
|
58
|
+
lexical_features = extract_lexical_features(code)
|
|
59
|
+
features.update(lexical_features)
|
|
60
|
+
except Exception:
|
|
61
|
+
print("[WARNING] Lexical feature extraction failed")
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
#extract statistical features
|
|
65
|
+
statistical_features = extract_statistical_features(code)
|
|
66
|
+
features.update(statistical_features)
|
|
67
|
+
except Exception:
|
|
68
|
+
print("[WARNING] statistical feature extraction failed")
|
|
69
|
+
|
|
70
|
+
if not features:
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
return features
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
DANGEROUS_FUNCS = ["eval", "system", "exec"]
|
|
4
|
+
USER_INPUTS = [r"\$_POST", r"\$_REQUEST", r"\$_FILES"]
|
|
5
|
+
INCLUDE_FUNCS = ["require_once"]
|
|
6
|
+
SYMBOL_PATTERN = r"[{}\[\]\(\);$]"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def count_regex(pattern, text):
|
|
10
|
+
return len(re.findall(pattern, text, flags=re.IGNORECASE))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def extract_lexical_features(code):
|
|
14
|
+
features = {}
|
|
15
|
+
#dangerous functions
|
|
16
|
+
for f in DANGEROUS_FUNCS:
|
|
17
|
+
features[f"lex_func_{f}"] = count_regex(rf"\b{f}\b", code)
|
|
18
|
+
|
|
19
|
+
#user input variable
|
|
20
|
+
for var in USER_INPUTS:
|
|
21
|
+
clean_name = var.replace("\\", "").replace("$", "")
|
|
22
|
+
features[f"lex_input_{clean_name}"] = count_regex(var, code)
|
|
23
|
+
|
|
24
|
+
#include function
|
|
25
|
+
for inc in INCLUDE_FUNCS:
|
|
26
|
+
features[f"lex_include_{inc}"] = count_regex(rf"\b{inc}\b", code)
|
|
27
|
+
|
|
28
|
+
#special symbols
|
|
29
|
+
features["lex_symbol_count"] = count_regex(SYMBOL_PATTERN, code)
|
|
30
|
+
|
|
31
|
+
return features
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import math
|
|
3
|
+
import zlib
|
|
4
|
+
from collections import Counter
|
|
5
|
+
|
|
6
|
+
#calculate shannon entropy from PHP code
|
|
7
|
+
def calculate_entropy(text):
|
|
8
|
+
if not text:
|
|
9
|
+
return 0.0
|
|
10
|
+
|
|
11
|
+
counter = Counter(text)
|
|
12
|
+
length = len(text)
|
|
13
|
+
|
|
14
|
+
#shanon entropy formula
|
|
15
|
+
return -sum(
|
|
16
|
+
(count / length) * math.log2(count / length)
|
|
17
|
+
for count in counter.values()
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
def compression_ratio(text):
|
|
21
|
+
if not text:
|
|
22
|
+
return 0.0
|
|
23
|
+
|
|
24
|
+
#convert text into bytes before compression
|
|
25
|
+
encoded = text.encode("utf-8", errors="ignore")
|
|
26
|
+
|
|
27
|
+
if len(encoded) == 0:
|
|
28
|
+
return 0.0
|
|
29
|
+
|
|
30
|
+
#compress text using zlib
|
|
31
|
+
compressed = zlib.compress(encoded)
|
|
32
|
+
return len(compressed) / len(encoded)
|
|
33
|
+
|
|
34
|
+
#extract statistical features from PHP code
|
|
35
|
+
def extract_statistical_features(php_code):
|
|
36
|
+
if not isinstance(php_code, str):
|
|
37
|
+
php_code = ""
|
|
38
|
+
|
|
39
|
+
length = len(php_code)
|
|
40
|
+
|
|
41
|
+
features = {
|
|
42
|
+
"stat_entropy": 0,
|
|
43
|
+
"stat_digit_ratio": 0,
|
|
44
|
+
"stat_symbol_ratio": 0,
|
|
45
|
+
"stat_compression_ratio": 0
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if length == 0:
|
|
49
|
+
return features
|
|
50
|
+
|
|
51
|
+
features["stat_entropy"] = calculate_entropy(php_code)
|
|
52
|
+
#calculate ratios of numeric characters
|
|
53
|
+
features["stat_digit_ratio"] = sum(c.isdigit() for c in php_code) / length
|
|
54
|
+
#calculate ratio of special symbols (non-alphanumeric characters)
|
|
55
|
+
features["stat_symbol_ratio"] = sum(not c.isalnum() for c in php_code) / length
|
|
56
|
+
#calculate compression ratio
|
|
57
|
+
features["stat_compression_ratio"] = compression_ratio(php_code)
|
|
58
|
+
|
|
59
|
+
return features
|
|
60
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["lex_func_eval", "stat_digit_ratio", "classDefExists", "lex_input__POST", "stat_entropy", "dynamicFuncCallExists", "lex_input__FILES", "lex_func_exec", "varUsageCount", "funcDefCount", "lex_symbol_count", "superglobalAsFuncArg", "suspiciousConcat", "lex_include_require_once", "stat_compression_ratio", "stat_symbol_ratio", "varExists", "lex_func_system", "lex_input__REQUEST", "assignmentCount"]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pickle
|
|
3
|
+
import pandas as pd
|
|
4
|
+
import json
|
|
5
|
+
from joblib import dump, load
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
base_dir = os.path.dirname(os.path.dirname(__file__))
|
|
9
|
+
|
|
10
|
+
def load_feature_columns():
|
|
11
|
+
feature_path = os.path.join(base_dir, "model", "features_selected.json")
|
|
12
|
+
with open(feature_path, "r") as f:
|
|
13
|
+
cols = json.load(f)
|
|
14
|
+
return cols
|
|
15
|
+
|
|
16
|
+
def load_model():
|
|
17
|
+
model_path = os.path.join(base_dir, "model", "rf_webshell_model.joblib")
|
|
18
|
+
return load(model_path)
|
|
19
|
+
|
|
Binary file
|
|
File without changes
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import json
|
|
4
|
+
from colorama import Fore, Style
|
|
5
|
+
import pandas as pd
|
|
6
|
+
from sklearn.inspection import permutation_importance
|
|
7
|
+
from webshell_analyzer.extractor.extractor import extract_features
|
|
8
|
+
from webshell_analyzer.model.model_loader import load_feature_columns, load_model
|
|
9
|
+
|
|
10
|
+
feature_columns = load_feature_columns()
|
|
11
|
+
model = load_model()
|
|
12
|
+
|
|
13
|
+
max_file_size = 10_000_000 # 10 MB
|
|
14
|
+
|
|
15
|
+
def check_file_content(filepath):
|
|
16
|
+
try:
|
|
17
|
+
#Read only the first 2000 bytes to check for PHP tags
|
|
18
|
+
with open(filepath, 'r', encoding='utf-8', errors='ignore') as file:
|
|
19
|
+
content = file.read(2000).lower()
|
|
20
|
+
|
|
21
|
+
#check if the file contains PHP opening tags
|
|
22
|
+
if "<?php" in content or "<?=" in content:
|
|
23
|
+
return True
|
|
24
|
+
else:
|
|
25
|
+
return False
|
|
26
|
+
except Exception as e:
|
|
27
|
+
print(f"[ERROR] Could not read file '{filepath}': {e}")
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
def validate_file(filepath):
|
|
31
|
+
size = os.path.getsize(filepath)
|
|
32
|
+
|
|
33
|
+
#check whether the file is empty
|
|
34
|
+
if size == 0:
|
|
35
|
+
return False, "Empty File, No Content to Analyze"
|
|
36
|
+
|
|
37
|
+
#validate maximum allowed file size
|
|
38
|
+
if size > max_file_size:
|
|
39
|
+
return False, "File too Large"
|
|
40
|
+
|
|
41
|
+
#check whether the file contains PHP code or not, if not skip the file
|
|
42
|
+
if not check_file_content(filepath):
|
|
43
|
+
return False, "No PHP Code Detected"
|
|
44
|
+
|
|
45
|
+
return True, None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def processing_file(filepath):
|
|
49
|
+
is_valid, reason = validate_file(filepath)
|
|
50
|
+
|
|
51
|
+
result = {
|
|
52
|
+
"filepath": filepath,
|
|
53
|
+
"filename": os.path.basename(filepath),
|
|
54
|
+
"file_size": os.path.getsize(filepath)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#if the file is not valid, return the result with status "invalid" and reason for skipping the file
|
|
58
|
+
if not is_valid:
|
|
59
|
+
result.update({
|
|
60
|
+
"status": "invalid",
|
|
61
|
+
"prediction": "N/A",
|
|
62
|
+
"reason": reason,
|
|
63
|
+
})
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
#feature extraction
|
|
67
|
+
features = extract_features(filepath)
|
|
68
|
+
|
|
69
|
+
#return the result with status "error", if feature extraction fails
|
|
70
|
+
if features is None:
|
|
71
|
+
result.update({
|
|
72
|
+
"status": "error",
|
|
73
|
+
"prediction": "N/A",
|
|
74
|
+
"reason": "Feature extraction failed",
|
|
75
|
+
})
|
|
76
|
+
return result
|
|
77
|
+
|
|
78
|
+
features_df = pd.DataFrame([features])
|
|
79
|
+
features_df = features_df.reindex(columns=feature_columns, fill_value=0)
|
|
80
|
+
|
|
81
|
+
#model prediction
|
|
82
|
+
pred = model.predict(features_df)[0]
|
|
83
|
+
proba = model.predict_proba(features_df)[0]
|
|
84
|
+
|
|
85
|
+
proba_normal = proba[0]
|
|
86
|
+
proba_webshell = proba[1]
|
|
87
|
+
|
|
88
|
+
#determine the confidence score based on the predicted class with the highest probability
|
|
89
|
+
if proba_webshell > proba_normal:
|
|
90
|
+
proba = f"{proba_webshell:.2%}"
|
|
91
|
+
else:
|
|
92
|
+
proba = f"{proba_normal:.2%}"
|
|
93
|
+
|
|
94
|
+
label = "webshell" if str(pred).lower() == "webshell" or pred == 1 else "normal"
|
|
95
|
+
|
|
96
|
+
result.update({
|
|
97
|
+
"status": "processed",
|
|
98
|
+
"prediction": label,
|
|
99
|
+
"confidence": proba,
|
|
100
|
+
"features": features
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
return result
|
|
104
|
+
|
|
105
|
+
#saving the output detection to json file
|
|
106
|
+
def save_result_to_json(result, output_file):
|
|
107
|
+
if os.path.exists(output_file):
|
|
108
|
+
with open(output_file, "r") as f:
|
|
109
|
+
try:
|
|
110
|
+
data = json.load(f)
|
|
111
|
+
|
|
112
|
+
if not isinstance(data, list):
|
|
113
|
+
data = [data]
|
|
114
|
+
except json.JSONDecodeError:
|
|
115
|
+
data = []
|
|
116
|
+
else:
|
|
117
|
+
data = []
|
|
118
|
+
data.append(result)
|
|
119
|
+
|
|
120
|
+
with open(output_file, "w") as f:
|
|
121
|
+
json.dump(data, f, indent=4)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def get_status_color(status):
|
|
125
|
+
if status == "processed":
|
|
126
|
+
return Fore.GREEN
|
|
127
|
+
elif status == "skipped":
|
|
128
|
+
return Fore.YELLOW
|
|
129
|
+
elif status == "error":
|
|
130
|
+
return Fore.RED
|
|
131
|
+
else:
|
|
132
|
+
return Fore.CYAN
|
|
133
|
+
|
|
134
|
+
def show_save_message(output_file):
|
|
135
|
+
print(Fore.GREEN + "\n" + "-" * 50)
|
|
136
|
+
print(Fore.GREEN + f"OUTPUT FILE SAVED".center(50))
|
|
137
|
+
print(Fore.GREEN + "-" * 50)
|
|
138
|
+
print(Fore.GREEN + f"Location: {output_file}")
|
|
139
|
+
print(Fore.GREEN + "-" * 50)
|
|
140
|
+
print(Style.RESET_ALL)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def detect_file(filepath, output_file=None):
|
|
144
|
+
result = processing_file(filepath)
|
|
145
|
+
color = get_status_color(result["status"])
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
if result["status"] == "processed" and "features" in result:
|
|
149
|
+
print(color + "\n" + "=" * 50)
|
|
150
|
+
print(color + "EXTRACTION FEATURES".center(50))
|
|
151
|
+
print(color + "=" * 50)
|
|
152
|
+
for k, v in result["features"].items():
|
|
153
|
+
nilai = f"{v:.4f}" if isinstance(v, float) else str(v)
|
|
154
|
+
print(color + f"{k:<35} : {nilai}")
|
|
155
|
+
print(color + "=" * 50 + Style.RESET_ALL)
|
|
156
|
+
|
|
157
|
+
print(color + "\n" + "=" * 50)
|
|
158
|
+
print(color + "SUMMARY RESULT".center(50))
|
|
159
|
+
print(color + "=" * 50)
|
|
160
|
+
print(color + f"Status : {result['status']}")
|
|
161
|
+
print(color + f"File Size : {os.path.getsize(filepath)} bytes")
|
|
162
|
+
if result["status"] == "processed":
|
|
163
|
+
print(color + f"Prediction : {result['prediction'].upper()}")
|
|
164
|
+
print(color + f"Confidence : {result['confidence']}")
|
|
165
|
+
else :
|
|
166
|
+
print(color + f"Reason : {result['reason']}")
|
|
167
|
+
print(color + "=" * 50)
|
|
168
|
+
|
|
169
|
+
if output_file:
|
|
170
|
+
save_result_to_json(result, output_file)
|
|
171
|
+
show_save_message(output_file)
|
|
172
|
+
return result
|
|
173
|
+
|
|
174
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
from colorama import Style, Fore
|
|
4
|
+
import json
|
|
5
|
+
from webshell_analyzer.modules.detector import processing_file, show_save_message
|
|
6
|
+
|
|
7
|
+
def scan_directory(directorypath, output_file=None):
|
|
8
|
+
|
|
9
|
+
total_files = 0
|
|
10
|
+
total_processed_files = 0
|
|
11
|
+
total_filewebshells = 0
|
|
12
|
+
total_filenormal = 0
|
|
13
|
+
|
|
14
|
+
results = []
|
|
15
|
+
|
|
16
|
+
for root, _, files in os.walk(directorypath):
|
|
17
|
+
for file in files:
|
|
18
|
+
filepath = os.path.join(root, file)
|
|
19
|
+
total_files += 1
|
|
20
|
+
|
|
21
|
+
result = processing_file(filepath)
|
|
22
|
+
|
|
23
|
+
results.append(result)
|
|
24
|
+
|
|
25
|
+
if result["status"] == "processed":
|
|
26
|
+
print(Fore.GREEN + f"[{result['prediction'].upper()}] {filepath}")
|
|
27
|
+
total_processed_files += 1
|
|
28
|
+
|
|
29
|
+
if result["prediction"].lower() == "webshell":
|
|
30
|
+
total_filewebshells += 1
|
|
31
|
+
else :
|
|
32
|
+
total_filenormal += 1
|
|
33
|
+
else:
|
|
34
|
+
print(Fore.YELLOW + f"[SKIPPED] {result['reason']}: {filepath}")
|
|
35
|
+
|
|
36
|
+
summary = {
|
|
37
|
+
"total files": total_files,
|
|
38
|
+
"processed_files": total_processed_files,
|
|
39
|
+
"skipped files": total_files - total_processed_files,
|
|
40
|
+
"normal files": total_filenormal,
|
|
41
|
+
"webshell files": total_filewebshells
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
final_output = {
|
|
45
|
+
"results" : results,
|
|
46
|
+
"summary": summary
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
print(Fore.GREEN + "\n" + "=" * 50)
|
|
50
|
+
print(Fore.GREEN + "SCAN SUMMARY".center(50))
|
|
51
|
+
print(Fore.GREEN + "=" * 50)
|
|
52
|
+
print(Fore.GREEN + f"Total files: {total_files}")
|
|
53
|
+
print(Fore.GREEN + f"Processed files: {total_processed_files}")
|
|
54
|
+
print(Fore.GREEN + f"Skipped files: {total_files - total_processed_files}")
|
|
55
|
+
print(Fore.GREEN + f"normal files: {total_filenormal}")
|
|
56
|
+
print(Fore.GREEN + f"webshell files: {total_filewebshells}")
|
|
57
|
+
print(Fore.GREEN + "=" * 50 + "\n")
|
|
58
|
+
if output_file:
|
|
59
|
+
with open(output_file, "w") as f:
|
|
60
|
+
json.dump(final_output, f, indent=4)
|
|
61
|
+
show_save_message(output_file)
|
|
62
|
+
|
|
63
|
+
sys.stdout.write(Style.RESET_ALL)
|
|
64
|
+
sys.stdout.flush()
|
|
65
|
+
|
|
66
|
+
return output_file, results
|
|
67
|
+
|
|
68
|
+
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: webshell-analyzer
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Webshell Detection Tool integrating Machine Learning based on Static Feature Extraction
|
|
5
|
+
Author-email: Adelia Saputri <adelias.dev@gmail.com>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Adelia saputri
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Keywords: webshell,detection,machine learning,security,php
|
|
29
|
+
Classifier: Programming Language :: Python :: 3
|
|
30
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
31
|
+
Classifier: Operating System :: OS Independent
|
|
32
|
+
Classifier: Topic :: Security
|
|
33
|
+
Classifier: Intended Audience :: System Administrators
|
|
34
|
+
Requires-Python: >=3.8
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
License-File: LICENSE
|
|
37
|
+
Requires-Dist: pandas
|
|
38
|
+
Requires-Dist: scikit-learn
|
|
39
|
+
Requires-Dist: colorama
|
|
40
|
+
Requires-Dist: pyfiglet
|
|
41
|
+
Requires-Dist: joblib
|
|
42
|
+
Dynamic: license-file
|
|
43
|
+
|
|
44
|
+
# Webshell-Analyzer
|
|
45
|
+

|
|
46
|
+
webshell analyzer is command line based webshell detection tool that utillizes static feature extraction and using Random Forest classification to detect malicious PHP webshell.
|
|
47
|
+
|
|
48
|
+
# Table of Contens
|
|
49
|
+
- About
|
|
50
|
+
- Features
|
|
51
|
+
- Requirements
|
|
52
|
+
- Instalation
|
|
53
|
+
- Usage
|
|
54
|
+
- Commands
|
|
55
|
+
|
|
56
|
+
# About
|
|
57
|
+
webshell analyzer was developed to assist security analysts, researchers, and system administrators in identifying potentially malicious PHP files before they are executed on a web server. the tool helps to mitigate the risk of unauthorised access, web defacement attacks, and persistent backdoor attacks, which are commonly associated with webshells.
|
|
58
|
+
|
|
59
|
+
this system combines three static code analysis methods: lexical analysis, statistical analysis, and Abstract Syntax Tree (AST) analysis. this approach enables the detection process to identify suspicious functions, code structure patterns, and statistical characteristics that may indicate malicious behavior.
|
|
60
|
+
|
|
61
|
+
# Features
|
|
62
|
+
- Scan individual PHP files for webshell indicators
|
|
63
|
+
- Recursively scan entire directories
|
|
64
|
+
- Static feature extraction (no code execution required)
|
|
65
|
+
- Machine learning classification using Random Forest
|
|
66
|
+
- Export results to only JSON file
|
|
67
|
+
- Interactive CLI environment
|
|
68
|
+
|
|
69
|
+
# Requirements
|
|
70
|
+
before installing and running webshell analyzer, ensure that your system meets the following requirements :
|
|
71
|
+
|
|
72
|
+
- Python 3.10 or later
|
|
73
|
+
- Pip (oython package manager)
|
|
74
|
+
- Git
|
|
75
|
+
|
|
76
|
+
**Python Dependencies**
|
|
77
|
+
The required python packages are listed in the ```requirements.txt``` file and can be installed automatically using :
|
|
78
|
+
|
|
79
|
+
```pip install -r requirements.txt```
|
|
80
|
+
|
|
81
|
+
# Installation
|
|
82
|
+
to install webshell analyzer, clone this repository to your local machine using the following command :
|
|
83
|
+
|
|
84
|
+
```git clone https://github.com```
|
|
85
|
+
|
|
86
|
+
After the installation process is complete, the system is ready to use.
|
|
87
|
+
|
|
88
|
+
# Usage
|
|
89
|
+
To get started with Webshell Analyzer:
|
|
90
|
+
|
|
91
|
+
Start ```bash wsanalyzer```: this is the main command to enter the Webshell Analyzer interactive environment.
|
|
92
|
+
You will be greeted with the Webshell Analyzer prompt:
|
|
93
|
+
|
|
94
|
+
From here, you can run all available commands such as `scan`, `detect`, `--output`, `help`, `exit`.
|
|
95
|
+
|
|
96
|
+
# Command
|
|
97
|
+
1. ```scan <directory_path> [--output <output_file.json>]``` -> scan all PHP files in a directory for webshell detection
|
|
98
|
+
2. ```detect <file_path> [--output <output_file.json>]``` -> detect a specific file for webshell activity
|
|
99
|
+
3. ```help``` -> for show this help message
|
|
100
|
+
4. ```exit``` -> For Exit the Webshell Analyzer
|
|
101
|
+
5. ```--output <output_file.json>``` -> Save the detection results to a JSON file
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|