
Модуль PowerShell, посвящённый реверс-инжинирингу
Дизассемблирование нативного и управляемого кода.
Get-CSDisassemblyДизассемблирует массив байтов с помощью фреймворка дизассемблирования Capstone Engine.
Get-ILDisassemblyДизассемблирует необработанный массив байтов MSIL, полученный из объекта MethodInfo, аналогично Ildasm.
Полезные инструменты при анализе вредоносного ПО.
New-FunctionDelegateПредоставляет исполняемую обёртку для функции X86 или X86_64.
Invoke-LoadLibraryЗагружает DLL в текущий процесс PowerShell.
New-DllExportFunctionСоздаёт делегат-обёртку для экспортируемой неуправляемой функции.
Get-HostsFileРазбирает файл HOSTS.
New-HostsFileEntryЗаменяет или добавляет запись в файл HOSTS.
Remove-HostsFileEntryУдаляет запись или серию записей из файла HOSTS.
Get-AssemblyStringsВыводит все строки из .NET-исполняемого файла.
Get-AssemblyResourcesИзвлекает управляемые ресурсы из .NET-сборки.
Remove-AssemblySuppressIldasmAttributeУдаляет атрибут SuppressIldasmAttribute из .NET-сборки.
Get-AssemblyImplementedMethodsВозвращает все методы в сборке, реализованные в MSIL.
Просмотр и анализ памяти процессов.
Get-ProcessStringsВыводит все печатаемые строки из пользовательской памяти процесса.
Get-VirtualMemoryInfoОбёртка для kernel32!VirtualQueryEx.
Get-ProcessMemoryInfoПолучает информацию о виртуальной памяти для каждого уникального набора страниц в пользовательской памяти. Эта функция аналогична команде !vadump в WinDbg.
Get-StructFromMemoryМаршалирует данные из неуправляемого блока памяти в произвольном процессе в управляемый объект указанного типа.
Разбор форматов файлов и структур в памяти.
Get-PEПарсер PE-файлов на диске и в памяти, а также дампер процессов.
Find-ProcessPEsНаходит переносимые исполняемые файлы в памяти независимо от того, были ли они загружены легитимным способом.
Get-LibSymbolsОтображает символьную информацию из LIB-файлов Windows.
Get-ObjDumpОтображает информацию о объектных (OBJ) файлах Windows.
Получение и анализ низкоуровневой информации об ОС Windows.
Get-NtSystemInformationУтилита, вызывающая и анализирующая вывод функции ntdll!NtQuerySystemInformation. Эта утилита может использоваться для запроса внутренней информации ОС, которая обычно не видна пользователю.
Get-PEBВозвращает блок окружения процесса (PEB) процесса.
Register-ProcessModuleTraceЗапускает трассировку загруженных модулей процесса.
Get-ProcessModuleTraceОтображает модули процесса, загруженные с момента вызова Register-ProcessModuleTrace.
Unregister-ProcessModuleTraceОстанавливает выполняющуюся трассировку модулей процесса.
Get-SystemInfoОбёртка для kernel32!GetSystemInfo.
Различные вспомогательные функции.
Get-MemberПрокси-функция для расширения встроенного командлета Get-Member. Добавляет параметр '-Private', позволяющий отображать непубличные члены .NET.
Get-StringsИзвлекает строки из файлов в кодировках Unicode и ASCII. Этот командлет повторяет функциональность strings.exe из Sysinternals.
ConvertTo-StringПреобразует байты файла в строку с взаимно однозначным отображением обратно в исходные байты. ConvertTo-String полезен для выполнения бинарных регулярных выражений.
Get-EntropyВычисляет энтропию файла или массива байтов.
Библиотеки, необходимые для некоторых функций реверс-инжиниринга.
CapstoneПривязка C# к фреймворку дизассемблирования Capstone.
De4dotМощная библиотека для деобфускации .NET и разбора .NET PE.
PSReflectМодуль для простого определения перечислений, структур и функций Win32 в памяти.
FormattersФайлы ps1xml, используемые для форматирования вывода различных функций PowerShellArsenal.
Модуль PowerShellArsenal и все отдельные скрипты распространяются по лицензии BSD 3-Clause, если явно не указано иное.
Подробную информацию об использовании см. в комментариях-справке в каждом отдельном скрипте.
Чтобы установить этот модуль, поместите всю папку PowerShellArsenal в один из каталогов модулей. Пути к модулям PowerShell по умолчанию указаны в переменной среды $Env:PSModulePath.
Путь к модулю для текущего пользователя по умолчанию: "$Env:HomeDrive$Env:HOMEPATH\Documents\WindowsPowerShell\Modules" Путь к модулю на уровне компьютера по умолчанию: "$Env:windir\System32\WindowsPowerShell\v1.0\Modules"
Чтобы использовать модуль, введите Import-Module PowerShellArsenal
Чтобы увидеть импортированные команды, введите Get-Command -Module PowerShellArsenal
Если вы используете PowerShell v3 и хотите отключить назойливое предупреждение «Вы действительно хотите запускать скрипты, загруженные из Интернета?», после того как вы поместили PowerShellArsenal в путь к модулям, выполните следующий однострочник:
$Env:PSModulePath.Split(';') | % { if ( Test-Path (Join-Path $_ PowerShellArsenal) ) {Get-ChildItem $_ -Recurse | Unblock-File} }
Для справки по каждой отдельной команде используйте Get-Help.
Примечание: все инструменты в этом модуле спроектированы так, чтобы их можно было запускать по отдельности. Включение их в модуль просто повышает переносимость.
Для всех участников и будущих участников PowerShellArsenal: прошу вас следовать этому руководству при написании скриптов/модулей.
Избегайте использования Write-Host любой ценой. Функции/командлеты PowerShell — это не утилиты командной строки! Запросы на включение кода, использующего Write-Host, рассматриваться не будут. Вместо этого следует выводить пользовательские объекты. Дополнительную информацию о создании пользовательских объектов можно найти в этих статьях:
Если вы хотите отобразить на экране соответствующую отладочную информацию, используйте Write-Verbose. Пользователь всегда может добавить '-Verbose'.
Всегда предоставляйте описательную комментарий-справку для каждого скрипта. Также обязательно укажите своё имя и лицензию BSD 3-Clause (если нет исключительных обстоятельств, препятствующих применению лицензии BSD).
Убедитесь, что все функции следуют правильному соглашению «глагол-существительное» в PowerShell. Используйте Get-Verb для вывода списка глаголов по умолчанию. Исключения из поддерживаемых глаголов будут рассматриваться индивидуально.
Я предпочитаю, чтобы имена переменных были написаны с заглавной буквы и были максимально описательными.
Оставляйте логические пробелы между частями кода. Делайте отступы, чтобы код был более читабельным.
Если вы замечаете, что повторяете код, напишите функцию.
Перехватывайте все ожидаемые ошибки и выдавайте осмысленный вывод. Если ошибка должна остановить выполнение скрипта, используйте 'Throw'. Если ошибка не требует остановки выполнения, используйте Write-Error.
Если вы пишете скрипт, который взаимодействует с Win32 API, старайтесь избегать компиляции C# встроенными средствами с помощью Add-Type. По возможности используйте модуль PSReflect.
Не используйте жёстко заданные пути. Скрипт должен быть работоспособным «из коробки». Никто не должен изменять код, если только он сам этого не хочет.
Высоко желательна совместимость с PowerShell v2.
Используйте позиционные параметры и делайте параметры обязательными, когда это имеет смысл. Например, я ожидаю нечто подобное:
[Parameter(Position = 0, Mandatory = $True)]Не используйте псевдонимы, если только это не имеет смысла для получения входных данных из конвейера. Они делают код более сложным для чтения тем, кто не знаком с конкретным псевдонимом.
Старайтесь не делать команды слишком длинными. Например, конвейер — естественное место для разрыва строки.
Не злоупотребляйте встроенными комментариями. Используйте их только тогда, когда некоторые аспекты кода могут быть непонятны читателю.
Вместо использования Out-Null для подавления нежелательного/нерелевантного вывода сохраняйте его в $null. Это даёт небольшой прирост производительности.
Используйте значения по умолчанию для параметров, когда это имеет смысл. В идеале скрипт должен работать без указания параметров.
Явно указывайте все обязательные и необязательные зависимости в комментарий-справке вашей функции. Все зависимости библиотек должны находиться в папке 'Lib'.
Если скрипт создаёт сложные пользовательские объекты, включите файл ps1xml, который правильно отформатирует вывод объекта. Файлы ps1xml хранятся в папке Lib\Formatters.