
Un Modulo PowerShell Dedicato al Reverse Engineering
Disassembla codice nativo e gestito.
Get-CSDisassemblyDisassembla un array di byte utilizzando il framework di disassemblaggio Capstone Engine.
Get-ILDisassemblyDisassembla un array di byte MSIL grezzo passato da un oggetto MethodInfo in modo simile a Ildasm.
Strumenti utili durante l'analisi di malware.
New-FunctionDelegateFornisce un wrapper eseguibile per una funzione X86 o X86_64.
Invoke-LoadLibraryCarica una DLL nel processo PowerShell corrente.
New-DllExportFunctionCrea un delegato wrapper eseguibile attorno a una funzione esportata non gestita.
Get-HostsFileAnalizza un file HOSTS.
New-HostsFileEntrySostituisce o aggiunge una voce a un file HOSTS.
Remove-HostsFileEntryRimuove una voce o una serie di voci da un file HOSTS.
Get-AssemblyStringsRestituisce tutte le stringhe da un eseguibile .NET.
Get-AssemblyResourcesEstrae le risorse gestite da un assembly .NET.
Remove-AssemblySuppressIldasmAttributeRimuove un attributo SuppressIldasmAttribute da un assembly .NET.
Get-AssemblyImplementedMethodsRestituisce tutti i metodi in un assembly che sono implementati in MSIL.
Ispeziona e analizza la memoria dei processi
Get-ProcessStringsRestituisce tutte le stringhe stampabili dalla memoria in modalità utente di un processo.
Get-VirtualMemoryInfoUn wrapper per kernel32!VirtualQueryEx
Get-ProcessMemoryInfoRecupera le informazioni sulla memoria virtuale per ogni insieme unico di pagine nella memoria utente. Questa funzione è simile al comando !vadump di WinDbg.
Get-StructFromMemoryMarshaling dei dati da un blocco di memoria non gestito in un processo arbitrario a un oggetto gestito appena allocato del tipo specificato.
Analizza formati di file e strutture in memoria.
Get-PEUn analizzatore PE su disco e in memoria e un dump del processo.
Find-ProcessPEsTrova eseguibili portatili in memoria indipendentemente dal fatto che siano stati caricati in modo legittimo.
Get-LibSymbolsMostra le informazioni simboliche dai file LIB di Windows.
Get-ObjDumpMostra informazioni sui file oggetto (OBJ) di Windows.
Ottieni e analizza informazioni di basso livello del sistema operativo Windows.
Get-NtSystemInformationUn'utilità che chiama e analizza l'output della funzione ntdll!NtQuerySystemInformation. Questa utility può essere utilizzata per interrogare informazioni interne del sistema operativo che normalmente non sono visibili all'utente.
Get-PEBRestituisce il blocco ambiente del processo (PEB) di un processo.
Register-ProcessModuleTraceAvvia una traccia dei moduli del processo caricati
Get-ProcessModuleTraceMostra i moduli del processo che sono stati caricati dalla chiamata a Register-ProcessModuleTrace
Unregister-ProcessModuleTraceFerma la traccia corrente dei moduli del processo
Get-SystemInfoUn wrapper per kernel32!GetSystemInfo
Funzioni helper varie
Get-MemberUna funzione proxy utilizzata per estendere il cmdlet Get-Member integrato. Aggiunge il parametro '-Private' che consente di visualizzare membri .NET non pubblici
Get-StringsEstrae stringhe da file sia in Unicode che in ASCII. Questo cmdlet replica la funzionalità di strings.exe di Sysinternals.
ConvertTo-StringConverte i byte di un file in una stringa che ha una mappatura 1:1 con i byte originali del file. ConvertTo-String è utile per eseguire espressioni regolari binarie.
Get-EntropyCalcola l'entropia di un file o di un array di byte.
Librerie richieste da alcune funzioni di RE.
CapstoneIl binding C# del motore di disassemblaggio Capstone.
De4dotUna potente libreria per la deoffuscazione .NET e l'analisi PE .NET.
PSReflectUn modulo utilizzato per definire facilmente enum, struct e funzioni Win32 in memoria.
FormattersFile ps1xml utilizzati per formattare l'output di varie funzioni di PowerShellArsenal.
Il modulo PowerShellArsenal e tutti gli script individuali sono sotto licenza BSD 3-Clause salvo diversa indicazione esplicita.
Fare riferimento alla guida basata sui commenti in ogni singolo script per informazioni dettagliate sull'utilizzo.
Per installare questo modulo, copiare l'intera cartella PowerShellArsenal in una delle directory dei moduli. I percorsi predefiniti dei moduli PowerShell sono elencati nella variabile d'ambiente $Env:PSModulePath.
Il percorso predefinito per utente è: "$Env:HomeDrive$Env:HOMEPATH\Documents\WindowsPowerShell\Modules" Il percorso predefinito a livello di computer è: "$Env:windir\System32\WindowsPowerShell\v1.0\Modules"
Per utilizzare il modulo, digitare Import-Module PowerShellArsenal
Per vedere i comandi importati, digitare Get-Command -Module PowerShellArsenal
Se si utilizza PowerShell v3 e si desidera rimuovere il fastidioso avviso 'Do you really want to run scripts downloaded from the Internet', una volta inserito PowerShellArsenal nel percorso dei moduli, eseguire il seguente one-liner:
$Env:PSModulePath.Split(';') | % { if ( Test-Path (Join-Path $_ PowerShellArsenal) ) {Get-ChildItem $_ -Recurse | Unblock-File} }
Per aiuto su ogni singolo comando, Get-Help è vostro amico.
Nota: Gli strumenti contenuti in questo modulo sono stati tutti progettati in modo da poter essere eseguiti singolarmente. Includerli in un modulo serve semplicemente ad aumentare la portabilità.
Per tutti i collaboratori e futuri collaboratori di PowerShellArsenal, chiedo di seguire questa guida allo stile quando scrivete i vostri script/moduli.
Evitare Write-Host a tutti i costi. Le funzioni/cmdlet PowerShell non sono utility a riga di comando! Le richieste pull contenenti codice che utilizza Write-Host non verranno considerate. Dovreste invece restituire oggetti personalizzati. Per maggiori informazioni sulla creazione di oggetti personalizzati, leggete questi articoli:
Se si desidera visualizzare informazioni di debug rilevanti sullo schermo, utilizzare Write-Verbose. L'utente può sempre aggiungere '-Verbose'.
Fornire sempre una guida descrittiva basata su commenti per ogni script. Inoltre, assicurarsi di includere il proprio nome e una licenza BSD 3-Clause (salvo circostanze eccezionali che impediscano l'applicazione della licenza BSD).
Assicurarsi che tutte le funzioni seguano la corretta concordanza verbo-sostantivo di PowerShell. Utilizzare Get-Verb per elencare i verbi predefiniti utilizzati da PowerShell. Le eccezioni ai verbi supportati saranno valutate caso per caso.
Preferisco che i nomi delle variabili siano in maiuscolo e il più descrittivi possibile.
Fornire spaziatura logica tra il codice. Indentare il codice per renderlo più leggibile.
Se ci si trova a ripetere codice, scrivere una funzione.
Gestire tutti gli errori previsti e fornire un output significativo. Se si ha un errore che deve interrompere l'esecuzione dello script, utilizzare 'Throw'. Se si ha un errore che non necessita di interrompere l'esecuzione, utilizzare Write-Error.
Se si scrive uno script che interagisce con l'API Win32, cercare di evitare di compilare C# inline con Add-Type. Provare a utilizzare il modulo PSReflect, se possibile.
Non utilizzare percorsi hardcoded. Uno script dovrebbe essere utilizzabile subito. Nessuno dovrebbe dover modificare il codice a meno che non lo voglia.
La compatibilità con PowerShell v2 è fortemente desiderata.
Utilizzare parametri posizionali e rendere i parametri obbligatori quando ha senso. Ad esempio, cerco qualcosa come:
[Parameter(Position = 0, Mandatory = $True)]Non utilizzare alias a meno che non abbia senso per ricevere input dalla pipeline. Rende il codice più difficile da leggere per le persone che non hanno familiarità con un particolare alias.
Cercare di non far durare troppo i comandi. Ad esempio, una pipeline è un posto naturale per un'interruzione di riga.
Non esagerare con i commenti inline. Usarli solo quando alcuni aspetti del codice potrebbero confondere il lettore.
Piuttosto che utilizzare Out-Null per sopprimere output indesiderato/irrilevante, salvare l'output indesiderato in $null. In questo modo si ottiene un leggero miglioramento delle prestazioni.
Utilizzare valori predefiniti per i propri parametri quando ha senso. Idealmente, si vuole uno script che funzioni senza richiedere parametri.
Dichiarare esplicitamente tutte le dipendenze richieste e opzionali nella guida basata sui commenti della propria funzione. Tutte le dipendenze delle librerie devono risiedere nella cartella 'Lib'.
Se uno script crea oggetti personalizzati complessi, includere un file ps1xml che formatti correttamente l'output dell'oggetto. I file ps1xml sono archiviati in Lib\Formatters.