2025-07-04 00:04:51 +03:00
|
|
|
|
/* This software is licensed by the MIT License, see LICENSE file */
|
|
|
|
|
/* Copyright © 2024-2025 Gregory Lirent */
|
2025-07-03 15:22:40 +03:00
|
|
|
|
|
|
|
|
|
using WebmrAPI.Models;
|
|
|
|
|
|
|
|
|
|
namespace WebmrAPI.Services.Scanners
|
|
|
|
|
{
|
|
|
|
|
public class ScanProvider : IScanProvider
|
|
|
|
|
{
|
|
|
|
|
private ProcessMonitor _monitor;
|
|
|
|
|
public bool ProcessReadAccess { get => _monitor.Config.AllowProcessReadAccess; }
|
|
|
|
|
public ILogger Logger { get => _monitor.Logger; }
|
|
|
|
|
|
|
|
|
|
public int GetTimeout(ScanTarget target)
|
|
|
|
|
{
|
|
|
|
|
switch (target)
|
|
|
|
|
{
|
2025-07-03 20:01:19 +03:00
|
|
|
|
case ScanTarget.MemoryRegions: return _monitor.Config.MemoryRegionScanTimeout;
|
|
|
|
|
case ScanTarget.Modules: return _monitor.Config.ModuleScanTimeout;
|
|
|
|
|
case ScanTarget.Threads: return _monitor.Config.ThreadScanTimeout;
|
2025-07-03 15:22:40 +03:00
|
|
|
|
default: return _monitor.Config.ProcessScanInterval;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IScannable CreateScanTask()
|
|
|
|
|
{
|
|
|
|
|
return new ProcessScanner(this, _monitor.Processes);
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 20:01:19 +03:00
|
|
|
|
async public Task<IScannable> CreateFullScanTaskAsync(ScanTarget target = ScanTarget.ProcessDetails)
|
2025-07-03 15:22:40 +03:00
|
|
|
|
{
|
2025-07-03 20:01:19 +03:00
|
|
|
|
if (target.HasFlag(ScanTarget.Processes))
|
|
|
|
|
{
|
|
|
|
|
await CreateScanTask().ScanAsync();
|
|
|
|
|
target &= ~ScanTarget.Processes;
|
|
|
|
|
}
|
2025-07-03 15:22:40 +03:00
|
|
|
|
|
2025-07-03 20:01:19 +03:00
|
|
|
|
var scanner = new ScanQueue();
|
|
|
|
|
var data = _monitor.Processes.Values;
|
2025-07-03 15:22:40 +03:00
|
|
|
|
|
|
|
|
|
if (data != null)
|
|
|
|
|
{
|
|
|
|
|
foreach (var process in data)
|
|
|
|
|
{
|
|
|
|
|
scanner.Add(CreateScanTask(process, target));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return scanner;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 20:01:19 +03:00
|
|
|
|
public IScannable CreateScanTask(ProcessInfo process, ScanTarget target = ScanTarget.ProcessDetails)
|
2025-07-03 15:22:40 +03:00
|
|
|
|
{
|
|
|
|
|
var scanner = new ScanQueue();
|
|
|
|
|
|
2025-07-03 20:01:19 +03:00
|
|
|
|
if (target.HasFlag(ScanTarget.MemoryRegions))
|
2025-07-03 15:22:40 +03:00
|
|
|
|
{
|
|
|
|
|
scanner.Add(new MemoryRegionScanner(this, process.MemoryRegionsContainer, process.PID));
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 20:01:19 +03:00
|
|
|
|
if (target.HasFlag(ScanTarget.Modules))
|
2025-07-03 15:22:40 +03:00
|
|
|
|
{
|
|
|
|
|
scanner.Add(new ModuleScanner(this, process.ModulesContainer, process.PID));
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-03 20:01:19 +03:00
|
|
|
|
if (target.HasFlag(ScanTarget.Threads))
|
2025-07-03 15:22:40 +03:00
|
|
|
|
{
|
|
|
|
|
scanner.Add(new ThreadScanner(this, process.ThreadsContainer, process.PID));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return scanner;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ScanProvider(ProcessMonitor monitoringService)
|
|
|
|
|
{
|
|
|
|
|
_monitor = monitoringService;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|