Artikler / PowerShell

Konverter dit PowerShell modul til en .NET assembly (DLL)

Har du nogle gange ønsket at kunne skjule din PowerShell kode fra andre? Det kan du med PS Protector. Nemt og hurtigt er din kode kompilet.

Når man udvikler et modul i PowerShell, bør løsningen (så vidt muligt) frigives som open-source. Microsoft gør selv en stor indsats i at udvikle og dele deres PowerShell moduler til os IT-professionelle.

Nogle gange kan det være nødvendigt at slører koden i dit PowerShell modul. Dette kan være nødvendigt hvis du f.eks. sælger din kode videre til betalende kunder, eller koden kun er beregnet til internt brug og andre ikke skal få fingrene i det.

Fordi PowerShell er beregnet til at være et open-source sprog, er der ingen indbygget funktioner til at skjule eller konvertere din kode så den skjules eller beskyttes. Det er her PS Protector kommer til undsætning!

PS Protector er et værktøj der gør det nemt at konvertere dit PowerShell modul (.psm) til en DLL-fil (dynamic-link library assembly). Programmet er udviklet af den schweiziske udvikler Stefan Soller. Lad os komme igang med at bruge værktøjet!

PowerShell modul

Lad os begynde med at lave en simpel PowerShell funktion som vi kan bruge som eksempel. Følgende funktion returnere hvornår en computer sidst blev tændt (last boot up time).

Function Get-LastBootUpTime
{
    $LastBootUpTime = Get-CimInstance -ClassName win32_operatingsystem;
    Return [datetime]($LastBootUpTime.LastBootUpTime);
}
Export-ModuleMember -Function *

Overstående PowerShell kode gemmer vi i filen “MyPowerShellModule.psm1” på skrivebordet.

Hent PS Protector

PS Protector koster pt. 49€ (euro) pr. år, i denne guide bruger vi prøveprogrammet. Begrænsningen i prøveprogrammet er at PowerShell modulet ikke må være på mere end 200 tegn.

Hent programmet her. Programmet fylder i alt 350 KB, og består af 2 filer:

  • PS Protector.exe
  • PS Protector.exe.config

Placer disse filer et sted på din computer (i dette tilfælde på skrivebordet), og åben “PS Protector.exe“.

Når programmet først åbnes, bliver du bedt om at indtaste et “UserID” og et “Password“. Da vi bruger prøveprogrammet har Stefan Soller (udvikleren) lavet en test bruger og nøgle.

  • UserID: demo
  • Password: rWf1+ccFx!p2a0e

Skriv overstående UserID og Password, tryk herefter “Login“.

Beskyt dit modul

Nu er det tid til at beskytte vores test modul. Efter du er logget ind i PS Protector (se overstående), skal vi udfylde informationen i “Output Settings” fanen.

  • Convert
    • Input File Name: Indsæt stien til dit .PSM1 modul.
    • Destination Path: Indsæt en sti til hvor PS Protector skal placere din .DLL fil.
  • Assembly Info
    • Title: Angiv titlen på dit PowerShell modul.
    • Description: Skriv en kort beskrivelse af dit modul.
    • Company: Her skrives hvem der har lavet modulet.
    • Product: Angiv produktnavnet.
    • Copyright: Her skrives copyright tekst.
    • Version: Versionen af modulet.
  • Other
    • Your Message: Er valgfri og kan bruges til at indsætte en tekst ved importering af modulet i PowerShell.

Der er også mulighed for at udnytte PS Protectors kommando linje interface, så vi kan automatisere beskyttelsen af vores PowerShell moduler. Det kommer vi dog ikke ind på i denne omgang.

Under fanen “License Settings” kan vi sætte en udløbs dato på .DLL-filen. Når denne dato bliver overskrevet, vil det ikke længere være muligt at bruge den kompilerede .DLL-fil.

Sæt hak i “Enable Licensing” samt “Enable Expire Date“, skriv dit navn i “Registered to (Company or User)” og sæt en dato i fremtiden.

Tilbage på fanen “Output Settings” er vi nu klar til at beskytte vores PowerShell modul. Tryk på “Protect (F7)“.

Lad os teste modulet

Åben en PowerShell terminal og kør følgende kommando. Kommandoen vil importere dit PowerShell modul via din .DLL-fil. Husk at ændre stien til hvor PS Protector placerede din beskyttede .DLL-fil.

Import-Module "C:\Users\zwable\Desktop\MyPowerShellModule.dll";

Nu kan vi prøve og eksekvere PowerShell funktionen “Get-LastBootUpTime” som er placeret i modulet via .DLL-filen. Kør følgende i samme kommando i samme terminal som overstående.

Get-LastBootUpTime;

Dette burde returnere en dato og et tidspunkt på hvornår computeren sidst blev startet.

Hvad bruges der til beskyttelsen?

I følge PS Protector er .DLL-filen beskyttet med den højeste kryptering, og kan beskytte mod .NET decompilers såsom Jetbrains dotPeek eller Redgate .NET Reflector.

PS Protector bruger kode beskyttelse og sløring i form af:

  • Advanced Anti-Debug and Anti-Tracer Protection
  • Advanced Overload Renaming
  • Anti-Reflection Protection
  • Anti-Decompiler Protection
  • Control Flow Obfuscation
  • Constant Value/Array Encryption
  • ILDASM Protection
  • String Encryption
  • Symbol Renaming

Man skal dog ikke se denne som 100% sikker. Der findes helt sikkert avancerede værktøjer eller højt kvalificerede personer som kan bryde denne beskyttelse.

Afsluttende bemærkninger

PS Protector er simpelt og virker efter hensigten. Jeg ser værktøjet som et godt match for firmaer, hvis forretningsmodel, kræver at kildekoden beskyttes. PowerShell virker efterhånden på flere platforme (macOS, Linux og Windows), jeg så gerne at PS Protector tog disse overvejelser med i deres produkt, så de udnyttede .NET Core (PowerShell 6+) frameworket.

Giv PS Protector en prøvetur. Softwaren har en konkurrencedygtig pris, og så slipper du selv for en større udvikling i C# eller lign. programmerings sprog.