
Ein PowerShell-Modul, das sich dem Reverse Engineering widmet.
Nativen und verwalteten Code disassemblieren.
Get-CSDisassemblyDisassembliert ein Byte-Array mithilfe des Capstone-Engine-Disassembly-Frameworks.
Get-ILDisassemblyDisassembliert ein rohes MSIL-Byte-Array, das von einem MethodInfo-Objekt übergeben wird, auf ähnliche Weise wie Ildasm.
Nützliche Werkzeuge für die Malware-Analyse.
New-FunctionDelegateStellt einen ausführbaren Wrapper für eine X86- oder X86_64-Funktion bereit.
Invoke-LoadLibraryLädt eine DLL in den aktuellen PowerShell-Prozess.
New-DllExportFunctionErstellt einen ausführbaren Wrapper-Delegaten um eine nicht verwaltete, exportierte Funktion.
Get-HostsFileParst eine HOSTS-Datei.
New-HostsFileEntryErsetzt oder fügt einen Eintrag in eine HOSTS-Datei ein.
Remove-HostsFileEntryEntfernt einen oder mehrere Einträge aus einer HOSTS-Datei.
Get-AssemblyStringsGibt alle Zeichenfolgen aus einer .NET-ausführbaren Datei aus.
Get-AssemblyResourcesExtrahiert verwaltete Ressourcen aus einer .NET-Assembly
Remove-AssemblySuppressIldasmAttributeEntfernt ein SuppressIldasmAttribute-Attribut aus einer .NET-Assembly.
Get-AssemblyImplementedMethodsGibt alle Methoden in einer Assembly zurück, die in MSIL implementiert sind.
Prozessspeicher untersuchen und analysieren
Get-ProcessStringsGibt alle druckbaren Zeichenfolgen aus dem Benutzermodus-Speicher eines Prozesses aus.
Get-VirtualMemoryInfoEin Wrapper für kernel32!VirtualQueryEx
Get-ProcessMemoryInfoRuft Informationen zum virtuellen Speicher für jeden eindeutigen Satz von Seiten im Benutzerspeicher ab. Diese Funktion ähnelt dem !vadump-Befehl von WinDbg.
Get-StructFromMemoryMarschallt Daten aus einem nicht verwalteten Speicherblock in einem beliebigen Prozess zu einem neu zugewiesenen verwalteten Objekt des angegebenen Typs.
Dateiformate und In-Memory-Strukturen parsen.
Get-PEEin PE-Parser und Prozess-Dumper für Festplatte und Arbeitsspeicher.
Find-ProcessPEsFindet portable ausführbare Dateien im Speicher, unabhängig davon, ob sie auf legitime Weise geladen wurden.
Get-LibSymbolsZeigt symbolische Informationen aus Windows-LIB-Dateien an.
Get-ObjDumpZeigt Informationen über Windows-Objektdateien (OBJ) an.
Niedrige Windows-Betriebssysteminformationen abrufen und analysieren.
Get-NtSystemInformationEin Dienstprogramm, das die Ausgabe der Funktion ntdll!NtQuerySystemInformation aufruft und parst. Dieses Dienstprogramm kann verwendet werden, um interne Betriebssysteminformationen abzufragen, die einem Benutzer normalerweise nicht angezeigt werden.
Get-PEBGibt den Prozess-Umgebungsblock (PEB) eines Prozesses zurück.
Register-ProcessModuleTraceStartet eine Ablaufverfolgung geladener Prozessmodule
Get-ProcessModuleTraceZeigt die seit dem Aufruf von Register-ProcessModuleTrace geladenen Prozessmodule an
Unregister-ProcessModuleTraceBeendet die laufende Ablaufverfolgung von Prozessmodulen
Get-SystemInfoEin Wrapper für kernel32!GetSystemInfo
Verschiedene Hilfsfunktionen
Get-MemberEine Proxy-Funktion zur Erweiterung des integrierten Get-Member-Cmdlets. Es fügt den Parameter '-Private' hinzu, mit dem nicht öffentliche .NET-Member angezeigt werden können.
Get-StringsGibt Zeichenfolgen aus Dateien sowohl in Unicode als auch in ASCII aus. Dieses Cmdlet repliziert die Funktionalität von strings.exe von Sysinternals.
ConvertTo-StringKonvertiert die Bytes einer Datei in eine Zeichenfolge, die eine 1:1-Zuordnung zu den ursprünglichen Bytes der Datei aufweist. ConvertTo-String ist nützlich für die Durchführung binärer regulärer Ausdrücke.
Get-EntropyBerechnet die Entropie einer Datei oder eines Byte-Arrays.
Bibliotheken, die von einigen der RE-Funktionen benötigt werden.
CapstoneDie C#-Bindung der Capstone-Disassemblierungs-Engine.
De4dotEine leistungsstarke Bibliothek zur .NET-Entschleierung und zum Parsen von .NET-PE-Dateien.
PSReflectEin Modul, das verwendet wird, um problemlos Enums, Strukturen und Win32-Funktionen im Speicher zu definieren.
Formattersps1xml-Dateien, die verwendet werden, um die Ausgabe verschiedener PowerShellArsenal-Funktionen zu formatieren.
Das PowerShellArsenal-Modul und alle einzelnen Skripte stehen unter der BSD 3-Clause-Lizenz, sofern nicht ausdrücklich anders angegeben.
Ausführliche Informationen zur Verwendung finden Sie in der kommentarbasierten Hilfe der einzelnen Skripte.
Um dieses Modul zu installieren, kopieren Sie den gesamten Ordner PowerShellArsenal in eines Ihrer Modulverzeichnisse. Die standardmäßigen PowerShell-Modulpfade sind in der Umgebungsvariable $Env:PSModulePath aufgeführt.
Der standardmäßige benutzerspezifische Modulpfad ist: "$Env:HomeDrive$Env:HOMEPATH\Documents\WindowsPowerShell\Modules" Der standardmäßige computerweite Modulpfad ist: "$Env:windir\System32\WindowsPowerShell\v1.0\Modules"
Um das Modul zu verwenden, geben Sie Import-Module PowerShellArsenal ein.
Um die importierten Befehle anzuzeigen, geben Sie Get-Command -Module PowerShellArsenal ein.
Wenn Sie PowerShell v3 ausführen und die lästige Warnung 'Möchten Sie wirklich Skripte ausführen, die aus dem Internet heruntergeladen wurden?' entfernen möchten, führen Sie nach dem Platzieren von PowerShellArsenal in Ihrem Modulpfad den folgenden Einzeiler aus:
$Env:PSModulePath.Split(';') | % { if ( Test-Path (Join-Path $_ PowerShellArsenal) ) {Get-ChildItem $_ -Recurse | Unblock-File} }
Für Hilfe zu jedem einzelnen Befehl ist Get-Help Ihr Freund.
Hinweis: Die in diesem Modul enthaltenen Werkzeuge wurden alle so konzipiert, dass sie einzeln ausgeführt werden können. Die Aufnahme in ein Modul dient lediglich der erhöhten Portabilität.
Für alle Mitwirkenden und zukünftigen Mitwirkenden von PowerShellArsenal bitte ich Sie, diese Stilrichtlinie beim Schreiben Ihrer Skripte/Module zu befolgen.
Vermeiden Sie Write-Host um jeden Preis. PowerShell-Funktionen/-Cmdlets sind keine Befehlszeilenprogramme! Pull-Requests, die Code enthalten, der Write-Host verwendet, werden nicht berücksichtigt. Stattdessen sollten Sie benutzerdefinierte Objekte ausgeben. Weitere Informationen zum Erstellen benutzerdefinierter Objekte finden Sie in diesen Artikeln:
Wenn Sie relevante Debug-Informationen auf dem Bildschirm anzeigen möchten, verwenden Sie Write-Verbose. Der Benutzer kann einfach '-Verbose' anhängen.
Geben Sie für jedes Skript immer eine beschreibende, kommentarbasierte Hilfe an. Stellen Sie außerdem sicher, dass Sie Ihren Namen und eine BSD 3-Clause-Lizenz einfügen (es sei denn, es liegen außergewöhnliche Umstände vor, die die Anwendung der BSD-Lizenz verhindern).
Stellen Sie sicher, dass alle Funktionen der richtigen PowerShell-Verb-Noun-Konvention folgen. Verwenden Sie Get-Verb, um die von PowerShell verwendeten Standardverben aufzulisten. Ausnahmen von den unterstützten Verben werden von Fall zu Fall geprüft.
Ich bevorzuge, dass Variablennamen großgeschrieben und so beschreibend wie möglich sind.
Sorgen Sie für logische Abstände zwischen Ihrem Code. Rücken Sie Ihren Code ein, um ihn lesbarer zu machen.
Wenn Sie feststellen, dass Sie Code wiederholen, schreiben Sie eine Funktion.
Fangen Sie alle vorhersehbaren Fehler ab und geben Sie aussagekräftige Ausgaben aus. Wenn ein Fehler die Ausführung des Skripts stoppen soll, verwenden Sie 'Throw'. Wenn ein Fehler die Ausführung nicht stoppen muss, verwenden Sie Write-Error.
Wenn Sie ein Skript schreiben, das mit der Win32-API interagiert, versuchen Sie, das Inline-Kompilieren von C# mit Add-Type zu vermeiden. Verwenden Sie nach Möglichkeit das PSReflect-Modul.
Verwenden Sie keine hartcodierten Pfade. Ein Skript sollte sofort einsatzbereit sein. Niemand sollte den Code ändern müssen, es sei denn, er möchte es.
PowerShell v2-Kompatibilität ist sehr erwünscht.
Verwenden Sie Positionsparameter und machen Sie Parameter obligatorisch, wenn es sinnvoll ist. Zum Beispiel suche ich nach etwas wie:
[Parameter(Position = 0, Mandatory = $True)]Verwenden Sie keine Aliase, es sei denn, sie sind für den Empfang von Pipeline-Eingaben sinnvoll. Sie erschweren das Lesen des Codes für Personen, die mit einem bestimmten Alias nicht vertraut sind.
Versuchen Sie, Befehle nicht zu lang laufen zu lassen. Eine Pipeline ist beispielsweise ein natürlicher Ort für einen Zeilenumbruch.
Übertreiben Sie es nicht mit Inline-Kommentaren. Verwenden Sie sie nur, wenn bestimmte Aspekte des Codes für den Leser verwirrend sein könnten.
Anstatt Out-Null zu verwenden, um unerwünschte/irrelevante Ausgaben zu unterdrücken, speichern Sie die unerwünschte Ausgabe in $null. Dies bietet eine leichte Leistungssteigerung.
Verwenden Sie Standardwerte für Ihre Parameter, wenn es sinnvoll ist. Idealerweise möchten Sie ein Skript, das ohne Angabe von Parametern funktioniert.
Geben Sie in der kommentarbasierten Hilfe Ihrer Funktion explizit alle erforderlichen und optionalen Abhängigkeiten an. Alle Bibliotheksabhängigkeiten sollten im Ordner 'Lib' abgelegt werden.
Wenn ein Skript komplexe benutzerdefinierte Objekte erstellt, fügen Sie eine ps1xml-Datei ein, die die Ausgabe des Objekts korrekt formatiert. ps1xml-Dateien werden in Lib\Formatters gespeichert.