Kann ich mit ps1, batch/cmd und/oder vbs den binärcode einer datei auslesen und ein "exklusives oder" durchführen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
2017Fragen 
Fragesteller
 03.11.2019, 15:09

Danke! Weißt du auch, wie man das mit mehreren Dateien in einem Ordner oder mit den Dateien in mehreren Ordnern machen kann?

0
2017Fragen 
Fragesteller
 04.11.2019, 21:56

wüsstest du da was?

0
2017Fragen 
Fragesteller
 24.02.2020, 20:51

Hast du ein neuen Code? Er Funktioniert nicht mehr.

0
RakonDark  24.02.2020, 20:59
@2017Fragen

wie funktioniert nicht mehr ? code altert nicht und wird auch nicht krank.

1
2017Fragen 
Fragesteller
 24.02.2020, 21:01
@RakonDark

Schon aber durch Updates können Funktionen aus einem Code raus genommen werden. Er Funktioniert halt nicht mehr.

0
RakonDark  24.02.2020, 21:05
@2017Fragen

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.

1
Erzesel  25.02.2020, 07:40
@RakonDark

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.

0
Woher ich das weiß:Berufserfahrung – Software-Entwickler
2017Fragen 
Fragesteller
 31.10.2019, 20:48

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

0
PWolff  31.10.2019, 20:52
@2017Fragen

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")

1
2017Fragen 
Fragesteller
 31.10.2019, 20:56
@PWolff

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

0
PWolff  31.10.2019, 21:13
@2017Fragen

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.

1
2017Fragen 
Fragesteller
 31.10.2019, 21:15
@PWolff

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

0
PWolff  31.10.2019, 21:20
@2017Fragen

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.

0
2017Fragen 
Fragesteller
 31.10.2019, 21:22
@PWolff

Läuft das denn auf jedem windows pc?

0
PWolff  31.10.2019, 21:33
@2017Fragen

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).

0
2017Fragen 
Fragesteller
 31.10.2019, 21:41
@PWolff

Ok, und wie kann ich das denn mit der zweiten genannen verschlüsselungmethode machen?

0
PWolff  31.10.2019, 21:43
@2017Fragen

Welche ist das?

Du könntest nachschauen, wie diese Methode in der Crypto-API heißt.

0
PWolff  31.10.2019, 21:48
@2017Fragen

Die "Klasse" heißt System.Security.Cryptography.RSACryptoServiceProvider, hierin sind die Methoden Encrypt und Decrypt und alles andere, was man so braucht, enthalten.

0
2017Fragen 
Fragesteller
 31.10.2019, 21:51
@PWolff

Aber da steht das erstmal für c++ was ich gefunden hab

0
PWolff  31.10.2019, 22:01
@2017Fragen

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


0
PWolff  31.10.2019, 22:13
@2017Fragen

Ja, das sieht richtig aus.

Allerdings würde ich unbedingt eigene Werte in key und IV eintragen.

0
2017Fragen 
Fragesteller
 31.10.2019, 22:15
@PWolff

Ich muss den code erstmal verstehen damit ich weiß wie ich den z.b. für crypte alle txt dateien im ordner ...

0
PWolff  31.10.2019, 22:19
@2017Fragen

"Try" entspricht "On Error Goto [next Catch]".

Ansonsten müsste ich den Code mal Schritt für Schritt durchgehen. Das geht nicht mal eben.

0
2017Fragen 
Fragesteller
 31.10.2019, 22:22
@PWolff

Naja ich würde versuchen ihn in einzelteile zu zerlegen dann die aufgabe herausfinden und am ende verstehen was wann wo wie gemacht wird

0
2017Fragen 
Fragesteller
 31.10.2019, 23:55
@PWolff

Könntest du das bitte machen? Ich weiß nicht wie ich es in vbs umschreiben soll...

0
PWolff  01.11.2019, 00:02
@2017Fragen

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.

0
2017Fragen 
Fragesteller
 01.11.2019, 00:25
@PWolff

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

0
PWolff  01.11.2019, 13:00
@2017Fragen

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.

0
2017Fragen 
Fragesteller
 01.11.2019, 18:24
@PWolff

Ich habe ja schon den vb code nur ich weiß nicht wie ich ihn ausführen/anwenden kann

0
PWolff  01.11.2019, 23:13
@2017Fragen

Hast du dir schon Visual Studio (Community - kostenlos) heruntergeladen und installiert?

0
PWolff  02.11.2019, 00:49
@2017Fragen

Auch gut.

Wie weit bist du mit dem Projekt schon gekommen?

0
2017Fragen 
Fragesteller
 02.11.2019, 00:57
@PWolff

generell nicht so weit da ich nicht weiß wie ich es machen soll (hab vb nie benutzt)

0
PWolff  02.11.2019, 01:02
@2017Fragen

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)

0