ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows木马排查实战:进程、服务、端口与日志六大排查面详解

Windows木马排查实战:进程、服务、端口与日志六大排查面详解 排查 Windows 木马这件事我这些年做过不少次从家里长辈电脑上莫名卡顿、弹广告的“疑难杂症”到公司内网里几台服务器同时往外发包的紧急事件最后能追上问题根源的靠的始终是那几块固定阵地进程、服务、启动项、计划任务、端口、日志。无论木马包装得再隐蔽想长期存活、持续作恶就必然要在这些地方留下痕迹。这篇文章就按我自己的实际操作顺序把这六个排查面完整走一遍每一条都给出具体命令、判断依据和踩坑记录。适合刚接触应急响应的运维朋友也适合电脑疑似中毒想自己动手查清楚的用户哪怕你暂时没有事件要处理把它当一份巡检清单来用也完全合适。1. 排查前的准备先建立正确的排查思路1.1 动手前必须先回答的三个问题接到一台疑似中毒的机器我不会第一时间就点开任务管理器乱翻而是先花几分钟问自己三个问题机器是什么时候开始异常的具体表现出什么症状影响范围有多大这三个问题的答案会直接影响排查顺序和判断方向。比如“浏览器主页被改、弹广告”和“服务器CPU 100%、疯狂向外发包”虽然都可能是木马但侧重点完全不同。前者优先查浏览器加载项、启动项、计划任务后者优先查进程、网络连接、服务。再比如“异常出现时间”也很关键如果一台服务器运行了两年突然开始向外连接那时间节点很可能对应一次补丁更新、一次弱口令爆破成功或者某个软件安装包被植入。这时候翻看 Windows 日志和计划任务的创建时间往往能直接锁定传播源头。除此之外还要明确边界当前是只有一台机器受影响还是整个网段多台同时异常如果有局域网横向传播的迹象就不能只盯着单机清理还要考虑共享账号、内网扫描、开放端口等关联问题。排查前把边界划清楚后面才不会按下葫芦浮起瓢。1.2 准备好工具先给系统拍一张“快照”很多人一上来就开杀毒软件全盘扫描但我的习惯是先用系统自带命令把“现场”完整保存下来。原因很简单扫描可能触发恶意程序的自毁机制或者清掉表面症状却留下持久化入口等你回过头来排查时原始证据已经被破坏了。我推荐的快照采集内容包括当前进程列表、全部网络连接、服务列表、计划任务列表、启动项列表。这些信息用系统自带的命令行工具就能拿到tasklist /svc /v C:\evidence\tasklist_before.txt netstat -ano C:\evidence\netstat_before.txt sc query type service state all C:\evidence\services_before.txt schtasks /query /fo LIST /v C:\evidence\tasks_before.txt每一条命令都记得用管理员身份运行。如果你拿到的是 PowerShell推荐用更结构化的方式导出Get-CimInstance Win32_Process | Select-Object Name,ProcessId,ParentProcessId,ExecutablePath,CommandLine | Export-Csv C:\evidence\process_before.csv -NoTypeInformation Get-CimInstance Win32_Service | Select-Object Name,DisplayName,State,StartMode,PathName | Export-Csv C:\evidence\services_before.csv -NoTypeInformation这套快照不仅用于事后取证更重要的是让你有一个“干净基线”。等后续查完一圈再拍一次快照对比两次差异就能确认有没有清理干净。1.3 关于管理员权限少一项都查不全我见过太多人在排查卡了半天的原因不是技术不行而是排查命令没有以管理员身份运行。Windows 有很多信息对普通权限是隐藏的典型的就是netstat -b无法显示进程名、tasklist /svc在权限不足时看不到服务对应关系、部分注册表启动项只显示当前用户而非全部用户。所以整篇教程里的命令启动终端和 PowerShell 时都请右键“以管理员身份运行”。如果你用的是运维工具也要确保当前会话具备 SYSTEM 或管理员权限。排查木马本身就相当于“警察查案”你权限不够连案发现场都进不去后面的判断自然全是虚的。2. 进程排查最快暴露异常的位置2.1 从任务管理器到命令行怎么把进程看全绝大多数人排查的第一步是打开任务管理器这没问题任务管理器胜在直观按 CPU 或内存降序排列一眼就能看到哪个进程占用最高。但它的短板也很明显——默认列表不显示进程的完整路径很多木马还会把进程名伪装成svchost.exe、rundll32.exe这类“看起来很正常”的系统进程光看任务管理器很难判断真假。所以我更习惯用命令行把进程信息看全。最基础的一条命令tasklist /svc /v这里/svc会显示每个进程对应的服务/v显示映像名称、PID、会话名、内存占用等详细信息。如果进程被某个服务托管比如svchost.exe/svc参数能直接告诉你它承载的是哪个服务名这对区分“正常的 svchost”和“伪装的 svchost”非常有用。想要更完整的可执行路径和命令行参数就需要借助 WMI 了。在 Win10 上可以用wmic process list full但到了 Win11 很多版本默认不带 wmic我直接改用 PowerShellGet-CimInstance Win32_Process | Select-Object Name, ProcessId, ParentProcessId, ExecutablePath, CommandLine | Format-List这条命令最关键的两个字段是ExecutablePath和CommandLine。前者告诉你进程从哪里启动的后者告诉你它启动时带了什么参数。很多恶意进程一看路径是C:\Users\Public\、C:\Windows\Temp\、C:\Users\xxx\AppData\基本就可以直接提高警惕。2.2 判断进程是否可疑的几条硬标准信息有了接下来就是判断。我的经验是不要凭“眼熟”下结论而是套用几条硬标准逐项过滤第一看路径。系统进程的路径必然在C:\Windows\System32\或C:\Windows\SysWOW64\如果svchost.exe出现在C:\Users\、C:\ProgramData\之类的目录下哪怕名字一模一样也基本可以断定是冒牌货。第二看签名和公司名。正常微软进程都有 Microsoft 数字签名右键查看属性里的“数字签名”标签如果显示“无法验证签名”或根本无签名强烈可疑。第三看父子进程关系。平时多积累正常系统的进程树结构Windows 正常启动时很多进程都有固定的父子关系。比如 explorer.exe 的子进程通常是用户启动的程序如果发现 cmd.exe 或 powershell.exe 由某个 Office 文档、PDF 阅读器或者随机命名的进程启动就值得多问一句“谁调起了它”。第四看异常行为特征。同一个进程名出现几十个实例、随机字符串进程名、长时间高 CPU 却对应不到正常业务这些都算异常信号。不要觉得“进程名没见过”就危险“进程名很像系统进程但不是”才是更危险的信号。比如lsass.exe和lssas.exe只差一个字母这种伪装是最典型的木马特征。2.3 进程排查实操示例与常见误区这里举一个我实际操作中遇到的例子。朋友的一台电脑 CPU 老是 100%打开任务管理器看到一个rundll32.exe占着 40% CPU。只看名字确实容易忽略但我用 PowerShell 调出完整信息后发现它的ExecutablePath指向C:\Users\Public\Music\目录而正常 rundll32 应该位于 System32 目录配合它的CommandLine里带了一个 DLL 文件名和一个-k参数基本可以锁定是恶意加载项。遇到可疑进程先别急着“结束任务”。我的习惯是先把 PID、名称、路径、启动参数记录到快照里然后看它有没有对应的服务和计划任务再决定处理方式。因为很多木马有守护机制你只结束进程几秒钟后它会被另一个进程重新拉起。这样打完一个又出一个最后只能干瞪眼。这里还必须提醒一个误区不要看到 svchost.exe 数量多就紧张。Windows 正常就有多个 svchost 进程每个承载一到多个系统服务这个属于正常现象。只有当你确认某个 svchost 的路径不对、行为异常时才需要深入解剖。3. 服务、启动项与计划任务木马最喜欢藏的三块地方3.1 服务排查services.msc 要看哪些字段进程可以被结束单纯的文件也可能被清理但要让恶意程序开机自启、异常后自动恢复就需要借助 Windows 的服务机制。服务排查是继进程之后最重要的一环。很多人习惯直接敲services.msc打开服务管理器这当然可以但要看对字段。打开服务管理器后我第一眼会盯三列名称、状态、启动类型。先把启动类型为“自动”的第三方服务全部列出来逐一看“可执行文件的路径”。方法是在服务上右键属性查看路径。如果某个服务名称是随机字符串路径指向C:\Windows\Temp\、C:\ProgramData\、用户目录或者路径里带了看似正常的 exe 但前缀明显不对劲这就是重点怀疑对象。命令行下排查服务我推荐用 sc 导出全部服务再过滤sc query type service state all这条命令输出很长建议直接重定向到文件里查看。更友好的方式是 PowerShellGet-CimInstance Win32_Service | Select-Object Name, DisplayName, State, StartMode, PathName | Sort-Object State, StartMode | Format-Table -AutoSize看到可疑服务后国内外的处理流程都差不多先停止服务再禁用再从注册表里删除服务项。这里有个很多人会问的问题services.msc 里的服务可以添加或删除吗答案是系统自带服务千万别乱删删错了可能导致系统功能异常第三方可疑服务不要直接在服务管理器右键“删除”因为它经常报“拒绝访问”。正确做法是先停止服务然后打开注册表编辑器定位到HKLM\SYSTEM\CurrentControlSet\Services\服务名删除整个项。3.2 启动项排查注册表和启动文件夹一个都不能漏服务是持久化的重要手段但覆盖面其实没有启动项那么广。木马要保证开机自启最简单的办法就是往启动项里塞一条注册表值或者在启动文件夹里丢一个快捷方式。启动项排查我去过最多的地方就是这几处reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run reg query HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run reg query HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce reg query HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce除了注册表还要检查两个启动文件夹当前用户的启动文件夹按WinR输入shell:startup和公共启动文件夹输入shell:common startup。这两个文件夹里放的是快捷方式一旦存在指向C:\ProgramData\xxx.exe之类可执行文件的快捷方式就要留意它的目标路径是否正常。手动逐个查注册表当然靠谱但在正式排查时我更推荐微软官方的Autoruns工具。它能一次性把注册表启动项、启动文件夹、计划任务、服务、驱动、浏览器扩展等几十类自启动点全部展示出来并且支持“隐藏微软签名条目”筛掉正常系统项目后剩下的就是值得人工核验的。对不熟悉注册表的读者来说Autoruns 基本是“一键看全”的最优解比逐项敲 reg query 高效太多。3.3 计划任务排查很多人会忽略的持久化手段如果说启动项和服务是“大众都知道的藏身处”计划任务就是最容易漏掉的一环。恶意程序给自己创建一个计划任务设置成每隔几分钟或每天固定时间运行一次既规避了杀软扫描又能在被你清理后自动恢复隐蔽性相当强。命令行查看计划任务最直观的是schtasks /query /fo LIST /v但输出量非常大建议用 CSV 格式导出后用 Excel 或者文本编辑器打开重点看几个字段任务名称、下次运行时间、要运行的任务、起始于、登录模式。如果看到一个任务名是随机字符串运行目标是C:\Users\Public\或C:\Windows\Temp\下的 exe触发器设为“每次登录时”或“每5分钟重复一次”基本可以直接归为可疑。用 PowerShell 可以把计划任务的行动作和触发器看得更清楚Get-ScheduledTask | ForEach-Object { $act ($_.Actions | ForEach-Object { $($_.Execute) $($_.Arguments) }) -join , $trg ($_.Triggers | ForEach-Object { $_.CimClass.CimClassName }) -join , [PSCustomObject]{ TaskName$_.TaskName; Path$_.TaskPath; State$_.State; User$_.Principal.UserId; Trigger$trg; Action$act } } | Format-Table -AutoSize -Wrap遇到可疑计划任务我建议先用schtasks /change /tn 任务名 /disable禁用而不是直接删除。原因跟处理服务一样——先禁再删防止它立刻触发重新写入。确认整个持久化链路都清理干净后再回过头来删除任务记录。4. 端口与网络连接分析揪出正在外联的“内鬼”4.1 netstat 基础用法先看谁在连谁进程和服务排查解决的是“木马在不在”到底它在干什么还得看网络连接。木马的核心目的往往是外联把数据传出去接收指令或者继续向外扩散。所以任何时候排查木马都不能漏掉端口和网络连接分析。最基础也是最有用的命令就是 netstatnetstat -ano参数含义很直接-a显示所有连接和监听端口-n用数字形式显示地址和端口避免反向解析域名拖慢速度-o显示占用该连接的进程 PID。如果只想看已建立的连接netstat -ano | findstr ESTABLISHED只看监听端口netstat -ano | findstr LISTENING拿到连接列表后我的第一反应是找两个东西一是机器主动向外的连接ESTABLISHED状态远程 IP 不是内网网段二是本机在某个高端口或非常规端口上的监听LISTENING。木马外联通常会采用 HTTPS 常见的 443 端口来混入正常流量但也存在大量使用非标准端口的情况比如6666、7777、4444这类明显非常规的目标端口出现一个就够引起警觉了。netstat 还有个参数-b可以直接显示进程名但它需要管理员权限而且解析速度极慢。我在实际排查里很少用-b都是先用-ano拿到 PID再通过进程列表反向定位这样反应更快也不容易卡死。4.2 端口被占时怎么定位到具体进程遇到“端口被占用”的问题很多人会直接问0.0.0.0:80 被占是不是所有地址的 80 端口都没了吗答案是0.0.0.0 代表监听本机所有 IP 地址只要它被占本机任何网卡上的 80 端口都没法再被其它进程绑定。也就是说无论你后续想监听的是 127.0.0.1:80 还是公网 IP:80都会冲突。定位端口占用者的标准动作是三步走。第一步查端口对应 PIDnetstat -ano | findstr :80注意要把 80 这个端口写好findstr :80很可能会匹配到:8000、:8080这些包含 “80” 的端口所以更精确的做法是用空格把端口围起来或者接findstr :80 再加个空格。第二步用 PID 查对应进程tasklist /fi PID eq 1234第三步如果这个 PID 看起来不像已知进程立刻查路径和命令行Get-CimInstance Win32_Process -Filter ProcessId1234 | Select-Object Name, ExecutablePath, CommandLine在 Windows 上80 端口被占用的常见“元凶”并不一定是木马可能是 IIS 的 World Wide Web Publishing Service、nginx、Apache甚至某些软件的本地服务。所以拿到 PID 后不要直接“杀”先确认它是正常业务还是恶意进程再动手。4.3 识别外联异常与临时阻断单独看某一条连接你很难判断是否异常。我的做法是把外联目标 IP 聚合统计原理很简单一台正常的办公或服务器对外连接的目标应该集中在少数几个已知业务地址如果连接列表里出现了大量分散在不同国家、不同运营商、不同端口的连接或者某一个目标 IP 的连接数量异常多这本身就是强烈信号。PowerShell 可以快速做聚合统计Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -notmatch ^(127\.|10\.|192\.168\.|172\.(1[6-9]|2\d|3[01])\.) } | Group-Object RemoteAddress | Sort-Object Count -Descending | Select-Object -First 20 Count, Name上面这条命令把内网地址过滤掉只统计对外连接。看到某个陌生 IP 连接数量特别多或者目标端口集中在高位端口就先把该连接的 PID 和进程路径记下来。确认某个进程异常外联后在没有拔出网线的条件下可以用 Windows 防火墙临时阻断netsh advfirewall firewall add rule nameblock_out_203_0_113_10 dirout actionblock remoteip203.0.113.10这条命令能单独阻断对特定 IP 的出站连接比直接粗暴禁用网卡要精细得多适合在取证和清理过程中争取时间。不过要明确一点防火墙规则只是临时止血该清理的进程、服务和启动项一个都不能少否则木马换个 IP 又是一条好汉。5. 日志审计与应急处理补充时间线完成清理5.1 事件查看器里最值得看的几类日志网络上有没有异常、进程是不是可疑这些都属于“现场判断”。如果要还原一件事的发生过程——什么时间进来的、通过什么方式进来的、有没有创建账户、有没有安装服务——就要借助 Windows 日志。日志是排查木马时最容易被新手忽视但最富有价值的“时间线”。打开事件查看器我有几个固定的关注点。安全日志里的4624登录成功、4625登录失败、4720创建用户账户、4672分配管理员特权这些事件能帮你判断机器是不是被爆破或者被创建了后门账户。系统日志里的7045安装服务尤其重要如果机器报警时间点附近出现了一条服务安装记录指向的恰好是可疑 exe 路径那整个事件链就闭环了。应用日志里的崩溃记录也值得翻一翻它有时会暴露恶意进程的文件路径。命令行的导出方式同样很快wevtutil qe Security /q:*[System[(EventID4624)]] /f:text /c:50 /rd:true C:\evidence\security_4624.txtPowerShell 更适合做筛选Get-WinEvent -FilterHashtable {LogNameSecurity; Id4624} -MaxEvents 30 | Format-List TimeCreated, Message日志的信息量很大我个人的建议是不要指望日志直接告诉你“这就是木马”而是把日志当作串联现场的时间线。比如某个时间点先出现 4624 登录成功、接着 7045 服务安装、再往后 netstat 里多了异常外联这条链路就是最终判断的有力支撑。5.2 确认感染后的清理顺序清理动作的顺序很重要顺序搞反了很容易前功尽弃。我先说一个反面例子有次我拿到一台中毒机器同事已经用杀毒软件把检测到的木马文件隔离了但重启后业务又异常复查发现计划任务还挂在系统里定时把另外一个副本拉起来。这就是典型只清文件、没清持久化。我的清理顺序固定如下先通过任务管理器或者 PowerShell 结束可疑进程但保留 PID 记录接着到 services.msc 和任务计划程序里停用、禁用可疑服务和任务再清理注册表启动项和启动文件夹最后才把恶意文件从磁盘隔离出来。隔离文件时不要直接删可以先复制到隔离目录再原文件改名确认系统运行正常后再彻底删除。这样既能止损又能保留取证样本。还有一个细节处理完所有持久化项后要再拍一次快照和前面对比。如果可疑进程没有重新出现相关注册表项没有重建才算清理完成。我见过太多“看似处理完、重启后又是原样”的情况根源就是没有做二次对比。5.3 清理之后的加固措施木马能被植入几乎一定有一个前置弱点弱口令、高危漏洞、开放了不必要的端口、用户点了来路不明的程序。所以只清理木马而不加固等于把门重新打开。我每次收尾时都会做几件事。第一修改所有本地账号密码尤其是管理员账号如果机器域环境建议按规范强制下次登录改密。第二关闭不必要的远程管理端口和服务比如不用的 3389、445能通过防火墙限制来源 IP 就尽量限制。第三给系统打补丁尤其是操作系统、浏览器、办公软件的安全更新很多植入事件就是通过已知漏洞进来的。第四如果业务允许把出站方向按白名单控制不允许的端口默认阻断。加固这一步虽然看起来“防患于未然”但如果不做下次登录列表里出现新账户、服务列表里多出可疑服务的场景还会重演。6. 常见问题与排查技巧实录6.1 排查中遇到的高频问题速查整理一份我在实际排查中被问到最多的场景做成速查表方便你遇到类似情况时直接对照参考问题现象排查思路与处理建议进程无法被结束提示“拒绝访问”多数是权限不足或进程受保护。用管理员权限运行任务管理器或用 pskill、Process Explorer 尝试必要时进安全模式操作。services.msc 删除服务失败先停止服务再到HKLM\SYSTEM\CurrentControlSet\Services\删除对应注册表项。系统自带服务不要乱删。清理后木马反复出现说明还残留守护进程、服务或计划任务。回到持久化三件套继续查尤其注意计划任务里每隔几分钟触发一次的项。端口被占用查不到明显进程用netstat -ano找到 PID再用tasklist /fi PID eq PID反向定位。若 PID 查不到可能进程已退出但句柄悬空重启后确认。0.0.0.0:80 被占是不是所有 80 都被占是的。0.0.0.0 监听所有接口后续任何进程都绑不上 80 端口。先查是谁占的再决定终止还是改配置。服务无法启动比如 net start mysql 报错不一定是木马。检查服务名是否正确、依赖服务有没有启动、端口有没有被其它进程占用查看系统日志中对应的错误事件。启动项指向的文件不存在可能是程序启动后自删除或隐藏到更深目录。查看注册表项是否带参数结合进程命令行反向定位真实文件。6.2 几条核心避坑经验第一条经验所有操作前先备份。reg export导出注册表项、Copy 复制可疑文件到隔离目录都是几十秒的事但真的能让你在误操作后全身而退。第二条经验排查期间不要轻易重启。很多异常信息只存在于运行状态里一重启进程、端口、日志的现场就全变了要重启也等到持久化清理完成、二次快照对比之后再考虑。第三条经验不要迷信某个单一工具。杀毒软件也好、Autoruns 也好、Process Explorer 也好各有各的盲区。我见过杀软报不出问题的机器靠手工看日志和进程路径照样揪出了恶意程序也见过杀软频繁误报的正常业务进程靠路径和签名才还了它清白。说白了工具只是辅助判断逻辑才是核心。第四条也是我这些年最深的体会遇到再复杂的木马最后真正起作用的基本盘仍然是最基础的那几条命令和几个目录。能把进程、服务、启动项、计划任务、端口、日志这六块老老实实过一遍的人大概率不会在排查现场毫无头绪。遇到问题别慌按顺序来效率反而最高。
返回列表