For a current project I want to create a “master script” that contains another compressed PowerShell script. This compressed script contains some informations – server names, network share names – that should be as unreadable as possible for normal users. This script is executed during user logon.
I created two scripts
- "compress.ps1"
- "execute.ps1"
The first script is used to compress a script. The second one is used to execute the compressed script.
Here is the script for compressing:
cls $c = Get-Content $$ -Encoding UTF8 $r = [string]::Join(" ", $c) $r2 = [regex]::Match($r, "(.*)(#<--)(.*)", [System.Text.RegularExpressions.RegexOptions]::Singleline) $ms = New-Object System.IO.MemoryStream $cs = New-Object System.IO.Compression.GZipStream($ms, [System.IO.Compression.CompressionMode]::Compress) $sw = New-Object System.IO.StreamWriter($cs) $sw.Write($r2.Groups[3]) $sw.Close(); $bytes = $ms.ToArray() [System.Convert]::ToBase64String($bytes) exit #<-- Write-Host "This is a test" Get-Service A*
The script produces a base64 string that contains everything behind "#<–".
For the script above the output is:
H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/In7j5DdOvlsXbb797app04/ezIsmpf9laZs37Ue/cfJ53m6/zuvLYpqnx9/6jZP/By/6yuMxAAAA
Here is the execution script that contains this base64 string that represents
the compressed script:
cls $data = [System.Convert]::FromBase64String("H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/In7j5DdOvlsXbb797app04/ezIsmpf9laZs37Ue/cfJ53m6/zuvLYpqnx9/6jZP/By/6yuMxAAAA") $ms = New-Object System.IO.MemoryStream $ms.Write($data, 0, $data.Length) $ms.Seek(0,0) | Out-Null $cs = New-Object System.IO.Compression.GZipStream($ms, [System.IO.Compression.CompressionMode]::Decompress) $sr = New-Object System.IO.StreamReader($cs) $t = $sr.readtoend() Invoke-Expression $t
This executes the following code snipped from the script above:
Write-Host "This is a test" Get-Service A*
The output is:
This is a test Status Name DisplayName ------ ---- ----------- Stopped AeLookupSvc Anwendungserfahrung Running AESTFilters Andrea ST Filters Service Stopped ALG Gatewaydienst auf Anwendungsebene Stopped AppIDSvc Anwendungsidentität Stopped Appinfo Anwendungsinformationen Running Apple Mobile De... Apple Mobile Device Stopped AppMgmt Anwendungsverwaltung Stopped aspnet_state ASP.NET-Zustandsdienst Running AudioEndpointBu... Windows-Audio-Endpunkterstellung Running AudioSrv Windows-Audio Stopped AxInstSV ActiveX-Installer (AxInstSV)
Pingback: Reading/Writing NAV Blob data from PowerShell - Kine's Info
This is some of the best and most simple posts on the subject. I owe you a whole lot of thanks man!!