
Ein strace-ähnliches Programm für die Windows 'native' API
Siehe auch http://rogerorr.github.io/NtTrace/
Sie benötigen entweder die 64-Bit- oder die 32-Bit-Version von NtTrace (oder beide), je nachdem, was zu Ihrer(n) Zielanwendung(en) passt.
scripts\build-vs-x64.bat oder scripts\build-vs-x86.bat aus, um die 64-Bit- bzw. 32-Bit-Version zu erstellen.oder
nmake /f NtTrace.mak ausoder
nmake /f NtTrace.mak ausNtTrace ist für die Ausführung über die Befehlszeile konzipiert.
Es kann verwendet werden, um ein Programm mit Argumenten auszuführen, falls erforderlich.
Zum Beispiel:
NtTrace -filter File cmd /c echo hello
oder um einen bestehenden Prozess per PID oder (mit der Option -a) per Name anzuhängen.
Zum Beispiel:
NtTrace 1234
oder
NtTrace -a notepad
Führen Sie NtTrace -h aus, um eine vollständige Liste der Optionen zu erhalten.
Standardmäßig zielt NtTrace auf die Windows Native API ab, die über NtDll.dll bereitgestellt wird.
Es werden auch Konfigurationsdateien für viele der Einstiegspunkte bereitgestellt, die die Windows-Grafikoberfläche unterstützen:
Gdi32Trace.cfg für die Graphics Device Interface (GDI)
User32Trace.cfg für die User Interface
Sie können eine dieser Dateien anstelle der Standarddatei NtTrace.cfg auswählen, indem Sie das Befehlszeilenargument -config verwenden.
Windows enthält standardmäßig die DbgHelp.dll im system32-Verzeichnis. Neuere Versionen dieser DLL sind jedoch manchmal von Microsoft in ihren SDKs erhältlich.
Die mit dem Betriebssystem installierte Version der DLL hat tendenziell Vorrang vor einer neueren Version, die möglicherweise heruntergeladen wurde.
Wenn Sie eine neuere Version als die im Systemverzeichnis installierte benötigen, können Sie einfach eine Kopie der neueren DbgHelp.dll in dasselbe Verzeichnis wie NtTrace.exe legen.
(Sie müssen auch SymSrv.dll und SrcSrv.dll kopieren)
NtTrace nutzt die Windows-Debug-Schnittstelle, um Breakpoints in NtDll rund um die nativen Windows-Aufrufe in den Kernel zu setzen. Jedes Mal, wenn ein Breakpoint ausgelöst wird, liest NtTrace die an den zugehörigen Aufruf übergebenen Argumente/von ihm zurückgegebenen Werte.
Es arbeitet auf Benutzerebene und wirkt sich nur auf den spezifischen Prozess (und seine untergeordneten Prozesse) aus. Es wird nicht versucht, in den Kernel einzudringen. Dies war eine bewusste Designentscheidung, da das Tool dadurch ohne Administratorrechte oder Berechtigung zur Installation von Gerätetreibern verwendet werden kann. Dies bedeutet jedoch auch, dass das Tool Folgendes nicht erfasst:
NtTrace verfolgt standardmäßig auch untergeordnete Prozesse des gestarteten Anfangsprozesses. Die Option -pid fügt jeder Ausgabezeile die Prozess-ID hinzu, um zu identifizieren, welcher Prozess welche Aufrufe getätigt hat. Die Option -only unterdrückt die Verfolgung von untergeordneten Prozessen.
Es behandelt auch Multithread-Anwendungen (und die Option -tid hilft dabei, zu identifizieren, welcher Thread welchen Aufruf tätigt).
Beachten Sie jedoch, dass die Ablaufverfolgung serialisiert wird, wenn mehrere Threads gleichzeitig Aufrufe tätigen, da die Windows-Debug-Schnittstelle ereignisbasiert ist.
Standardmäßig werden die Aufrufe in NtDll verfolgt; die Konfigurationsdateien für Gdi32 und User32 wählen eine andere Ziel-DLL aus. NtTrace unterstützt derzeit nicht die gleichzeitige Verfolgung verschiedener Arten von Systemaufrufen.
Die Konfiguration für die nativen Aufrufe befindet sich in NtTrace.cfg, und diese Datei wird beim Programmstart analysiert. Beachten Sie, dass verschiedene Windows-Versionen unterschiedliche Aufrufsätze unterstützen.
Einige der nativen Funktionen werden von Microsoft offiziell dokumentiert, viele sind jedoch undokumentiert. Die (fast) vollständige Liste wurde durch eine Kombination aus Detektivarbeit an den Funktionen und von Websites wie ReactOS ermittelt.
Jede Funktion ist einer Kategorie zugeordnet, und die Filterung kann nach Funktionsnamen (Teilübereinstimmung) und Funktionskategorie erfolgen.
Standardmäßig verfolgt NtTrace die Rückkehr vom Systemaufruf, aber die Option -pre kann auch verwendet werden, um vor dem Aufruf zu verfolgen.
Dies kann nützlich sein, wenn beispielsweise dieselbe Struktur für einen Anforderungs- und einen Antwortpuffer verwendet wird.