2009-05-14 7 views
31

Ich möchte bestimmte Systemaufrufe überwachen können, die von einem Prozess ausgeführt werden, hauptsächlich Datei-E/A-Aufrufe. Unter Linux kann ich wahrscheinlich mit geeigneten Parametern strace verwenden, aber wie kann ich das unter Windows machen?Überwachung bestimmter Systemaufrufe, die von einem Prozess in Windows ausgeführt werden

Ich bin in erster Linie daran interessiert, einen Prozess auszuführen und herauszufinden, welche Dateien er gelesen und geschrieben hat.

EDIT: Ich möchte dies programmgesteuert von einem anderen Prozess aus tun. Ich kenne ProcessMonitor, möchte aber die Daten in einer Form erhalten, die ich zur weiteren Analyse in ein anderes Programm importieren kann.

EDIT: Wenn ich meine Anforderungen noch weiter eingrenzen, ist es wahrscheinlich genug, um Aufrufe von CreateFile() zu überwachen. Ich bin wirklich nur daran interessiert, welche Dateien geöffnet sind und ob sie zum Lesen/Schreiben geöffnet sind oder nur gelesen werden. Eine weitere Anforderung, die ich nicht wirklich angegeben habe, ist, dass Geschwindigkeit ziemlich wichtig ist; Ich plante, dies für Dinge wie das Kompilieren einer C++ - Datei zu tun, und das Hochziehen einer vollständigen GUI, die eine 20MB Logdatei erzeugt, wird einen übermäßigen Aufwand haben.

EDIT: Es wäre auch nett, wenn es keine Administratorrechte erfordern würde.

+0

Interessant. Gibt es etwas Ähnliches wie Linux ptrace syscall in Windows? Alle Antworten beziehen sich auf die Verwendung anderer Programme, aber mit etwas wie ptrace() könnten Sie es selbst machen. – ktulur

+1

Falls Sie an einem anderen Ansatz interessiert sind, habe ich nach einem Windows-Pendant zu ptrace gefragt: http://stackoverflow.com/questions/865106/is-there-something-like-linux-ptrace-syscall-in- Windows – ktulur

Antwort

22

Es gibt mehrere Optionen unter Windows.

Windows Performance Toolkit kann verwendet werden, um die Verfolgung verschiedener Systemereignisse, einschließlich Datei-E/A, zu aktivieren, und enthält Tools zur Verarbeitung und Anzeige dieser Ereignisse. Sie können xperf verwenden, um verschiedene Ereignisklassen zu verfolgen und in einer ETL-Datei zu speichern, die Sie später mit denselben Tools bearbeiten oder anzeigen können.

Process Monitor von SysInternals ist eine weitere, sehr einfach zu bedienende Option und ermöglicht es Ihnen, schnell alle Datei- und Registrierungszugriffe zu sehen, die ein Prozess auf dem System macht. http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx zeigt auch, wie Process Monitor automatisch ausgeführt wird.

Wenn Sie dies vollständig programmgesteuert durchführen möchten, können Sie die ETW-Funktionen (StartTrace, EnableTrace usw.) verwenden, um Datei-E/A-Ereignisse zu speichern und in einer ETL-Datei zu speichern. Beispielcode here.

+0

Danke, ich werde in WPT schauen. Hat ProcessMonitor Unterstützung für das Ausführen ohne GUI? – JesperE

+0

Aktualisierte Antwort mit einem Link, der zeigt, wie der Prozessmonitor automatisiert wird. – Michael

+0

Gibt es eine Möglichkeit, den xperf-Werkzeugsatz zu bekommen, ohne ein riesiges 1.3GB (!) ISO-Image herunterzuladen? – JesperE

5

Unter Windows können Sie process monitor verwenden, um die Prozessaktivität (io und Registrierung) zu überwachen. Ich denke, das passt zu Ihrem Bedarf, wenn Sie die Systemaufrufe nicht wirklich kennen wollen.

Und Sie können winapioverride32 verwenden, um API-Anrufe zu überwachen.

2

Vielleicht FileMon?

Es gibt auch NtTrace, ähnlich wie strace.

+1

Process Monitor ist der Nachfolger von FileMon. Die SysInternals-Benutzer haben FileMon & RegMon zu Process Monitor zusammengeführt. – Michael

+0

NtTrace schlägt auf meinem Vista x64 mit vielen "Kann nicht Trap ... falsche Signatur". Es wurde jedoch seit 2007 nicht aktualisiert. – JesperE

-4

Wie hat niemand strace erwähnt? Beispiel Ausgabe:

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 
fcntl64(3, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
getdents64(3, /* 18 entries */, 4096) = 496 
getdents64(3, /* 0 entries */, 4096) = 0 
close(3)        = 0 
fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000 
write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA
+6

Die Frage lautet: "Unter Linux kann ich wahrscheinlich mit strace entkommen" ... – RichieHindle

+0

Oh oops :) habe das nicht gesehen –

+0

@matt sowieso, es gibt [strace in cygwin] (http://cygwin.com/cygwin -ug-net/using-utils.html). – artistoex

2

Ein anderer Weg ist Deviare API Hook ein Intercept alle Benutzer-Modus-System verwenden Anrufe, die Sie wollen. Mit diesem Framework können Sie einen generischen Handler für alle Aufrufe codieren, da die Parameter über COM-Schnittstellen gelesen werden können (z. B. ist jeder Parameter ein INktParam und Sie können den Wert mit INktParam.Value abrufen).

Eine andere Alternative, aber es wird etwas Geld kosten, ist SpyStudio von der gleichen Firma zu verwenden. Dieses Produkt verfügt über eine Befehlszeilenoption, die zum Sammeln von Protokollen ohne GUI nützlich ist.