Kann ich mit ps1, batch/cmd und/oder vbs den binärcode einer datei auslesen und ein "exklusives oder" durchführen?
Und wenn es geht, wie geht es?
2 Antworten
Ich hatte leider bisher keine Zeit um mich mit dem Thema näher zu beschäftigen.
- Get-Content ist für die Eingabe aus Binärdateien eher ungeeignet.
- Unter Einbeziehung der .Net-Klasse [System.IO.File] ist Powershell in der Lage auch Binärdaten zu lesen.
- Die EingabeDatei wird in einen Buffer gelesen und Byte für Byte mit dem gewünschten Wert (0..255) XOR-verknüpft und in einen weiteren Buffer geschrieben. (es ginge auch ressourcensparender, aber so ist es übersichtlicher)
- Der 2. Buffer wird in die Outputdatei geschrieben
Eigentlich recht trivial.
Als Binärdatei habe ich zur Demo einfach eine Zipdatei angelegt, diese lässt sich nach der Rückwandlung am besten auf Fehler überprüfen.
XOR-crypt.ps1
$inFile = "bigfile.zip"
$outFile = "bigfile.zip.xor"
$xorValue = 66
#Buffer zur Aufname der Binärdaten
$inFileBuffer = [System.IO.File]::ReadAllBytes($inFile)
# Set the length of BufferArray
$len = $inFileBuffer.Count
$len
# Buffer zur Aufname der xor-ten Bytes
$xord_byte_array = New-Object Byte[] $len
# XOR Byte für Byte
for($i=0; $i -lt $len ; $i++)
{
$xord_byte_array[$i] = $inFileBuffer[$i] -bxor $xorValue
}
# schreibe Xor-ten Buffer in Outfile
[System.IO.File]::WriteAllBytes("$outFile", $xord_byte_array)
write-host "[*] $inFile XOR $xorValue`n[*] gespeichert in " -nonewline;
Write-host "$outFile" -foregroundcolor green -nonewline; Write-host ".";
pause
XOR-decrypt.PS1
$inFile = "bigfile.zip.xor"
$outFile = "bigfile.test.zip"
$xorValue = 66
#Buffer zur Aufname der Binärdaten
$inFileBuffer = [System.IO.File]::ReadAllBytes($inFile)
# Set the length of BufferArray
$len = $inFileBuffer.Count
# Buffer zur Aufname der xor-ten Bytes
$xord_byte_array = New-Object Byte[] $len
# XOR Byte für Byte
for($i=0; $i -lt $len ; $i++)
{
$xord_byte_array[$i] = $inFileBuffer[$i] -bxor $xorValue
}
# schreibe Xor-ten Buffer in Outfile
[System.IO.File]::WriteAllBytes("$outFile", $xord_byte_array)
write-host "[*] $inFile XOR $xorValue`n[*] gespeichert in " -nonewline;
Write-host "$outFile" -foregroundcolor green -nonewline; Write-host ".";
pause
...eigentlich der gleiche Code... nur die Dateinamen haben sich geändert.
wie funktioniert nicht mehr ? code altert nicht und wird auch nicht krank.
Schon aber durch Updates können Funktionen aus einem Code raus genommen werden. Er Funktioniert halt nicht mehr.
was heisst den funktioniert nicht. fehlermeldung , wie äussert sich das ? wann hatte er den funktioniert etc etc. du kannst doch aus dem code lernen und die probleme beseotigen, genau das ist die hauptaufgabe von programmierern.
Habe den Code eben geteste, funktioniert perfekt.
Es wäre schlimm, wenn Scripte wegen eines Update nicht mehr funktionieren.
In meiner Codebibliothek habe ich Scripte in den verschiedensten Scriptsprachen (Batch,VBS,JavaScript,HTA,Powershell) aus den letzten 30Jahren. Selbst viele Batdateien vom Anfang der 90er Jahre , welche nicht gerade MSDOSspezifische Befehle aufrufen, funktionieren noch immer.
Microsoft hat seine Kommandozeilenprogramme dermaßen Kompatibel gehalten, das noch nie ein Administrator genötigt war irgendeine Steuerdatei umzuschreiben. Es wurden ein Paar Schalter hinzugefügt zu Befehlen hinzugefügt und neue Kommandos eingeführt.
Das geht so weit, das selbst Bugs in "CMD.exe" seit dem ersten "Command.com" erhalten blieben. Denn die Batchprogrammierer hatten recht schnell gelernt auch Fehler im System kreativ zu nutzen.
Derart auf die Spitze getriebene Kompatibilität gibt es in keinem anderen Programm oder Betriebssystem.
Was Powershell angeht, so hat auch diese Sprache, einige nutzbringende Bugs angesammelt, welche heutigen Neulingen Schweißperlen auf die Stirn treiben.
Wenn der Code bei Dir nicht mehr funktioniert, poste einfach Deinen modifizierten Code in einer neuen Frage und füge die Fehlermeldungen hinzu. Dann kann man schauen wo der Hase im Pfeffer liegt. (meist liegt der Fehler einfach in einen vergessenen Gänsefüßchen, oder einem logischen Denkfehler.
Danke! Weißt du auch, wie man das mit mehreren Dateien in einem Ordner oder mit den Dateien in mehreren Ordnern machen kann?
ps1 habe ich nicht gefunden, batch/cmd kennt keine eingebauten Befehle für Bytes, aber mit VBS ist es möglich:
https://stackoverflow.com/questions/6060529/read-and-write-binary-file-in-vbscript
----
Suchen:
https://www.google.com/search?q=vbs+read+bytes+from+file
(deutschsprachige Suche ergab nichts hier Brauchbares unter den ersten Treffern)
Hättest du auch eine idee wie man daraus eine verschlüsselung machen kann?
Also:
01000001 - Binärcode
10110010 - Schlüssel
00001100 - Verschlüsselt
Und andersrum
Das einfachste ist XOR.
Wenn die Schlüsseldatei wenigstens ebenso lang ist wie die zu verschlüsselnde Datei, wirklich zufällig erzeugt wurde (und nicht mit einem Pseudozufallszahlengenerator, wie bei Computern üblich) und nur für diese eine Datei verwendet wird, ist dieses Verfahren übrigens eins der wenigen Verfahren, die im mathematischen Sinne unknackbar sind. ("One Time Pad")
Ich weiß, aber wenn es geht würde es auch mit der methode wo man den einen schlüssel zum verschlüsseln und einen anderen zum entschlüsseln nimmt
Das nennt sich "asymmetrischer Code".
Kryptographie ist ein so komplexes Thema, dass sich Mathematik-Professoren darauf spezialisiert haben. Hier sollte man als Laie nicht unbedingt versuchen, selber etwas zu erfinden. - Allerdings scheint es bei VBS keine eingebaute Möglichkeit zur Verschlüsselung/Entschlüsselung zu geben (nur digitale Unterschriften für Skripte), sodass man auf Drittanbieter-Produkte zurückgreifen muss.
Oder du beschäftigst dich intensiv genug mit asymmetrisch verschlüsselnden/entschlüsselnden Algorithmen, um einen davon selbst implementieren zu können. Wenn deine Frage aus einem deiner Hobbys stammt, würde ich dir unbedingt zuraten - es ist langwierig und mühsam, aber es lohnt sich.
Ich würde einfach sehr gerne wissen wie man soeinen code mit vbs (in dem fall) Programmieren kann weil ich damit experimentieren möchte, da lohnt es sich nicht es wie du sagtest neu zu erfinden
Vermutlich wäre hier das einfachste, Microsoft Visual Studio 2019 herunterzuladen, ein VB.NET-Konsolen-Projekt zu erstellen, hierin auf die Crypto-API zuzugreifen zum Ver- und Entschlüsseln und von VBS- oder Batch-Script darauf zuzugreifen.
Wenn du aktuelle Windows-Systeme meinst, ja. Da wird ein (veraltetes) .NET-Framework schon mitgeliefert. Aber man kann auch mit neuen Visual-Studio-Versionen Programme dafür herstellen ("compilieren").
Bei Versionen älter als XP musst du den Benutzer überreden, ein .NET-Framework zu installieren (falls er das nicht schon getan hat, was nicht unwahrscheinlich ist, weil viele Software das benötigt).
Ok, und wie kann ich das denn mit der zweiten genannen verschlüsselungmethode machen?
Die "Klasse" heißt System.Security.Cryptography.RSACryptoServiceProvider, hierin sind die Methoden Encrypt und Decrypt und alles andere, was man so braucht, enthalten.
Aber da steht das erstmal für c++ was ich gefunden hab
C++ geht im Prinzip auch. Aber das ist VBA zu unähnlich, um sich da mal eben einarbeiten zu können. Deswegen meine Empfehlung zu Visual Studio und VB.NET.
Mit
Imports System.Security.Cryptography
kannst du leicht auf die Kryptographiemodule zugreifen, z. B.
Dim dwKeySize As Integer
Dim params As CspParameters
' Werte setzen
Using CryptoServiceProvider As RSACryptoServiceProvider = New RSACryptoServiceProvider(dwKeySize, params)
With CryptoServiceProvider
'Weiterer Code hier
End With
End Using
Glaube ich hab da was gefunden https://pastebin.com/nQVhK6EA
Ja, das sieht richtig aus.
Allerdings würde ich unbedingt eigene Werte in key und IV eintragen.
Ich muss den code erstmal verstehen damit ich weiß wie ich den z.b. für crypte alle txt dateien im ordner ...
"Try" entspricht "On Error Goto [next Catch]".
Ansonsten müsste ich den Code mal Schritt für Schritt durchgehen. Das geht nicht mal eben.
Naja ich würde versuchen ihn in einzelteile zu zerlegen dann die aufgabe herausfinden und am ende verstehen was wann wo wie gemacht wird
Könntest du das bitte machen? Ich weiß nicht wie ich es in vbs umschreiben soll...
Sorry, ich weiß nicht, wie man von VBS auf das Objektmodell des DotNet-Frameworks zugreifen kann.
Ich würde wie gesagt ein kleines Progrämmchen schreiben und das von VBS aus aufrufen.
Ich hätte das einfach gerne sodas ich es nutzen und vielleicht umbauen kann so das es vielleicht verschiedenes crypten kann z.b.
Ordner
-datei
-datei
-ordner
-datei
und es dann alle dateien zusätzlich zu den im ordner cryptet und/oder entcryptet
Alle Dateien in einem Ordner geht mit dem Batch-Befehl FOR oder mit einer Schleife über bestimmte FileSystemObject-Eigenschaften. (Allerdings kenne ich die nur aus .NET-Perspektive, nicht von VBS her - VBS ist doch ziemlich abgespeckt gegenüber dem vollen VB.
Ich habe ja schon den vb code nur ich weiß nicht wie ich ihn ausführen/anwenden kann
Hast du dir schon Visual Studio (Community - kostenlos) heruntergeladen und installiert?
generell nicht so weit da ich nicht weiß wie ich es machen soll (hab vb nie benutzt)
Hast du schon ein VB-Projekt vom Typ Konsolenanwendung erstellt?
(Menü Datei -> Neues Projekt; Vorlagen -> Visual Basic -> Windows;Konsolenanwendung; Name z. B. "Crypt")
(Möglicherweise lauten die Namen bei dir etwas anders; ich habe keine deutsche Sprachdatei installiert)
Hast du ein neuen Code? Er Funktioniert nicht mehr.