Meilleur auteur de réponses
[Aide] Un crypteur simple

Question
-
Salut à tous,
Ayant mis mon précédent topic en résolus j'en poste un nouveau, d'ailleurs ce n'est plus le même problème que j'ai.
Ce que je souhaite faire en schéma :
Pour l'instant mon programme peut uniquement crypté avec l'algorithme AES (merci à Gilles TOURREAU pour son aide), mon programme créer donc un exécutable crypté en AES.
Ce que je dois faire maintenant c'est au lieu de générer un exécutable crypté, créer un exécutable qui stocke le fichier crypté mais également le décrypteur et les informations comme la clé et le vecteur d'initialisation.
Sur les conseils de Aurel Bera je me suis intéressé à ILMerge et MemoryStream. Cependant les sources que j'ai pu télécharger n'utilise pas ces deux bibliothèques.
Le plus souvent elles utilisent System.CodeDom.Compiler et System.Text .
Voici les sources de mon programme : https://mega.co.nz/#!4FQk3LiB!HYIC7EbgHUD-zKu7fYU8mmETX0417V-z01CYEwOIsq4 si vous en avez besoin pour une raions x ou y. D'ailleurs ça me permettra d'avoir des avis sur le code.
Merci
- Modifié KiisuK jeudi 4 avril 2013 21:34
Réponses
-
J'ai fait comme ça:
public static int IndexOf(byte[] arrayToSearchThrough, byte[] patternToFind) { if (patternToFind.Length > arrayToSearchThrough.Length) return -1; for (int i = 0; i < arrayToSearchThrough.Length - patternToFind.Length; i++) { bool found = true; for (int j = 0; j < patternToFind.Length; j++) { if (arrayToSearchThrough[i + j] != patternToFind[j]) { found = false; break; } } if (found) { return i; } } return -1; }
et:
int pos = IndexOf(Final, System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT")); byte[] exe2 = new byte[Final.Length - pos - System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT").Length ]; Buffer.BlockCopy (Final, pos + System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT").Length, exe2, 0, Final.Length - pos - System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT").Length); FileStream fsWW = new FileStream(save.FileName+"_2", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); fsWW.Write(exe2, 0, exe2.Length); fsWW.Close();
Et le fichier écrit s'exécute bien.
Essayez d’utiliser le fichier non-crypté pour voir si le problème n'est pas lié avec l'encryption.
- Modifié Aurel Bera mercredi 10 avril 2013 13:55
- Marqué comme réponse KiisuK mercredi 10 avril 2013 14:10
-
Ce qui me retourne 3584, ce chiffre représente l’octet à partir duquel je dois commencer à lire ?
C'est la position ou M de MONSUPERFILESPLIT apparais.
Donc vous devez ajouter la longueur de «MONSUPERFILESPLIT» pour ne pas le lire.- Marqué comme réponse KiisuK mercredi 10 avril 2013 14:08
Toutes les réponses
-
Bonjour,
J'ai du mal à comprendre votre demande :
Ce que je dois faire maintenant c'est au lieu de générer un exécutable crypté, créer un exécutable qui stocke le fichier crypté mais également le décrypteur et les informations comme la clé et le vecteur d'initialisation.
Pouvez vous la reformuler ?
Cordialement
Gilles TOURREAU - MVP C#
Architecte logiciel/Consultant/Formateur Freelance
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
- MCITP : SQL Server 2008 Developper
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 -
-
-
J'ai trouvé ma solution enfin et elle fonctionne.
Voici ce que j'ai fais :
Mon crypteur a un fichier ressource ( un fichier texte qui contient du code C# qu'il compile quand on clique sur le bouton crypté).
Lors d'un clique sur le bouton crypté le programme compile le décrypteur et lui ajoute une ressource qui est mon programme crypté.
Maintenant il me reste à trouver comment lancer une programme en mémoire sans l'écrire sur le disque dur.
-
Alors petit problème avec mon crypteur, il fonctionne parfaitement cependant ces lignes la :
ResourceManager res = new ResourceManager("res", System.Reflection.Assembly.GetExecutingAssembly()); byte[] programme = (byte[])res.GetObject("file");
Sont détecté comme un virus, avant même que je décrypte.
Donc ma seconde solution est la suivante, mettre mon programme crypté directement dans le décrypteur, et lors du lancement dans la fonction main() de mon décrypteur je "découpe" ce fichier, du coup je retrouve un tableau de byte correspond à mon programme crypté.
Le problème est, comment insérer une ligne dans mon fichier final permettant de faire la séparation entre mon décrypteur et mon programme crypté ?
-
ReBonjour
Regardez cet exemple:
http://www.codeproject.com/Articles/339768/Flexible-Self-Extracting-Application-in-Csharp-Pro
Peut-être il vous sera utile.
Cordialement,
-
Bonjour
Un petit retour SVP?
Merci,
Cordialement,
-
Bonjour,
alors en fait j'ai trouvé une solution que j'ai appliqué en VB cependant je n'arrive pas à la traduire en C# car la lib System.IO ne fonctionne pas de la même façon que en VB.
Voici ce que je fais en VB :
'Lecture du fichier à crypter FileOpen(1, inputFile_txt.Text, OpenMode.Binary, OpenAccess.Read, OpenShare.Default) inputFile = Space(LOF(1)) FileGet(1, inputFile) FileClose(1) 'Lecture du stub FileOpen(1, Application.StartupPath & "\decrypteur.exe", OpenMode.Binary, OpenAccess.Read, OpenShare.Default) stub = Space(LOF(1)) FileGet(1, stub) FileClose(1) File.Delete(Application.StartupPath & "\decrypteur.exe") 'Création du fichier crypté FileOpen(1, fileOutput, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Default) FilePut(1, stub & filesplit & RC4(inputFile, "123456789")) FileClose(1)
Cependant impossible de traduire ça en C# en utilisant la class System.IO.File .
Une solution ?
(Ce que j'appelle le stub est un fichier qui est compilé à la volé (codedom) et qui se lit lui même, il utilise le filesplit pour découper le décrypteur et le fichier crypté , voici le code du stub que vous puissiez mieux comprendre:
Dim TPath As String = System.IO.Path.GetTempPath Dim file1, filezb4(), filezafter As String 'Lecture du stub FileOpen(1, System.Windows.Forms.Application.ExecutablePath, OpenMode.Binary, OpenAccess.Read, OpenShare.Shared) file1 = Space(LOF(1)) FileGet(1, file1) FileClose(1) 'On split filezb4 = Split(file1, filesplit) 'Décryptage du fichier filezafter = rc4(filezb4(1), "123456789") FileOpen(5, TPath & "\fichier.exe", OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Default) FilePut(5, filezafter) FileClose(5) System.Diagnostics.Process.Start(TPath & "\fichier.exe") Me.Close()
- Modifié KiisuK mercredi 10 avril 2013 05:02
-
ReBonjour
Pour lire les fichiers en C#
FileStream fs = new FileStream(inputFile_txt.Text,
FileMode.Open,
FileAccess.Read,
FileShare.Read);byte[] bytes = new byte[fs.Length];
int NoBytes = fs.Read(bytes, 0, (int)fs.Length );
fs.Close();Pour ecrire des fichiers en C#:
FileStream fsW = new FileStream(inputFile_txt.Text,
FileMode.Create ,
FileAccess.ReadWrite,
FileShare.ReadWrite);fsW.Write(bytes, 0, bytes.Length);
fsW.Close();Pour la transformation de butes[] en String :
string result = System.Text.Encoding.UTF8.GetString(bytes);
Cordialement,
-
Bonjour,
Donc pour l'écriture ça à l'air de fonctionné même si je doute que je puisse retrouver mon filesplit plus tard, car sur mon crypteur en VB si j'ouvre l'exécutable généré avec notpad++ par exemple je peux clairement lire mon filesplit, la avec le code suivant je ne peux pas le lire :
Byte[] file = File.ReadAllBytes(inputFile.Text); Byte[] fileCrypted = Crypto.RC4EncryptDecrypt(file, "MyKeyForEncrypt"); Byte[] Stub = iCompile.runStub(); /* Écriture du stub */ FileStream fsW = new FileStream(save.FileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); fsW.Write(Stub, 0, Stub.Length); fsW.Close(); /* Écriture du filesplite */ fsW = new FileStream(save.FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); byte[] buffer = System.Text.Encoding.ASCII.GetBytes("MONSUPERFILESPLIT"); fsW.Write(buffer, 0, buffer.Length); fsW.Close(); /* Écriture du fichier crypté */ fsW = new FileStream(save.FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); fsW.Write(fileCrypted, 0, fileCrypted.Length); fsW.Close();
Donc la j'ai mon exécutable qui fonctionne, mais maintenant comme faire ceci :
'Lecture du stub FileOpen(1, System.Windows.Forms.Application.ExecutablePath, OpenMode.Binary, OpenAccess.Read, OpenShare.Shared) file1 = Space(LOF(1)) FileGet(1, file1) FileClose(1) 'On split filezb4 = Split(file1, filesplit)
La je me retrouve avec un table filezb4(0) qui est mon décrypteur et filezb4(1) qui est mon fichier crypté.
Lire le fichier pas de soucis, mais comment le split en C# ? Sachant que le filesplit est écrit de cette façon
System.Text.Encoding.ASCII.GetBytes("MONSUPERFILESPLIT");
Alors que en VB j'ai clairement écris du texte dans mon fichier .exe.
-
Ici vous avez un exemples sur comment vous pouvez chercher un byte[] dans un autre byte[].
Utilisez Buffer.BlockCopy ( ) pour copier ce qui est dans le fichier concaténée après les « MONSUPERFILESPLIT » dans une autre byte[].
-
-
Mais c'est déjà ce que vous avez fait.
Maintenant vous avez quelque chose de typeSTUB_EXE
MONSUPERFILESPLIT
FICHIER_CRIPTEE
(J'ai teste votre code avec peu de modifications et j'ai trouvé MONSUPERFILESPLIT dans le fichier de sortie)
Et vous voulez recuperer FICHIER_CRIPTEE.
En VB vous faites Split sur un jeu de caractères avec séparateur MONSUPERFILESPLIT.
En C# pour récupérer FICHIER_CRIPTEE vous devez trouver la position de debout du MONSUPERFILESPLIT et copier les bytes après son apparition.
Ou vous pouvez transformer les byte[] dans un String et utiliser toujours Split pour séparation. -
-
La meilleure c'est de travailler avec des byte[]. Transformer en String, et retransformer en bytes c'est un peu indirecte.
-
-
Voici ce que je viens de faire :
// Lecture Byte[] file = File.ReadAllBytes(@"C:\Users\Get_DowN\Desktop\try.exe"); // Convertir en string string files = System.Text.Encoding.ASCII.GetString(file); // Split string[] after = Regex.Split(files, "MONSUPERFILESPLIT"); // Décrypt Byte[] decrypt = System.Text.Encoding.ASCII.GetBytes(after[1]); // Écriture du programme crypté File.WriteAllBytes(@"C:\Users\Get_DowN\Desktop\decrypt.exe", decrypt);
Mais ça ne fonctionne pas, je retrouve bien la séparation faites correctement cependant le fichier de sortie n'est pas valide est ne peux pas être exécuté.
-
Essayez plutôt en place de
string[] after = Regex.Split(files, "MONSUPERFILESPLIT");
string[] after = files.Split ("MONSUPERFILESPLIT");
Verifiez aussi que le fichier de sortie ne contient pas aussi au debout "MONSUPERFILESPLIT".
Cordialement,
-
-
C'est vrais, utilisez str.ToCharArray();
Cordialement,
-
Cela ne fonctionne pas, mon fichier n'est même pas un fichier exécutable, voici son contenu :
¦«¤©Iÿù) qF¦xÒä<÷ä=ñ•fÿß$ˆÕŒ$²ŸHP€›q2;Ðëè°EÙݹgi;‰V~vŽÂ9mQksü{ BÀ®O
¦«¤©Iÿù)qF¦xÒä<÷ä=ñ•fÿß$ˆÕŒ$²ŸHP€›q2;Ðëè°EÙݹgi;‰V~vŽÂ9mQksü{BÀ®O
Je pense que le problème viens du fait de convertir en string, puis ensuite transformer à nouveau en Byte.
-
C'est vrais :
System.Text.Encoding.ASCII.GetBytes - fait une conversion en caracteres Ascii 7 bits.
Essayez avec System.Text.Encoding.UTF8.
Si ca ne fonctionne pas vous devez travailler sur des byte[].
Cordialement
-
J'ai le même résultat, l'application n'est pas valide, de toute façon le split ne se fait pas au bon endroit car le exe fait 92 octect alors que l'exécutable crypté fait normalement 4.75Mo.
Comment établir le pattern pour trouver mon split ? (rapport au lien suivant : http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/15514c1a-b6a1-44f5-a06c-9b029c4164d7 )
-
Voici ce que je fais :
int split = IndexOf(file, System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT"));
int split = IndexOf(file, System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT"));
La fonction IndexOf:
public static int IndexOf(byte[] arrayToSearchThrough, byte[] patternToFind) { if (patternToFind.Length > arrayToSearchThrough.Length) return -1; for (int i = 0; i < arrayToSearchThrough.Length - patternToFind.Length; i++) { bool found = true; for (int j = 0; j < patternToFind.Length; j++) { if (arrayToSearchThrough[i + j] != patternToFind[j]) { found = false; break; } } if (found) { return i; } } return -1; }
Ce qui me retourne 3584, ce chiffre représente l’octet à partir duquel je dois commencer à lire ?
-
J'ai fait comme ça:
public static int IndexOf(byte[] arrayToSearchThrough, byte[] patternToFind) { if (patternToFind.Length > arrayToSearchThrough.Length) return -1; for (int i = 0; i < arrayToSearchThrough.Length - patternToFind.Length; i++) { bool found = true; for (int j = 0; j < patternToFind.Length; j++) { if (arrayToSearchThrough[i + j] != patternToFind[j]) { found = false; break; } } if (found) { return i; } } return -1; }
et:
int pos = IndexOf(Final, System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT")); byte[] exe2 = new byte[Final.Length - pos - System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT").Length ]; Buffer.BlockCopy (Final, pos + System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT").Length, exe2, 0, Final.Length - pos - System.Text.Encoding.UTF8.GetBytes("MONSUPERFILESPLIT").Length); FileStream fsWW = new FileStream(save.FileName+"_2", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); fsWW.Write(exe2, 0, exe2.Length); fsWW.Close();
Et le fichier écrit s'exécute bien.
Essayez d’utiliser le fichier non-crypté pour voir si le problème n'est pas lié avec l'encryption.
- Modifié Aurel Bera mercredi 10 avril 2013 13:55
- Marqué comme réponse KiisuK mercredi 10 avril 2013 14:10
-
Ce qui me retourne 3584, ce chiffre représente l’octet à partir duquel je dois commencer à lire ?
C'est la position ou M de MONSUPERFILESPLIT apparais.
Donc vous devez ajouter la longueur de «MONSUPERFILESPLIT» pour ne pas le lire.- Marqué comme réponse KiisuK mercredi 10 avril 2013 14:08
-
-
Dernière question en VB quand je fais ceci :
MessageBox.Show(System.Windows.Forms.Application.StartupPath);
Je récupère le chemin vers le fichier en cours d'exécution, cependant la je récupère le chemin mais sans le nom du fichier et donc si il est renommé mon code sera faux. Une solution simple ?
EDIT; Application.ExecutablePath, merci l'auto complétion de Visual :)- Modifié KiisuK mercredi 10 avril 2013 14:28
-
C'est facile:
MessageBox.Show(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
Cordialement, -
merci.
Petite question encore, j'ai une class en VB, tout est public je crée un projet librairie afin de créer une dll et l'ajouter à mon projet C#.
Cependant une fois la dll ajouté aux références impossible d'y accéder. Pour je suis sur d'avoir fait exactement la même manipulation sur la première version du crypter et ça avait fonctionné.
-
Avez-vous ajoute using VotreNamespace; aussi que le DLL dans les références de projet?
Cordialement, -
Voici l'erreur que j'ai :
Erreur 6 Le type ou le nom d'espace de noms 'Icon' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)
Pourtant dans ma class VB j'ai bien Namespace Icon.
Au passage, vue que mon fichier est compilé à la volé comment spécifier directement dans le code les informations assembly (société, version etc ...)
-
Bonjour de nouveau
Ce DLL c'est un autre projet dans votre solution?
En plus, dans le répertoire Références, Ajouter Nouveau sélectez le Projet et pas directement le fichier DLL.Cordialement,
-
-
Vous voulez inclure une classe VB dans un Project C# ?
Essayez d’ajouter un projet bibliothèque VB dans la solution et inclure votre classe VB.
Ou mieux, faites la conversion en C# et ça vas fonctionner.
Pour la conversion, j’utilise :
http://www.developerfusion.com/tools/convert/csharp-to-vb/
Cordialement,
-
La conversion sur ce site fonctionne vraiment ? Peut-importe le code ?
J'ai réussi à mettre ma dll est l'utilisé, j'ai fais la même manip que hier et la ça a fonctionné, le soucis c'est que du coup mon icone est bien, le décrypteur ce lance car il m'affiche bien la message box, cependant, il y a une erreur au moment ou il lance le fichier crypté "Application 16 bit non pris en charge". Cela viens clairement de la DLL, du coup comment mettre une icône proprement ?
C'est à dire la spécifier directement dans le code qui est compilé à la volé ?
Ensuite pourquoi quand je fais ceci avant de compiler :
Properties.Resources.Stub.Replace("%PASSWORD%", "MonMotDePasse");
Et que j'ai ceci dans le stub
System.Windows.Forms.MessageBox.Show("%PASSWORD%");
Quand je lance mon fichier finale la MessageBox contient %PASSWORD% est pas mon mot de passe ?
-
Oui, la conversion sur ce site fonctionne bien, je l'utilise souvent.
Pour la suite, n'est pas clair pour moi ce que vous voulez faire.
Quelle icone vous voulez changer?
Celle de STUB ou celle du programme crypté?Essayez de ouvrir un nouveau thread, parce-que celui-ci est devenu trop grand avec trop des problèmes.
Cordialement,