Verschlüsseln


Wenn man verhindern will, dass jemand in den Klartext eines selbst erstellten Skripts schaut und ggf. den Code ändert, muss das Skript verschlüsselt werden. Dazu bietet Microsoft einen Encoder an. Die Installationsdatei SCE10DE.exe ist zu finden auf der Seite
http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=e7877f67-c447-4873-b1b0-21f0626a6329

Die Installation erzeugt die Hilfsdatei SCRENC.chm und den eigentlichen Decoder SCRENC.exe.

Der Encoder ist ein Befehlszeilentool mit dem man beispielsweise
  • aus einer vbs-Datei eine verschlüsselte vbe-Datei oder
  • aus einer js-Datei eine verschlüsselte je-Datei
erzeugen kann.

Dabei kann man die Datei unterteilen in einen unverschlüsselten Teil am Anfang und dem restlichen, verschlüsselten Teil. Dies geschieht durch Eintragen der Marke
'**Start Encode**     bei vb-Skripten bzw.
//**Start Encode**    bei j-Skripten
ab der der Code verschlüsselt wird.

Bei FixFoto-Skripten kann man damit den Kopf, bestehend aus
'FFSubmenu=... bzw. //FFSubmenu=... (Name der Kategorie für das Skript)
'FFName=...    bzw. //FFName=...    (Name des Skriptes innerhalb der festgelegten Kategorie)
unverschlüsselt lassen.

Verschlüsselungsbeispiel

Der Encoder ist gespeichert im Ordner
D:\Skripte\screnc.exe

Das FixFoto-Skript Ordner_Liste.vbs mit gesetzter Startmarke, abgelegt im Pfad
D:\FixFoto\Script\Ordner_Liste.vbs
sieht so aus:
'FFSubmenu=Test
'FFName=Ordnerliste

'Anzeige des aktiven Ordners und aller Unterordner
'**Start Encode**

Option Explicit
 
Dim objFS,objFolder
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(FF_GetImagePath)
 
Dim Ordnerliste
 
call AlleOrdner(objFolder)
 
Set objFolder = nothing
Set objFS = nothing
 
msgbox Ordnerliste,vbInformation,"Ordner und Unterordner"
'-------------------------------------------------------------
Sub AlleOrdner(ByVal Startordner)
Dim Unterordner
 
Ordnerliste = Ordnerliste & Startordner & vbNewLine
 
For Each Unterordner In Startordner.subfolders
    AlleOrdner Unterordner
Next
 
End Sub
'-------------------------------------------------------------
Die Kommandozeile zum Verschlüsseln (unbedingt alles in eine Zeile schreiben) muss so aussehen:
"D:\Skripte\screnc.exe" "D:\FixFoto\Script\Ordner_Liste.vbs" "D:\FixFoto\Script\Ordner_Liste.vbe"
und wird am besten als Batchdatei, z.B. Verschluesseln.bat abgespeichert und dann ausgeführt.

Das Ergebnis ist die verschlüsselte Skriptdatei Ordner_Liste.vbe
'FFSubmenu=Test
'FFName=Ordnerliste

'Anzeige des aktiven Ordners und aller Unterordner
'**Start Encode**#@~^tQIAAA==@#@&@#@&}wDkW   PAaw^k^kD@#@&@#@&fks~W(LsUSG4NsKV[+.@#@&?nY,G4Nsj~{PZ.nmYnr
(%mOvJUmDbwDrxTRok^+jzkY+s64N+mDEb@#@&?Y~W8%wWsN.P{PG8Ns?
!YoW^[Dcws|M+DqsConCY4#@#@&@#@&fbhP}DN .......
 
Die verschlüsselte Skriptdatei ist so wie sie hier gezeigt wird, nicht lauffähig, da sie aus Darstellungsgründen abgekürzt wurde.

Verschlüsselungsautomatisierung

Wenn man öfter Skripte verschlüsseln will, ist die oben beschriebene Vorgehensweise sehr mühsam. Um den Vorgang zu automatisieren, kann man folgendes VB-Skript (kein FixFoto-Skript) verwenden:
'Skript zum Verschlüsseln von VB- und Java-Skripten mit installiertem Encoder SCRENC
'************************************** SKRIPT ******************************************************
'Die Installationsdatei sce10de.exe für SCRENC kann herunter geladen werden von der MICROSOFT-Seite
'http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=e7877f67-c447-4873-b1b0-21f0626a6329

'Der Encoder muss im selben Verzeichnis abgelegt sein wie das vorliegende Skript
'Es wird verschlüsselt ab '**Start Encode** bzw. //**Start Encode**

'Das zu verschlüsselnde Skript wird  manuell auf das vorliegende Skript gezogen oder auf eine Verknüpfung davon.
'Das verschlüsselte Skript erhält die Dateiendung vbe bei vb-Skripten bzw. je bei j-Skripten
'und wird im selben Verzeichnis abgelegt wie das Original.
'************************************** SKRIPT ******************************************************
Option Explicit
 
'Deklarationen
Dim objFS,WshShell
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")   'FileSytemObject
Set WshShell = WScript.CreateObject("WScript.Shell")
 
Dim script,scriptpath,encoder
Dim objFile,Extension,Name1,Name2,Befehl
 
'Feststellen wie der eigene Ordner heißt
script = Wscript.ScriptFullName
scriptpath = objFS.getparentfoldername(script)
encoder = scriptpath & "\screnc.exe"
 
'Prüfen ob Datei SCRENC  vorhanden ist
If not (objFS.FileExists(encoder)) Then
   MsgBox "Der Encoder" & vbNewLine & encoder & vbNewLine & "wurde nicht gefunden!" & vbNewLine & _
          "Das Skript wird abgebrochen.",vbExclamation,"Abbruch"
   WScript.Quit
end if
 
encoder = """" & encoder & """"
 
'das zu verschlüsselnde Skript wird als gedroppte Datei erkannt
on error resume next
Set objFile = objFS.GetFile(WScript.Arguments(0))
if err > 0 then
   Msgbox "Es wurde keine Datei gedroppt" & vbNewLine & _
          "Das Skript wird abgebrochen.",vbExclamation,"Abbruch"
   Wscript.Quit
end if
on error goto 0
 
'ermitteln des Dateinamens für das verschlüsselte Skript und codieren
Extension = Ucase(objFS.GetExtensionName(objFile.Name))
if Extension = "VBS" or Extension = "JS" then
 
   Name1 = """" & objFile & """"
   if Extension = "VBS" then
      Name2 = """" & left(objFile,len(objFile)-1) & "e" & """"
   else
      Name2 = """" & objFile & "e" & """"
   end if
 
   Msgbox "Das Skript" & vbNewLine & Name1 & vbNewLine & "wird codiert in" & _
          vbNewLine & Name2,vbInformation,"Info"
 
   Befehl = encoder & " " & Name1 & " " & Name2
   on error resume next
   WshShell.Run Befehl,,true
   if err > 0 then
      Msgbox "Bei der Codierung trat ein Fehler auf.",vbExclamation,"Abbruch"
   else
      Msgbox "Die Codierung war erfolgreich",vbInformation,"Fertigmeldung"
   end if
else
   Msgbox "Die Datei" & vbNewLine & objFile & vbNewLine & "ist kein VB- oder J-Skript." & _
         vbNewline & vbNewLine & "Die Codierung wird abgebrochen!",vbExclamation,"Abbruch"
end if
'************************************** ENDE   ******************************************************
Das Skript muss in einem gemeinsamem Ordner mit der Encoder-Datei abgespeichert werden. Dann legt man am besten eine Verknüpfung zum Verschlüsselungsskript auf dem Desktop ab und kann dann eine zu verschlüsselnde Datei per "Drag and Drop" auf diese Verknüpfung ziehen. Dadurch wird automatisch die Verschlüsselung gestartet und bei Erfolg das verschlüsselte Skript im selben Ordner wie das Original abgelegt.

Entschlüsseln

Die Verschlüsselung verhindert den laienhaften Zugriff auf den Code. Man muss aber wissen, dass das Decodieren einer solchen Verschlüsselung für den Experten relativ einfach ist. Man kann sich also nicht darauf verlassen, dass mit der Verschlüsselung der Code wirklich gesichert ist.

Anmerkung

Man sollte Skripte in der Regel im Klartext veröffentlichen. Das erlaubt anderen auf einfache Weise aus einem Skript Informationen zu ziehen, ggf. daraus zu lernen, evtl. Fehler zu beseitigen oder für eigene Zwecke anzupassen. Nur wenn man deutlich machen will, dass alles dies nicht gewünscht wird, ist die Verschlüsselung angebracht.