Metodă scriptată pentru a găsi și a ucide procesul folosind un dll specific (Programare, Windows, Sysinternals)

Wombat învins a intrebat.

Am nevoie de ajutorul vostru pentru a realiza un script care să fie folosit pentru a atenua simptomele unei probleme în timp ce săpăm în ea și găsim cauza.

Descrierea problemei: Avem o problemă în care un dll se blochează și acest lucru oprește IIS să gestioneze cererile. Există câteva dll-uri care ar putea fi problema. Le-am cartografiat ca excepții pentru Windows Defender, dar problema continuă să apară.

Putem detecta problema scriind un script care să acceseze periodic site-ul web, care va bloca dacă problema se întâmplă.

Acest lucru se întâmplă pe Windows 2016 Server.

Cerință: În mod clar este nevoie de o soluție pe termen lung și lucrăm la acest lucru. În timp ce găsim această soluție, căutăm o modalitate de a găsi procesul care utilizează un dll și de a ucide acel proces.

SysInternals ProcessExplorer poate identifica procesul care accesează un fișier dll (aceasta este funcția binoclu). Și odată ce știm care este procesul, atunci putem, de asemenea, să ucidem acel proces în ProcessExplorer.

Soluția ideală ar fi un script care să caute procesele care utilizează un nume dll specificat și apoi să le ucidă. Cred că putem folosi utilitățile din linia de comandă a sysinternals, dar nu știu de unde să începem.

Note: Ideal ar fi să rezolvăm problema, dar aceasta este în curs de desfășurare, așa că dorim să atenuăm simptomele. Unii dintre voi vor sugera poate rezolvarea problemei și dacă aveți o soluție atunci trimiteți-o. Între timp, iată câteva întrebări care ar putea fi puse… Care este cauza problemei – dacă am ști asta…! Problema pare să apară după ce se execută actualizarea semnăturii Windows Defender. Se „simte” ca și cum atunci când Windows Defender repornește pentru a încărca noile semnături de amenințare, dll-ul care se află în memorie este cumva văzut ca o amenințare. Ar putea fi o amenințare de bună credință – nu, deoarece am scanat-o manual și a ieșit curată.

1 răspunsuri
HelpingHand

Ai putea să folosești PowerShell. Aici este un început.

Note:

  • Nu efectuează nicio verificare pentru a vedea dacă procesul a fost încheiat.
  • Folosește PID-ul pentru a emite terminarea, deoarece ar fi mai sigur decât numele procesului.
  • Folosește calea completă către modul pentru a face detecția mai precisă.
  • În mod implicit, codul nu ucide procesul, modificați variabila KillIt la $true odată ce sunteți mulțumit.

Ar fi util ca acest concept general să identifice procesele pentru dumneavoastră, iar opțiunea implicită de oprire a procesului să funcționeze pentru procesul (procesele) în cauză:

$ModulePathToFind = "C:\Windows\System32\msxml6.dll"    
$KillIt           = $false

foreach ($p in Get-Process)
{
    foreach ($m in $p.modules)
    {
        if ( $m.FileName -match $ModulePathToFind)
        {
            write-host "Found:" $m.FileName "in" $p.Name "ID:" $p.id

            if ($KillIt)
            {
                write-host "In 'Kill' mode."
                Stop-Process -Id $p.id -Force
            }
            else
            {
                write-host "Not in 'Kill' mode."
            }
        }
    }
}