Initial commit: Windows Mining Trojan Remover

This commit is contained in:
dvs
2026-08-28 09:07:05 +08:00
commit ab4706bb00
11 changed files with 1167 additions and 0 deletions
+273
View File
@@ -0,0 +1,273 @@
# -*- coding: utf-8 -*-
"""
持续系统安全监控程序 v2
从启动开始持续监控系统,直到 C:\f.ini 被删除 或 运行满 3 分钟
监控服务、计划任务、自启动、进程、文件、网络、Windows安全中心等
"""
import os
import sys
import time
import subprocess
import datetime
import socket
import platform
# 结束条件文件
STOP_FILE = r"C:\f.ini"
# 最大运行时间(秒)
MAX_RUNTIME = 180 # 3 分钟
# 日志目录
LOG_DIR = r"C:\SysMonitorLogs"
os.makedirs(LOG_DIR, exist_ok=True)
# 已知恶意关键词
MALICIOUS_KEYWORDS = [
'TfuSTvhb', 'YRbL1xSX', 'WpSJj0lv', 'RuntimeHost', 'RuntimeTask',
'8B86CBC', '2FA7F989', 'ABE94A11', '15205438', 'D3F4E2A1', '50AB775E',
'proxies-peer', '15AB6CF5', 'B95EB893', '5ghAHv', 'jHkYtN', 'zQM241sm',
'nAumBAO1', 'lw5ypO', 'P41H56Vb', 'WE93mndC', 'KxDQmm', 'ccv', 'mzcv',
'lolMiner', 'SRBMiner', 'gminer', 'miniZ', 'SecurityHealthHost',
'0AzjkAEd', '6E7B6FD3', 'UT7ejTkn', 'ScreenConnect', 'Windows VC',
'rasedy', 'Elevate Plans Interface', 'Windows System Health',
'Workflow Contingency', 'Diagnostics.Client', 'SimpleRunPE'
]
# 挖矿矿池
MINING_POOLS = ['kryptex', '176.96.137.253', '217.216.109.4', '4041', 'rasedy.com', 'gleeze']
def now():
return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def run_cmd(cmd, timeout=30):
try:
result = subprocess.run(cmd, shell=True, capture_output=True,
text=True, timeout=timeout, errors='ignore')
return result.stdout + result.stderr
except Exception as e:
return f"ERROR: {e}"
def log_write(f, section, content):
f.write(f"\n{'='*60}\n[{section}] - {now()}\n{'='*60}\n")
f.write(content + "\n")
f.flush()
def collect_services():
out = run_cmd('wmic service get name,displayname,state,startmode,pathname /format:csv')
lines = [l for l in out.split('\n') if l.strip() and 'Node' not in l]
result = []
for l in lines[1:]:
parts = l.strip().split(',')
if len(parts) >= 6:
name = parts[1].strip()
state = parts[2].strip()
start = parts[3].strip()
path = parts[5].strip() if len(parts) > 5 else ''
flag = ' <<< 可疑' if any(k.lower() in (name + path).lower() for k in MALICIOUS_KEYWORDS) else ''
result.append(f"[{state}] {name} | Start={start} | {path}{flag}")
return '\n'.join(result)
def collect_tasks():
out = run_cmd('schtasks /query /fo csv /v')
lines = [l for l in out.split('\n') if l.strip()]
result = []
for l in lines:
flag = ' <<< 可疑' if any(k.lower() in l.lower() for k in MALICIOUS_KEYWORDS) else ''
result.append(l.strip() + flag)
return '\n'.join(result)
def collect_registry_run():
result = []
keys = [
r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce',
r'HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run',
r'HKCU\Software\Microsoft\Windows\CurrentVersion\Run',
r'HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce',
]
for k in keys:
out = run_cmd(f'reg query "{k}"')
flag = ' <<< 可疑' if any(m.lower() in out.lower() for m in MALICIOUS_KEYWORDS) else ''
result.append(f"--- {k} ---{flag}\n{out}")
return '\n'.join(result)
def collect_startup_folders():
result = []
folders = [
r'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup',
os.path.join(os.environ.get('APPDATA', ''), r'Microsoft\Windows\Start Menu\Programs\Startup'),
]
for f in folders:
if os.path.exists(f):
files = os.listdir(f)
result.append(f"--- {f} ---\n" + '\n'.join(files))
return '\n'.join(result)
def collect_processes():
out = run_cmd('wmic process get name,processid,parentprocessid,executablepath /format:csv')
lines = [l for l in out.split('\n') if l.strip() and 'Node' not in l]
result = []
for l in lines[1:]:
parts = l.strip().split(',')
if len(parts) >= 5:
name = parts[1].strip()
pid = parts[2].strip()
ppid = parts[3].strip()
path = parts[4].strip()
flag = ' <<< 可疑' if any(k.lower() in (name + path).lower() for k in MALICIOUS_KEYWORDS) else ''
if flag or name in ['RuntimeHost.exe', 'RuntimeTask.exe', 'SecurityHealthHost.exe',
'ScreenConnect.ClientService.exe', 'ScreenConnect.WindowsClient.exe']:
result.append(f"[{pid}] {name} | PPID={ppid} | {path}{flag}")
return '\n'.join(result)
def collect_suspicious_files():
result = []
base_dirs = [
r'C:\ProgramData',
r'C:\Users\Public',
r'C:\Program Files (x86)',
r'C:\ProgramData\Microsoft\Windows\Caches',
]
for base in base_dirs:
if not os.path.exists(base):
continue
try:
for root, dirs, files in os.walk(base):
depth = root[len(base):].count(os.sep)
if depth > 3:
dirs[:] = []
continue
for item in dirs + files:
full = os.path.join(root, item)
if any(k.lower() in (item + full).lower() for k in MALICIOUS_KEYWORDS):
result.append(f"可疑: {full}")
except Exception:
pass
return '\n'.join(result) if result else "未发现已知恶意文件"
def collect_network():
out = run_cmd('netstat -ano')
result = []
for l in out.split('\n'):
if any(p in l for p in MINING_POOLS):
result.append(l.strip())
return '\n'.join(result) if result else "未发现可疑网络连接"
def collect_defender_full():
"""Windows 安全中心完整检测"""
result = []
# 1. Defender 服务状态
for svc in ['WinDefend', 'SecurityHealthService', 'wscsvc', 'MDCoreSvc', 'WdNisSvc']:
out = run_cmd(f'sc query {svc}')
state = 'RUNNING' if 'RUNNING' in out else 'STOPPED'
result.append(f"{svc}: {state}")
# 2. Defender 引擎状态
out = run_cmd('powershell -NoProfile -Command "$s = Get-MpComputerStatus -ErrorAction SilentlyContinue; if ($s) { Write-Output (\'AV: \' + $s.AntivirusEnabled); Write-Output (\'RTP: \' + $s.RealTimeProtectionEnabled); Write-Output (\'SigVer: \' + $s.AntivirusSignatureVersion); Write-Output (\'EngineVer: \' + $s.AMEngineVersion); Write-Output (\'Tamper: \' + $s.IsTamperProtected); Write-Output (\'FullScanEnd: \' + $s.FullScanEndTime); Write-Output (\'QuickScanEnd: \' + $s.QuickScanEndTime) } else { Write-Output \'无法获取Defender状态\' }"')
result.append("--- Defender 引擎状态 ---")
result.append(out)
# 3. Defender 排除项检测
result.append("--- Defender 排除项 ---")
out2 = run_cmd('powershell -NoProfile -Command "$p = Get-MpPreference -ErrorAction SilentlyContinue; Write-Output (\'Path: \' + ($p.ExclusionPath -join \', \')); Write-Output (\'Process: \' + ($p.ExclusionProcess -join \', \')); Write-Output (\'Extension: \' + ($p.ExclusionExtension -join \', \'))"')
flag = ' <<< 可疑排除项' if any(k.lower() in out2.lower() for k in MALICIOUS_KEYWORDS) else ''
result.append(out2 + flag)
# 4. Defender 筛选器驱动
result.append("--- Defender 驱动 ---")
out3 = run_cmd('driverquery /v /fo csv 2>nul | findstr /i "WdFilter WdBoot WdNisDrv MsSecFlt"')
result.append(out3)
# 5. 最近引擎崩溃事件
result.append("--- 最近引擎崩溃事件 ---")
out4 = run_cmd('powershell -NoProfile -Command "Get-WinEvent -LogName \'Microsoft-Windows-Windows Defender/Operational\' -MaxEvents 10 -ErrorAction SilentlyContinue | Where-Object {$_.Id -eq 5008 -or $_.Id -eq 3002} | ForEach-Object { Write-Output ($_.TimeCreated.ToString() + \' | ID=\' + $_.Id + \' | \' + $_.Message.Substring(0, [Math]::Min(100, $_.Message.Length))) }"')
result.append(out4 if out4.strip() else "无引擎崩溃事件")
# 6. WDAC 策略检查
result.append("--- WDAC 策略 ---")
if os.path.exists(r'C:\Windows\System32\CodeIntegrity\SiPolicy.p7b'):
result.append("SiPolicy.p7b 存在 (可疑)")
else:
result.append("SiPolicy.p7b 已删除 (正常)")
return '\n'.join(result)
def collect_lsa_authpackages():
out = run_cmd('reg query "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa" /v "Authentication Packages"')
flag = ' <<< 可疑' if any(k.lower() in out.lower() for k in MALICIOUS_KEYWORDS) else ''
return out + flag
def collect_services_registry():
out = run_cmd('wmic service get name,pathname /format:csv')
result = []
for l in out.split('\n'):
if any(k.lower() in l.lower() for k in MALICIOUS_KEYWORDS):
result.append(l.strip())
return '\n'.join(result) if result else "服务注册表中未发现可疑路径"
def snapshot(f, round_num, elapsed):
log_write(f, f"快照 #{round_num} (运行 {elapsed:.0f} 秒)", "")
log_write(f, "1. 所有系统服务", collect_services())
log_write(f, "2. 所有计划任务", collect_tasks())
log_write(f, "3. 注册表自启动项", collect_registry_run())
log_write(f, "4. 启动文件夹", collect_startup_folders())
log_write(f, "5. 可疑进程", collect_processes())
log_write(f, "6. 可疑文件扫描", collect_suspicious_files())
log_write(f, "7. 网络连接", collect_network())
log_write(f, "8. Windows安全中心完整检测", collect_defender_full())
log_write(f, "9. LSA认证包", collect_lsa_authpackages())
log_write(f, "10. 服务注册表可疑路径", collect_services_registry())
def main():
start_time = time.time()
log_file = os.path.join(LOG_DIR, f'continuous_monitor_{datetime.datetime.now().strftime("%Y%m%d_%H%M%S")}.log')
with open(log_file, 'w', encoding='utf-8') as f:
f.write(f"持续系统安全监控日志 v2\n开始时间: {now()}\n")
f.write(f"主机名: {socket.gethostname()}\n")
f.write(f"系统: {platform.platform()}\n")
f.write(f"停止条件: {STOP_FILE} 被删除 或 运行 {MAX_RUNTIME} 秒\n")
f.write(f"采样间隔: 5 秒\n")
f.flush()
round_num = 0
while True:
elapsed = time.time() - start_time
stop_reason = None
if not os.path.exists(STOP_FILE):
stop_reason = f"停止文件 {STOP_FILE} 已被删除"
elif elapsed >= MAX_RUNTIME:
stop_reason = f"运行时间达到 {MAX_RUNTIME} 秒"
round_num += 1
snapshot(f, round_num, elapsed)
if stop_reason:
log_write(f, "停止", f"停止原因: {stop_reason}")
break
time.sleep(5)
f.write(f"\n{'='*60}\n监控结束: {now()}\n总采样次数: {round_num}\n")
print(f"监控日志已写入: {log_file}")
if __name__ == '__main__':
main()