147 lines
5.9 KiB
HTML
147 lines
5.9 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="renderer" content="webkit">
|
||
<script>(function(){var t;try{t=localStorage.getItem("hp-theme")}catch(e){}if(!t){t=(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches)?"dark":"light"}document.documentElement.setAttribute("data-theme",t);})();</script>
|
||
<title>杀软识别</title>
|
||
<link rel="icon" href="../assets/img/logo.svg">
|
||
<link rel="stylesheet" href="../assets/css/common.css">
|
||
</head>
|
||
<body>
|
||
<div class="func-bar"><div class="wrap func-bar-inner">
|
||
<a class="btn btn-sm js-fb-back" href="index.php" title="返回功能区首页">← 返回功能区首页</a>
|
||
<span class="func-bar-title">杀软识别</span>
|
||
<a class="btn btn-sm" href="../index.php">首页</a>
|
||
</div></div>
|
||
|
||
<main class="page-main">
|
||
<div class="wrap page-body">
|
||
<div class="panel-card">
|
||
<p class="tip" style="margin-top:0">🔒 粘贴的 tasklist 输出仅在本机浏览器内解析匹配,不会上传服务器;如需离线独立使用,请将 <code>data/avlist.js</code> 一并拷贝。</p>
|
||
<h2>使用说明</h2>
|
||
<p class="tip">在目标机器执行 <code>tasklist</code> 复制全部输出,粘贴到下方输入框后点击“识别”。
|
||
系统会逐行解析进程名并与预置的安全软件进程表(data/avlist.js)进行大小写不敏感匹配,<strong>表格仅展示识别出的安全软件进程</strong>,常规进程不展示。</p>
|
||
<label class="fl" for="taskInput">tasklist 输出内容</label>
|
||
<textarea id="taskInput" rows="12" placeholder="在此粘贴 tasklist 命令输出…"></textarea>
|
||
<div class="field-row" style="margin-top:10px">
|
||
<button type="button" class="btn btn-primary" id="btnAv">识别</button>
|
||
<button type="button" class="btn" id="btnAvClear">清空</button>
|
||
</div>
|
||
<div id="avMsg"></div>
|
||
</div>
|
||
|
||
<div class="panel-card" id="avResult" hidden>
|
||
<h2>识别结果 <span id="avStat" class="tip"></span></h2>
|
||
<div style="overflow-x:auto">
|
||
<table class="tbl">
|
||
<thead><tr><th>#</th><th>进程名</th><th>识别结果</th><th>产品 / 说明</th></tr></thead>
|
||
<tbody id="avBody"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
|
||
<button type="button" class="theme-fab js-theme-btn" title="切换昼夜模式" aria-label="切换昼夜模式"><span class="js-theme-icon"></span></button>
|
||
<button type="button" class="theme-fab to-top js-to-top" title="返回顶部" aria-label="返回顶部">↑</button>
|
||
<script src="../data/avlist.js"></script>
|
||
<script src="../assets/js/common.js"></script>
|
||
<script>
|
||
(function () {
|
||
'use strict';
|
||
function $(id) { return document.getElementById(id); }
|
||
|
||
function parseLines(text) {
|
||
var lines = text.split(/\r?\n/);
|
||
var out = [];
|
||
for (var i = 0; i < lines.length; i++) {
|
||
var line = lines[i].trim();
|
||
if (!line) continue;
|
||
if (/映像名称|Image Name|进程名|PID|===/i.test(line) && !/\d$/.test(line.trim())) continue;
|
||
var name = line.split(/[\s,]+/)[0];
|
||
if (!name) continue;
|
||
out.push({ name: name, raw: line });
|
||
}
|
||
return out;
|
||
}
|
||
|
||
function normalizeName(n) {
|
||
return n.toLowerCase().replace(/\.exe$/i, '');
|
||
}
|
||
|
||
function lookup(name) {
|
||
var lower = name.toLowerCase();
|
||
var map = window.avList || {};
|
||
if (Object.prototype.hasOwnProperty.call(map, lower)) return map[lower];
|
||
var base = normalizeName(name);
|
||
for (var key in map) {
|
||
if (Object.prototype.hasOwnProperty.call(map, key) && normalizeName(key) === base) {
|
||
return map[key];
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function esc(s) {
|
||
var d = document.createElement('div');
|
||
d.textContent = s == null ? '' : String(s);
|
||
return d.innerHTML;
|
||
}
|
||
|
||
function run() {
|
||
var text = $('taskInput').value;
|
||
var msg = $('avMsg');
|
||
msg.innerHTML = '';
|
||
if (!text.trim()) {
|
||
msg.innerHTML = '<div class="err-msg">请先粘贴 tasklist 输出内容。</div>';
|
||
return;
|
||
}
|
||
var rows = parseLines(text);
|
||
if (!rows.length) {
|
||
msg.innerHTML = '<div class="err-msg">未能解析到有效的进程行,请确认粘贴的是 tasklist 输出。</div>';
|
||
return;
|
||
}
|
||
var body = $('avBody');
|
||
body.innerHTML = '';
|
||
var matched = [];
|
||
rows.forEach(function (r) {
|
||
var info = lookup(r.name);
|
||
if (info) matched.push({ name: r.name, info: info });
|
||
});
|
||
if (!matched.length) {
|
||
$('avResult').hidden = true;
|
||
msg.innerHTML = '<div class="ok-msg">共解析 ' + rows.length + ' 行进程,未识别到已知的安全软件进程。</div>';
|
||
return;
|
||
}
|
||
matched.forEach(function (m, i) {
|
||
var tr = document.createElement('tr');
|
||
tr.innerHTML =
|
||
'<td>' + (i + 1) + '</td>' +
|
||
'<td>' + esc(m.name) + '</td>' +
|
||
'<td><span class="badge badge-ok">已匹配</span></td>' +
|
||
'<td>' + esc(m.info) + '</td>';
|
||
body.appendChild(tr);
|
||
});
|
||
$('avStat').textContent = '共解析 ' + rows.length + ' 行进程,识别到 ' + matched.length + ' 个安全软件进程';
|
||
$('avResult').hidden = false;
|
||
msg.innerHTML = '';
|
||
}
|
||
|
||
$('btnAv').addEventListener('click', run);
|
||
$('btnAvClear').addEventListener('click', function () {
|
||
$('taskInput').value = '';
|
||
$('avResult').hidden = true;
|
||
$('avBody').innerHTML = '';
|
||
$('avMsg').innerHTML = '';
|
||
$('taskInput').focus();
|
||
});
|
||
$('taskInput').addEventListener('keydown', function (ev) {
|
||
if (ev.key === 'Enter' && (ev.ctrlKey || ev.metaKey)) run();
|
||
});
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html>
|