Aller directement au contenu

C#

15 Sujets 94 Messages

Cette catégorie peut être suivie depuis le web social ouvert via le pseudo [email protected]

Sous-catégories


  • 0 0
    0 Sujets
    0 Messages
    Pas de nouveau message
  • 0 Sujets
    0 Messages
    Pas de nouveau message
  • [Tutoriel] Commencer à utiliser SQLite avec C#

    14
    0 Votes
    14 Messages
    22k Vues
    vfrzV
    Bonjour, bonsoir !   Aujourd'hui nous allons apprendre à utiliser SQLite en C#, pour cela je divise le tutoriel en trois grandes parties :   I • SQLite, c'est quoi ? II • Pour quelles utilisations ? III • Utiliser SQLite   I • SQLite, c'est quoi ?   SQLite est une bibliothèque écrite en C qui propose un moteur de base de données relationnelle accessible par le langage SQL. SQLite implémente en grande partie le standard SQL-92 et des propriétés ACID.   Contrairement aux serveurs de bases de données traditionnels, comme MySQL ou PostgreSQL, sa particularité est de ne pas reproduire le schéma habituel client-serveur mais d'être directement intégrée aux programmes. L'intégralité de la base de données (déclarations, tables, index et données) est stockée dans un fichier indépendant de la plateforme.   D. Richard Hipp, le créateur de SQLite, a choisi de mettre cette bibliothèque ainsi que son code source dans le domaine public, ce qui permet son utilisation sans restriction aussi bien dans les projets open source que dans les projets propriétaires. Le créateur ainsi qu'une partie des développeurs principaux de SQLite sont employés par la société américaine Hwaci.     SQLite est le moteur de base de données le plus distribué au monde, grâce à son utilisation dans de nombreux logiciels grand public comme Firefox, Skype, Google Gears, dans certains produits d'Apple, d'Adobe et de McAfee et dans les bibliothèques standards de nombreux langages comme PHP ou Python. De par son extrême légèreté (moins de 300 Kio), il est également très populaire sur les systèmes embarqués, notamment sur la plupart des smartphones modernes : l'iPhone ainsi que les systèmes d'exploitation mobiles Symbian et Android l'utilisent comme base de données embarquée. Au total, on peut dénombrer plus d'un milliard de copies connues et déclarées de la bibliothèque.   (Source : Wikipedia)   Nous allons aujourd'hui nous intéresser au wrapper .Net de SQLite.     II • Pour quels utilisations ?   Comme dit plus haut, SQLite permet d'accéder à une base de données uniquement en local, depuis un fichier, ce qui limite donc les utilisations. Vous pourrez utiliser cette librairie donc pour des projets locaux comme par exemple gérer un système de compte sur une seule machine, stocker des résultats de calculs ou encore stocker des scores pour un jeu solo... Cependant utiliser SQLite pour des jeux ou applications diverses en ligne n'est pas possible directement, il va falloir passer par un serveur.   Des connaissances sur le SQL sont fortement recommandées, si vous n'y connaissez rien, allez lire le tutoriel sur OpenClassRoom ou sur n'importe quel autre site.   III • Utiliser SQLite   Importer la librairie   Premièrement il va vous falloir la librairie, télécharger là ici : System.Data.SQLite.dll   Une fois votre projet crée sous Visual Studio, importer cette librairie à votre celui-ci, pour cela, clic droit sur le projet puis "Importer une référence". Pour finir l'importation ajoutez ceci au début de la classe où vous voulez utiliser SQLite : using System.Data.SQLite; Créer un fichier de base de données   Chaque base de données aura son propre fichier, pour créer un fichier de base de données, nous allons utiliser la méthode statique CreateFile contenue dans la classe SQLiteConnection : SQLiteConnection.CreateFile("MaBaseDeDonnees.sqlite"); J'utilise ici l'extention .sqlite, mais vous pouvez mettre ce que vous voulez ! (.db, .blabla)   Connexion à la base de données   Avant de pouvoir utiliser cette base de données, il va falloir se connecter à celle-ci, pour cela nous allons déclarer une nouvelle SQLiteConnection : SQLiteConnection maConnexion; Puis l'instancier et ouvrir la connexion : maConnexion= new SQLiteConnection("Data Source=MaBaseDeDonnees.sqlite;Version=3;"); maConnexion.Open(); Pour fermer la connexion : MaBaseDeDonnees.Close(); N'oubliez pas de la fermer une fois que vous n'en avez plus besoin Créer une table Désormais nous allons utiliser le SQL, nous allons créer une table qui contiendra les meilleurs scores pour un jeu, donc un nom de type "text" et un score de type "int" : string sql = "create table meilleursscores (nom text, score int)"; Nous devons créer un objet de type SQLiteCommand pour pouvoir l'éxécuter : SQLiteCommand commande = new SQLiteCommand(sql, maConnexion); Puis nous allons éxecuter cette commande : command.ExecuteNonQuery(); Remplir la table Nous allons maintenant remplir cette table comme ceci : string sql = "insert into meilleursscores (nom, score) values ('VFRZ', 100)"; SQLiteCommand commande = new SQLiteCommand(sql, maConnexion); commande.ExecuteNonQuery(); Lire les meilleurs scores depuis la table Pour lire la table c'est un peu différent que pour la remplir ou la créer. Premièrement, la commande select : string sql = "select * from meilleursscores order by score desc"; SQLiteCommand commande = new SQLiteCommand(sql, maConnexion); Puis il va falloir utiliser un SQLiteDataReader pour utiliser cette commande : SQLiteDataReader reader = command.ExecuteReader(); while (reader.Read()) Console.WriteLine("Nom: " + reader["nom"] + "\tScore: " + reader["score"]); J'espère que ce tutoriel vous a été utile ! N'hésitez pas à poser des questions. VFRZ
  • Petit boue de code rigolo ! C Sharp

    5
    0 Votes
    5 Messages
    2k Vues
    aurelien974A
    Salut, voilà je voulais poster se petit bout de code rigolo.  Après rigolo ou pas avoue juger.   class Program     {         const int Fille = 1;         const int Garcon = 2;         static void Main(string[] args)         {             Random LaLoidelaNature = new Random();             int FilleouGarcon = LaLoidelaNature.Next(1, 3);             int MamanOuPapa = LaLoidelaNature.Next(1, 3);             int PapaOuMaman = LaLoidelaNature.Next(1, 3);             int pouetPouet = MamanOuPapa + PapaOuMaman;             int bebeOupas = PapaOuMaman > ? MamanOuPapa > ? pouetPouet : : ;             int resulta = bebeOupas > 3 ? bebeOupas > 2 ? 1 : : 2;             if (resulta == 1)             {                 if (FilleouGarcon == Fille)                 {                     Console.ForegroundColor = ConsoleColor.Magenta;                     Console.WriteLine("Papa est Maman a fait pouet pouet est Maman à un bébé C'est une fille !");                     Console.ResetColor();                 }                 else                 {                     Console.ForegroundColor = ConsoleColor.Blue;                     Console.WriteLine("Papa est Maman a fait pouet pouet est Maman à un bébé C'est un garçon !");                     Console.ResetColor();                 }             }             else if (resulta == )             {                 Console.ForegroundColor = ConsoleColor.White;                 Console.WriteLine("Papa est Maman a fait pouet pouet est Maman ! aucun bébé en vue !");                 Console.ResetColor();             }             else             {                 Console.ForegroundColor = ConsoleColor.Red;                 Console.WriteLine("HOOOO !! deux personnes de même du même sexe ne peux pas avoir d'enfants !");             }             Console.WriteLine("Taper sur une touche pour recommencer !");             Console.Read();             Main(args);         }
  • [Guide] Apprendre le C#

    Épinglé
    5
    0 Votes
    5 Messages
    7k Vues
    vfrzV
    Bonjour, Aujourd'hui je vous liste plusieurs tutoriels, livres pour apprendre le C# de A à Z. La plupart des livres sont en anglais car les livres français sont généralement de moins bonne qualité. Sur Melinyel : • [Vidéo] C# de A à Z : - Episode 1 • Introduction - Episode 2 • Prérequis Livres : • TutorialsPoint C# Programming, livre au format PDF gratuit, très bien pour débuter et couvre pas mal d'aspect du C# (Anglais). - Lien PDF : http://www.tutorialspoint.com/csharp/csharp_tutorial.pdf • C# 5.0 in a nutshell, un grand classique très complet (Anglais). - Lien Amazon : http://www.amazon.fr/5-0-Nutshell-5e-Joseph-Albahari/dp/1449320104/ - Lien PDF : https://drive.google.com/file/d/0B9v4gXG6wtN7NU4tVVFrVkJkUEU/view • Pro C# 5.0 and the .Net 4.5 Framework, un livre très complet (Anglais). - Lien Amazon : http://www.amazon.fr/Pro-5-0-net-4-5-Framework/dp/1430242337/ - Lien PDF : http://www.clicktocontinue.com/books/ProCSharp5AndTheNET4.5Framework.pdf • Cours OpenClassRoom en format PDF (Français), bien pour débuter mais pas complet. - Lien Amazon : http://www.amazon.fr/Apprenez-à-développer-en-C/dp/B00VALU8YG/ - Lien PDF : https://user.oc-static.com/pdf/523498-apprenez-a-developper-en-c.pdf • C# 6 et Visual Studio 2015 - Les fondamentaux du langage, je ne sais pas ce qu'il vaut, mais c'est un des rares livres en C# en français. - Lien Amazon : http://www.amazon.fr/Visual-Studio-2015-fondamentaux-langage/ Sites Web : • Developpez, très complet. - Lien : http://dotnet.developpez.com/csharp/ • OpenClassRooms, le fameux, plusieurs tutoriels sur le C# sont présents, bien pour débuter mais pas très complet (uniquement pour les débutants qui ne comprennent pas l'anglais, à éviter si possible). - Apprenez à développer en C# : https://openclassrooms.com/courses/apprenez-a-developper-en-c - Apprenez à développer en C# sur .Net : https://openclassrooms.com/courses/apprenez-a-programmer-en-c-sur-net - Programmez en orienté objet avec C# : https://openclassrooms.com/courses/programmez-en-oriente-objet-avec-c • Java2S, "catalogue" du C#, pleins d'exemples sur pleins de sujets. - Lien : http://www.java2s.com/Tutorial/CSharp/CatalogCSharp.htm • RB Whitaker's Wiki, bien pour débuter. - Lien : http://rbwhitaker.wikidot.com/c-sharp-tutorials Si vous avez des suggestions de livres/sites web, n'héistez pas Bonne lecture et bon apprentissage ! VFRZ,
  • Les fichiers ZIP

    5
    0 Votes
    5 Messages
    5k Vues
    D
    Comme vous le savez surement, le framework .NET est une immense collection de classes que nous, les développeurs, utilisons pour créer nos programmes. Le framework est divisé en plusieurs Namespace, celui que nous utiliserons dans ce tutoriel est System.IO.Compression. Il vous faudra donc ajouter deux références (Explorateur de solution -> Références -> Ajouter Référence) [image: 4e631291de.png] Puis vérifiez que les références ont bien été ajoutées: [image: 2ac2a3d543.png] Maintenant il ne vous reste plus qu'a ajouter un using tout en haut de votre code: using System.IO.Compression; (Nous utiliserons aussi les namespaces System et Sytem.IO)   Pour commencer, nous avons les fonctions de la classe statique ZipFile : -Prend tout les fichiers contenus dans le dossier "folder", puis les compresses dans le fichier "compressed.zip" ZipFile.CreateFromDirectory("folder", "compressed.zip"); Avec l'enumeration CompressionLevel, il est possible d'optimiser la compression, sois pour la vitesse, sois pour la taille du fichier. -Extrait les fichiers contenus dans le fichier "compressed.zip" vers le dossier "folder" ZipFile.ExtractToDirectory("compressed.zip", "folder"); Ces deux fonctions ont une surchage qui prend en compte l'encodage, l'encodage de base est UTF-8 donc si vous avez besoin d'un encodage différent, il vous suffit de le passer en paramètre.     Maintenant passons au choses un peu plus complexes, la classe ZipArchive vas nous permettre d'avoir plus de contrôle sur notre archive. Cette classe implémente IDisposable, il faut donc l'entourer d'un bloc "using", ou manuellement appeler Dispose() quand vous avez fini de l'utiliser.   Tout d'abord, pour créer une instance ZipArchive, il faut ouvrir un Stream qui va nous permettre de lire le fichier. Cet exemple ouvre le fichier "test.zip". affiche le nom de tout les fichiers ainsi que le ratio de compression: using (Stream fs = File.OpenRead("test.zip")) using (var archive = new ZipArchive(fs, ZipArchiveMode.Read)) foreach (ZipArchiveEntry entry in archive.Entries) Console.WriteLine("{0} : {1}%", entry.Name, Math.Ceiling((double)entry.CompressedLength / (double)entry.Length * 100)); La classe ZipArchive nous permet de créer, de lire et aussi de mettre a jour des archives ZIP. -Création: ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Create); -Lecture: ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Read); // equivalent ZipArchive archive = ZipFile.OpenRead("name.zip");   -Mise a jour: ZipArchive archive = ZipFIle.Open("name.zip", ZipArchiveMode.Update); Dans l'archive, chaque fichier est représenter par une ZipArchiveEntry, qu'on peut obtenir grâce a la proprietee Entries de la classe ZipArchive. On peut récupérer un objet ZipArchiveEntry en choisissant un existant: var entry = archive.GetEntry("file.txt"); Ou en créant une nouvelle: var entry = archive.CreateEntry("file.txt"); La classe ZipArchiveEntry contient des propriétés publiques qui exposent des informations a propos du fichier (nom, taille (et taille après compression), date de la dernière écriture ...) Elle contient aussi plusieurs fonctions tel que Delete (supprime le fichier de l'archive) et ExtractToFile(extrait le fichier compressé vers un fichier décompressé hors de l'archive). La fonction Open revois un objet Stream, qui va nous permettre de modifier directement le contenu du fichier. Exemple qui créé une archive "test.zip", et qui y ajoute le fichier "foo.txt". (c'est possible de le faire plus facilement en utilisant archive.CreateEntryFromFile, mais je vais utiliser cet exemple pour vous montrer comment utiliser l'objet Stream):             using (ZipArchive archive = ZipFile.Open("test.zip", ZipArchiveMode.Create))             {                 var entry = archive.CreateEntry("foo.txt");                 using (Stream s = entry.Open())                 {                     byte[] data = File.ReadAllBytes("foo.txt");                     s.Write(data, 0, data.Length);                 }             } // Reouvre l'archive pour confirmer que le fichier est bien la, et affiche sa taille.             using(ZipArchive archive = ZipFile.OpenRead("test.zip"))             {                 var entry = archive.GetEntry("foo.txt");                 Console.WriteLine("Name: {0}\r\nOriginalSize: {1}\r\nCompressedSize: {2}",                     entry.Name, entry.Length, entry.CompressedLength);             } Je pense avoir fait le tour du sujet, j’éditerais peut être avec une section a propos de la classe GZipStream (qui permet de compresser/décompresser en mémoire, sans fichiers). Je vais aussi écrire un petit tool qui permetra de gérer les fichiers ZIP en ligne de commande. N’hésitez pas si vous avez des questions, ou des remarques a faire ! Davy
  • NetZip

    2
    0 Votes
    2 Messages
    2k Vues
    D
    Hello, suite a mon récent tutoriel a propos des fichiers ZIP, j'ai eu envie de faire un petit projet pour tout mettre en pratique. [image: fc7ebfc941.png] C'est un simple utilitaire en ligne de commande, conçu pour être facile a utiliser. Chaque commande (6 au total) exécute une action précise, et rien d'autre- vous pouvez aussi soumettre des arguments au commandes. Liste des commandes/ sous commandes Get file in main args[0] [1]: Main command [2,3 ...]: main command args -l list : List all files -s : List file sizes -cs: List compressed file sizes -e extract [folderName]: Extract to folder [folderName] (if used: Unzipped(x))) -a add [fileName]: Add a file to the archive -d: Adds a directory -d delete [entryName]: Delete [entryName] from archive -d: Deletes a directory -c create [ToAdd]: Create a new entry -d: Creates archive with a directory h help [command]: Displays help about the command Lors du lancement, il faut spécifier un chemin vers le fichier .zip (exception: la commande help), puis le nom du fichier sera sauvegarder dans la mémoire du programme donc le même fichier sera utiliser automatiquement pour les commandes suivantes, jusqu’à ce qu'un nouveau fichier sois spécifier ou la fermeture du programme. Exemples d'utilisations: netzip foo.zip list // Liste le contenu de l'archive "foo.zip" netzip foo.zip extract folder // Extrait le contenu de l'archive "foo.zip" vers le dossier "folder" netzip foo.zip add test.txt // Ajoute le fichier "test.txt" a l'archive "foo.zip" netzip foo.zip delete test.txt // Supprime le fichier "test.txt" de l'archive "foo.zip" netzip foo.zip create test.txt // Creer une nouvelle archive "foo.zip", et ajoute le fichier "test.txt" dedans netzip help // Affiche la liste des commandes et une bref description netzip help create // Affiche la documentation de la commande "create" Je l'ai dev assez rapidement pendant le weekend a la fin des vacances, donc j'aurais besoin de retour pour pouvoir corriger des bugs le plus vite possible. GitHub: https://github.com/DavyWk/NetZip DL:http://davydavek.olympe.in/Projects/NetZip/NetZip.exe VT: https://www.virustotal.com/en/file/c5d32b2918c8c5f532e292ce676067c6ff31d9020b9d2c3bfe082a5660772e91/analysis/1420844336/ Davy
  • POPLib

    17
    0 Votes
    17 Messages
    4k Vues
    D
    Hello, Comme vous devez surement le savoir, il n'y a pas d’implémentation du protocole POP (Post Office Protocol) dans le framework .NET. J'ai donc créer une librairie qui contient quasiment tout le protocole (sauf la commande APOP). La source est disponible sur GitHub (GPL v3): https://github.com/DavyWk/POP-Lib Téléchargement: http://davydavek.olympe.in/Projects/POPLib.dll Pour commencer a l'utiliser c'est très simple, using POP; var client = new POP3Client("pop.gmail.com", 995, true); // Serveur POP de Gmail avec SSL Pour se connecter: client.Connect(); // initialise la connexion avec le serveur client.Login("[email protected]", "password"); Et a la fin, n'oubliez pas de disposer de l'objet : client.Dispose(); J'ai mis de la doc XML pour presque tout les fonctions publiques, mais si vous avez un problème/ une question, n’hésitez pas a demander. Davy
  • Conversion en SHA-256

    2
    0 Votes
    2 Messages
    2k Vues
    MihawkM
    Bonsoir ! Voilà, actuellement j'ai un problème avec une conversion d'une de mes variables en sha-256, ce qui me bloque complètement pour la suite de mon programme. J'aimerais un résultat équivalent à celui là (prenons l'exemple de : test) 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 Hors, le résultat que j'obtient avec mon script actuel est quelque chose de similaire à ça : /lIGdrGh2T2rqyMZ7qA2dPNjLq7rFj0eiCRPXrHeEOs= Autant vous dire que ce n'est pas bon .. x) Il me faut impérativement un résultat avec des lettres en minuscules, ce que je n'arrive pas à obtenir avec de nombreuses tentatives, voilà le bout de programme qui me fait le conversion. SHA256Managed hash = new SHA256Managed(); byte[] hashvalue = hash.ComputeHash(new UnicodeEncoding().GetBytes(s)); string hashresultat = System.Convert.ToBase64String(hashvalue); Console.Write(hashresultat); Est-ce que quelqu'un parmi vous aurait une idée ? car là je suis un peu bloqué. Merci d'avance !
  • Aide sur une méthode complexe.

    3
    0 Votes
    3 Messages
    4k Vues
    aurelien974A
    Salut, voila je travail sur un System de ai, Donc j'ai une méthode qui me permet de savoir si une phrase pour ressembler a une autre. je voudrais savoir, et comment ou proposer votre technique, pour améliorer cette méthode. private int comparison(string text_A, string text_ { int i = 0; int Chance = 0; string[] text_A_split = text_A.Split(new char[] { ' ' }); string[] text_B_split = text_B.Split(new char[] { ' ' }); if (text_A_split.Count() - 1 > i && text_B_split.Count() - 1 > i) { foreach (string entry_A in text_A_split) { int firstCharacter = text_B_split[i].IndexOf(entry_A[i]); i++; Chance = Chance + firstCharacter; } } return Chance; } Pour le tester MessageBox.Show("" + comparison("Aurelien et ici hahah", " Hahah aurelien et ici lol")); ça renvoie 2 qui signifie que 2 mots son identique. Je voudrais le pousser un peux plus. Si elle deviens très gros la méthode c'est pas grave. c'est un peux le moteur du System on va dire. cordialement moi.
  • Soucis d'ouverture de port via mon launcher.

    14
    0 Votes
    14 Messages
    3k Vues
    MihawkM
    Voilà ! Comme je l'ai dis dans ma présentation, j'ai besoin d'aide sur un point qui m'est complètement étranger... afin de mieux situer le problème laissez moi vous expliquer. Je créer un serveur actuellement d'un jeu (S4L) qui me génère pas mal de problèmes. Dont un, qui pour être réglé, nécessite l'ouverture normalement manuelle des ports sur le routeur (le fait qu'on ne voit personne une fois en jeu .. oui c'est problématique..) Une fois les ports ouvert, les joueurs sont de nouveau visible, c'est pourquoi j'essai de les ouvrir directement sur le launcher (qui reste ouvert, mais caché, une fois le jeu lancé, jusqu'à la fermeture du jeu), pour que grâce à L'upnp, je puisse commander l'ouverture de ces ports. Hors, moi sur mon routeur, quand je vais dans le menu pour l'upnp, je vois que rien ne change (donc je ne sais absolument pas si l'ouverture est bien prise en compte) Voilà le bout de programme qui me sert à les ouvrir (normalement): private void DeviceFound(object sender, DeviceEventArgs args) { INatDevice device = args.Device; device.CreatePortMap(new Mapping(Protocol.Udp, 6112, 6112)); device.CreatePortMap(new Mapping(Protocol.Udp, 38915, 38915)); device.CreatePortMap(new Mapping(Protocol.Udp, 38917, 38917)); device.CreatePortMap(new Mapping(Protocol.Udp, 28002, 28002)); device.CreatePortMap(new Mapping(Protocol.Udp, 28008, 28008)); device.CreatePortMap(new Mapping(Protocol.Udp, 28013, 28013)); device.CreatePortMap(new Mapping(Protocol.Tcp, 6112, 6112)); device.CreatePortMap(new Mapping(Protocol.Tcp, 38915, 38915)); device.CreatePortMap(new Mapping(Protocol.Tcp, 38917, 38917)); device.CreatePortMap(new Mapping(Protocol.Tcp, 28002, 28002)); device.CreatePortMap(new Mapping(Protocol.Tcp, 28008, 28008)); device.CreatePortMap(new Mapping(Protocol.Tcp, 28013, 28013)); foreach (Mapping portMap in device.GetAllMappings()) { // label1.Text = "Test ouverture du port" +(portMap.ToString()); } IPAddress externalIP = device.GetExternalIP(); } private void DeviceLost(object sender, DeviceEventArgs args) { INatDevice device = args.Device; } Voilà, en espérant avoir été assez clair sur le problème rencontré .. (et surtout, est-ce que le programme est correct, et que c'est juste moi qui ai un soucis avec cette ouverture ? au niveau de mon routeur qui pourtant accepte l'upnp, j'ai orange avec un livebox pour la fibre optique.)
  • SharpMail

    2
    0 Votes
    2 Messages
    2k Vues
    vfrzV
    Yo tout le monde ! Suite à un manque d'imagination, j'ai décidé de créer une petite librairie qui va vous permettre d'envoyer des mails en C# plus simplement et plus rapidement. Lien de téléchargement : http://goo.gl/ytgu24 (Release + Source v0.1) Lien de la source : http://goo.gl/biU3s6 (Github) Utilisation : Ajouter la référence au projet Importer la librairie avec : using SharpMail; Désormais vous pouvez envoyer des emails comme ceci : SharpMail.Mail.SendMail("smtp.yourserver.com", "[email protected]", "[email protected]", "subject", "message", "[email protected]", "creditential_password", "Mail send !"); Certes ce n'est pas forcément très utilie mais comme je vous l'ai dit, je ne suis pas très inspiré en ce moment... J'espère quand même que ca peut être utile à quelqu'un ! A+
  • POP Client

    3
    0 Votes
    3 Messages
    2k Vues
    D
    Hello, Comme vous avez du le voir dans j'ai créer une librairie qui permet d’interagir avec un serveur en utilisant le protocole POP3 (qui permet de recevoir des mails). Pour la mettre en pratique, j'ai donc créer un client mail en console. Ce projet est une POC, et donc n'est pas destiné a un usage quotidien. (Ne supporte pas les mails en MIME, les fichiers joints, et quelques mails qui ont un format "spécial" > possibilité de crash) [liste des commandes] Pour commencer a l'utiliser, lancez la commande 'help', qui vous afficheras une liste de toute les fonctions disponibles ainsi que leur description. Pour avoir plus d'information (format, arguments ..) a propos d'une commande utilisez 'help [commande]'. Entrez 'x' suivi d'espace pour quitter. Téléchargement: http://davydavek.olympe.in/Projects/POP3 Client.rar (laissez la DLL dans le même dossier que l’exécutable) Source: https://github.com/DavyWk/POP3-Client Je ne sais pas quoi ajouter, donc je vais conclure ici :lol: Davy
  • DatMemory

    6
    0 Votes
    6 Messages
    2k Vues
    D
    Une petite librairie que j'avais écrit a l’époque ou je m’intéressait au gamehacking, je vient de la réécrire donc pourquoi ne pas la partager Cette libraire vous permet de modifier la mémoire (et de changer sa protection) d'un autre programme avec facilitée. [Documentation arriveras plus tard .. ou pas] Projet sur GitHub: https://github.com/DavyWk/DatMemory DL : http://davydavek.olympe.in/Projects/DatMemory.dll VT: https://www.virustotal.com/en/file/c774392e8f086c0be187cef83e483cb673d6f48bc3d06bfd4a6b6f77192a4f00/analysis/1408282227/
  • PE Explorer

    12
    0 Votes
    12 Messages
    3k Vues
    D
    PE Explorer Au départ c’était donc un petit logiciel, codé rapidement en C++, que j'avais fait pour mieux comprendre le format de fichier PE. [Le format PE (Portable Executable) un format de fichier créer par Microsoft, qui est donc utilisé par TOUT les .exe/.dll/.sys (exécutables, librairies dynamiques & drivers) sur Windows.(pour les plus curieux, voici un article a propos ce format)] Mais le code était littéralement horrible, je l'ai donc re codé en C#. Vu que je n'avais pas accès au structures prédéfinies dans winnt.h, j'ai du tout réécrire manuellement, ce qui je vous l'avoue était chiant, mais aussi très enrichissant. Comme dit plus haut, il n'est pas forcement utile, mais je l'ai surtout fait pour apprendre. Vous pouvez le comparer a l'utilitaire DUMPBIN (qui affiche des informations a propos d'un fichier PE). Screen (ce n'est pas la version finale) : [image: 8be3b53727.png] TODO: -Parser l'import table -Parser l'export table -Afficher le subsystem (CUI, WIn32,driver ...) ? (je prend toute les suggestions !) Pour l'utiliser il suffit de drag 'n drop un fichier dessus. Lien de téléchargement :(v 1) davydavek.olympe.in/Projects/PE_Explorer.exe VirusTotal : VirusTotal : https://www.virustotal.com/en/file/351c7da56a7b4189dc47f2f10921f584dbd5c3480b85761c5b5aa928620a12ed/analysis/1403985438/ Repo GitHub : github.com/DavyWk/PE_Explorer Je m'excuse d'avance pour cette présentation pourrie  Davy
  • Lancer un processus et rediriger sa sortie

    2
    0 Votes
    2 Messages
    3k Vues
    D
    Dans ce petit tutoriel destiné au débutants, je vais vous montrer comment lancer un processus, et rediriger sa sortie. "cmd.exe" et la commande "tasklist" seront utilisé dans cet exemple, a vous de l'adapter selon vos besoins ! J'utiliserais le C#, mais vous pouvez le "traduire" en VB très facilement. Prérequis Bases du C# Créer un projet de type ConsoleApplication Qu'est-ce qu'un processus ? Pour simplifier, c'est le nom donné par Windows au exécutables qui sont entrain de tourner. (ex: chrome.exe |  cmd.exe | Skype.exe ....) Pour les voir il vous suffit de cliquer sur démarrer et puis d'entrer " taskmgr" (Task Manager). System.Diagnostics Ce namespace contient des structures/classes qui vont nous permettre d'interagir avec d'autres processus (et d'autres choses mais on ne va s'en préoccuper durant ce tutoriel) Pour l'importer: using System.Diagnostics; //en haut de votre fichier .cs On va maintenant procéder a la 1ère partie de ce tutoriel : Créer un processus. Pour cela, nous allons utiliser les classes Process et ProcessStartInfo On commence par créer une instance de la classe ProcessStartInfo comme ceci: ProcessStartInfo psi = new ProcessStartInfo {      FileName = "cmd.exe",   // Nom du processus (ici nous n'avons pas besoin de spécifier le chemin car cmd.exe est situé dans les dossiers du systeme.      Arguments = "/c tasklist",  // Commande a exécuter, le /c dit a l’interpréteur de commande "exécute xxx commande et casse toi", tasklist est le nom de la commande qui permet de lister tout les processus actifs.      RedirectStandardOutput = true,  // Pour dire qu'on va rediriger la sortie      UseShellExecute = false,  // Dit a l'OS de démarrer le processus directement a partir de l’exécutable }; Puis on lance le processus  : Process p = Process.Start(psi); // Le processus se lance avec les informations de la classe ProcessStartInfo qu'on vient de créer. Pour récupérer la sortie (output) du processus, on utilise la propriété Process.StandardOutput.ReadToEnd string output = p.StandardOutput.ReadToEnd(); // on le stocke dans une variable de type string Avant d'afficher la sortie sur notre console, nous allons attendre que le processus se termine, en spécifiant un timeout (durée maximum d'attente) p.WaitForExit(10000); // dix secondes Console.WriteLine(output); //écrit la sortie sur notre console Console.ReadKey(); //pause pour qu'on ai le temps de lire ce qui est sur notre console Épilogue Voila, ce court tutoriel est terminé, j’espère qu'il aura aidé certains d'entre vous. Il y a  des millions d'autre choses possible, vous pouvez rediriger la sortie de votre console vers un fichier texte (en utilisant Console.SetOut ), ou encore vers la console de Visual Studio. La seule limite est votre imagination. Questions/Commentaires/Critiques sont toujours les bienvenus, sur ce post ou en MP. Davy. PS: Sur QWERTY, désolé pour le manque d'accents. PS2: Les quelques lignes qui sont supposée être en gras ne le sont pas.
  • Utiliser DLLImport

    2
    0 Votes
    2 Messages
    3k Vues
    D
    Ce tutoriel n'est pas destiné au débutants, mais plutôt a ceux qui ont déjà de l’expérience en C# ou VB.NET DLL ... what ? Les DLLs (Dynamic-Link Library) sont des fichiers non-exécutables, qui contiennent des fonctions pouvant être utilisée par d'autres applications. Windows fonctionne justement avec des DLLs (%windir%\system32\ pour ceux qui voudrait les voir). Les principales sont : -user32.dll (User inferface (MessageBox, Bouttons, etc ...)) -kernel32.dll (Fichiers, Mémoire, Processus/threads etc...) -gdi32.dll (Graphiques) Ces DLL forment ce qu'on appelle l'API* Windows, ou l'API* Win32. *API : Application Programming Interface NB: Il y a aussi ntdll.dll, qui contient l'API Native de Windows. Dans ce tutoriel je vais donc vous apprendre a importer les fonctions FindWindow et FlashWindow, exportées par user32.dll . DLLImport Pour importer ces fonctions, on va utiliser DLLImport, il requiert la classe DLLImportAttribute, dans le namespace System.Runtime.InteropServices : using System.Runtime.InteropServices; Description des paramètres : -string dllName : Le chemin vers la DLL, et son nom. (On va utiliser une DLL de windows donc on n'a pas besoin de spécifier le chemin) -bool BestFitMappig (par défaut true) : Permet de convertir les caractères UNICODE en ANSI, si il est true alors la conversion utilise le caractère ANSI le plus proche (best fit). -CallingConvention CallingConvention (par défaut CallingConvention.StdCall/Winapi) : Un membre de l'enum CallingConvention, c'est assez low-level, donc je ne vais pas l'expliquer ici, vous pouvez lire la doc si vous en avez envie. -CharSet CharSet (par défaut CharSet.Ansi) : En fait certaines fonctions ont deux types. Par exemple MessageBoxA, et MessageBoxW. Pour importer MessageBoxA il faut utiliser Charset.Ansi, et pour MessageBoxW, Charset.Unicode. , L'Ansi, sauvegarde chaque caractère dans un byte, ce qui fait qu'il n'y a que 256 caractère disponibles (dictionnaires "basique" : francais/anglais ...), Charset.Unicode utilise deux bytes (DBCS), ce qui permet d’accéder a 65,536 (2562) caractères. (arabe/chinois/coréen etc..) -string EntryPoint : Le nom de la fonction que vous voulez importer. -bool ExactSpelling (par défaut false en C# mais true en VB) : Si true, vous devez nommer la fonction avec son nom exact (en incluant le A/W, si nécessaire). -bool PreserveSig (par défaut true) : Quand c'est true, la fonction retourne un integer, et quand c'est false, elle retourne une void. Quand une void autre que S_OK (aussi appelé 0, NULL, ERROR_SUCCESS), une exception est lancée. L'exception correspond au code d'erreur. Si la fonction retourne un int autre que 0, vous pouvez gérer l'erreur comme vous le souhaitez. -bool SetLastError (par défaut false) : Si y'a une erreur durant l'utilisation de la fonction, on peut utiliser Marshal.GetLastWin32Error pour obtenir le code de l'erreur (error code) -bool ThrowOnUnmappableChar (par défaut false) : Si c'est a true et qu'une erreur survient durant la conversion des caractères d'UNICODE a ANSI, ça envoie une exception. Sinon ça remplace le caractère par un '?'. Oui y'a beaucoup de paramètres, mais ils sont rarement tous utilisé en même temps. Plateform Invoke DLLImport fait partie de la plateforme Invoke (PInvoke). Pour trouver les prototypes des fonctions qu'on veut utiliser, il faut se rendre sur le Microsoft Developer Network (MSDN). Par exemple pour FindWindow, le prototype est : (en C) HWND WINAPI FindWindow(   _In_opt_  LPCTSTR lpClassName,   _In_opt_  LPCTSTR lpWindowName ); Mais on ne peut pas utiliser les types des lib C en C# ... Donc on doit les 'traduire'. Un superbe site pour ça : pinvoke.net Attention ! Ce site ne contient pas les prototypes de TOUTE les fonctions, n’hésitez pas a utiliser Google. Pour FindWindow le prototype serait donc : static extern IntPtr FindWindow(string lpClassName, string lpWindowName); Un peu de pratique ... Ouvrez Visual Studio, on va commencer a coder. (ah bah enfin ...  ) Ouvrez aussi une application ayant un titre facile a écrire, j'utiliserait Paint. Comme dit précédemment : using System.Runtime.InteropServices; // Le 'DLLImport' est habituellement placé au début d'une classe, ou encore dans une classe spécifique.    [DLLImport("user32.dll", SetLastError = true)] static extern IntPtr  FindWindow(string lpClassName, string lpWindowName);  //On utilisera lpWindowName, lpClassName restera null.   [DllImport("user32.dll", SetLastError = true)]         static extern bool FlashWindow(IntPtr hwnd, bool bInvert); //hwnd est l'handle (quelque chose que Windows utilise pour identifier des objets) de la fenêtre, qu'on récupère grâce a FindWindow. Puis après on fait notre propre code : string sWindowName =  "Untitled - Paint";  IntPtr hWindow = FindWindow(null,sWindowName); // Je préfère utiliser le nom de la fenêtre, donc je place le premier argument a null.       int error = Marshal.GetLastWin32Error(); // Un peu d'error-checking, la liste des ErrorCodes peut être trouvée ici : SystemErrorCodes             if (error == 0)             {                 FlashWindow(hWindow, true);                   error = Marshal.GetLastWin32Error();                 if (error == 0)                     Console.WriteLine("{0} flashed !", sWindowName);                 else                    Console.WriteLine("ErrorCode = {0}", error);              }                   else                Console.WriteLine("ErrorCode = {0}", error); // Si il y a une erreur, affiche l'erreur. End Bon bah voila, je pense que j'ai tout dit sur les bases du DLLImport. Pour plus de lecture : DLLImport Attribute Je n'ai montré que deux API (fonctions dans les DLL de windows), il y en a DES CENTAINES, liste disponible sur le MSDN : Windows API Index Petit projet qui montre quelques trucs possible avec l'api Windows : -WindowsControl.exe (scan VirusTotal) -Source (sans l’exécutable, vous devez le compiler vous-même) Si vous avez des questions, des commentaires etc. , n’hésitez pas a les poster ici. En espérant que ça vous aie plu, Davy.