
Un module PowerShell dédié à la rétro-ingénierie
Désassemblez du code natif et managé.
Get-CSDisassemblyDésassemble un tableau d'octets en utilisant le framework de désassemblage Capstone Engine.
Get-ILDisassemblyDésassemble un tableau d'octets MSIL brut passé à partir d'un objet MethodInfo d'une manière similaire à celle d'Ildasm.
Outils utiles lors de l'analyse de logiciels malveillants.
New-FunctionDelegateFournit un wrapper exécutable pour une fonction X86 ou X86_64.
Invoke-LoadLibraryCharge une DLL dans le processus PowerShell actuel.
New-DllExportFunctionCrée un délégué wrapper exécutable autour d'une fonction exportée non managée.
Get-HostsFileAnalyse un fichier HOSTS.
New-HostsFileEntryRemplace ou ajoute une entrée à un fichier HOSTS.
Remove-HostsFileEntrySupprime une entrée ou une série d'entrées d'un fichier HOSTS.
Get-AssemblyStringsAffiche toutes les chaînes d'un exécutable .NET.
Get-AssemblyResourcesExtrait les ressources managées d'un assembly .NET
Remove-AssemblySuppressIldasmAttributeSupprime l'attribut SuppressIldasmAttribute d'un assembly .NET.
Get-AssemblyImplementedMethodsRetourne toutes les méthodes d'un assembly qui sont implémentées en MSIL.
Inspectez et analysez la mémoire des processus
Get-ProcessStringsAffiche toutes les chaînes imprimables de la mémoire en mode utilisateur d'un processus.
Get-VirtualMemoryInfoUn wrapper pour kernel32!VirtualQueryEx
Get-ProcessMemoryInfoRécupère les informations de mémoire virtuelle pour chaque ensemble unique de pages en mémoire utilisateur. Cette fonction est similaire à la commande !vadump de WinDbg.
Get-StructFromMemoryMarshale les données d'un bloc de mémoire non managé dans un processus arbitraire vers un objet managé nouvellement alloué du type spécifié.
Analysez les formats de fichiers et les structures en mémoire.
Get-PEUn analyseur PE sur disque et en mémoire et un vidage de processus.
Find-ProcessPEsTrouve les exécutables portables en mémoire, qu'ils aient été chargés de manière légitime ou non.
Get-LibSymbolsAffiche les informations symboliques des fichiers LIB Windows.
Get-ObjDumpAffiche les informations sur les fichiers objet (OBJ) Windows.
Obtenez et analysez les informations de bas niveau du système d'exploitation Windows.
Get-NtSystemInformationUn utilitaire qui appelle et analyse la sortie de la fonction ntdll!NtQuerySystemInformation. Cet utilitaire peut être utilisé pour interroger des informations internes du système d'exploitation qui ne sont généralement pas visibles pour un utilisateur.
Get-PEBRetourne le bloc d'environnement de processus (PEB) d'un processus.
Register-ProcessModuleTraceDémarre une trace des modules de processus chargés
Get-ProcessModuleTraceAffiche les modules de processus qui ont été chargés depuis l'appel à Register-ProcessModuleTrace
Unregister-ProcessModuleTraceArrête la trace des modules de processus en cours
Get-SystemInfoUn wrapper pour kernel32!GetSystemInfo
Fonctions d'assistance diverses
Get-MemberUne fonction proxy utilisée pour étendre l'applet de commande Get-Member intégrée. Elle ajoute le paramètre '-Private' vous permettant d'afficher les membres .NET non publics.
Get-StringsExtrait les chaînes des fichiers en Unicode et en Ascii. Cette applet de commande reproduit la fonctionnalité de strings.exe de Sysinternals.
ConvertTo-StringConvertit les octets d'un fichier en une chaîne qui a un mappage 1 à 1 avec les octets d'origine du fichier. ConvertTo-String est utile pour effectuer des expressions régulières binaires.
Get-EntropyCalcule l'entropie d'un fichier ou d'un tableau d'octets.
Bibliothèques requises par certaines fonctions de rétro-ingénierie.
CapstoneLa liaison C# du moteur de désassemblage Capstone.
De4dotUne puissante bibliothèque de désobfuscation .NET et d'analyse PE .NET.
PSReflectUn module utilisé pour définir facilement des énumérations, des structures et des fonctions Win32 en mémoire.
FormattersFichiers ps1xml utilisés pour formater la sortie de diverses fonctions PowerShellArsenal.
Le module PowerShellArsenal et tous les scripts individuels sont sous la licence BSD 3-Clause sauf indication contraire explicite.
Reportez-vous à l'aide basée sur les commentaires dans chaque script individuel pour des informations détaillées sur l'utilisation.
Pour installer ce module, déposez le dossier entier PowerShellArsenal dans l'un de vos répertoires de modules. Les chemins de modules PowerShell par défaut sont listés dans la variable d'environnement $Env:PSModulePath.
Le chemin de module par utilisateur par défaut est : "$Env:HomeDrive$Env:HOMEPATH\Documents\WindowsPowerShell\Modules" Le chemin de module au niveau de l'ordinateur par défaut est : "$Env:windir\System32\WindowsPowerShell\v1.0\Modules"
Pour utiliser le module, tapez Import-Module PowerShellArsenal
Pour voir les commandes importées, tapez Get-Command -Module PowerShellArsenal
Si vous utilisez PowerShell v3 et que vous souhaitez supprimer l'ennuyeux avertissement 'Voulez-vous vraiment exécuter des scripts téléchargés depuis Internet', une fois que vous avez placé PowerShellArsenal dans votre chemin de modules, exécutez la commande suivante sur une ligne :
$Env:PSModulePath.Split(';') | % { if ( Test-Path (Join-Path $_ PowerShellArsenal) ) {Get-ChildItem $_ -Recurse | Unblock-File} }
Pour obtenir de l'aide sur chaque commande individuelle, Get-Help est votre ami.
Remarque : Les outils contenus dans ce module ont tous été conçus pour pouvoir être exécutés individuellement. Les inclure dans un module contribue simplement à une meilleure portabilité.
Pour tous les contributeurs et futurs contributeurs de PowerShellArsenal, je demande de suivre ce guide de style lors de l'écriture de vos scripts/modules.
Évitez Write-Host à tout prix. Les fonctions/applets de commande PowerShell ne sont pas des utilitaires en ligne de commande ! Les demandes de tirage contenant du code utilisant Write-Host ne seront pas considérées. Vous devez plutôt produire des objets personnalisés. Pour plus d'informations sur la création d'objets personnalisés, lisez ces articles :
Si vous souhaitez afficher des informations de débogage pertinentes à l'écran, utilisez Write-Verbose. L'utilisateur peut toujours ajouter '-Verbose'.
Fournissez toujours une aide descriptive basée sur les commentaires pour chaque script. Assurez-vous également d'inclure votre nom et une licence BSD 3-Clause (sauf circonstances atténuantes empêchant l'application de la licence BSD).
Assurez-vous que toutes les fonctions respectent la convention verbe-nom PowerShell appropriée. Utilisez Get-Verb pour lister les verbes par défaut utilisés par PowerShell. Les exceptions aux verbes pris en charge seront examinées au cas par cas.
Je préfère que les noms de variables soient en majuscules et aussi descriptifs que possible.
Fournissez un espacement logique entre votre code. Indentez votre code pour le rendre plus lisible.
Si vous vous retrouvez à répéter du code, écrivez une fonction.
Attrapez toutes les erreurs anticipées et fournissez une sortie significative. Si vous avez une erreur qui devrait arrêter l'exécution du script, utilisez 'Throw'. Si vous avez une erreur qui n'a pas besoin d'arrêter l'exécution, utilisez Write-Error.
Si vous écrivez un script qui interagit avec l'API Win32, essayez d'éviter de compiler du C# en ligne avec Add-Type. Essayez d'utiliser le module PSReflect, si possible.
N'utilisez pas de chemins codés en dur. Un script doit être utilisable dès sa sortie de la boîte. Personne ne devrait avoir à modifier le code sauf s'il le souhaite.
La compatibilité avec PowerShell v2 est hautement souhaitée.
Utilisez des paramètres positionnels et rendez les paramètres obligatoires lorsque cela a du sens. Par exemple, je recherche quelque chose comme ce qui suit :
[Parameter(Position = 0, Mandatory = $True)]N'utilisez pas d'alias sauf si cela a du sens pour recevoir une entrée de pipeline. Ils rendent le code plus difficile à lire pour les personnes qui ne sont pas familières avec un alias particulier.
Essayez de ne pas laisser les commandes s'étendre trop longtemps. Par exemple, un pipeline est un endroit naturel pour un saut de ligne.
N'abusez pas des commentaires en ligne. Utilisez-les seulement lorsque certains aspects du code pourraient être déroutants pour un lecteur.
Plutôt que d'utiliser Out-Null pour supprimer une sortie indésirable/non pertinente, enregistrez la sortie indésirable dans $null. Cela offre une légère amélioration des performances.
Utilisez des valeurs par défaut pour vos paramètres lorsque cela a du sens. Idéalement, vous voulez un script qui fonctionne sans nécessiter de paramètres.
Indiquez explicitement toutes les dépendances requises et optionnelles dans l'aide basée sur les commentaires de votre fonction. Toutes les dépendances de bibliothèque doivent résider dans le dossier 'Lib'.
Si un script crée des objets personnalisés complexes, incluez un fichier ps1xml qui formatera correctement la sortie de l'objet. Les fichiers ps1xml sont stockés dans Lib\Formatters.