mercredi 26 août 2015

Online Video Converter - Youtube to mp3 converter (HQ)

Bonjour à tous,

Vous allez me dire qu'il existe de nombreux outils qui permettent de convertir des liens youtube en mp3 !
Je vous réponds qu'il en existe mais la qualité n'est absolument pas au rendez-vous (128 kbits), c'est pourquoi OCV YTMC permet de convertir avec un bitrate allant jusqu'à 320 kbits grâce au site http://www.onlinevideoconverter.com (merci à eux) duquel j'ai créé une sorte d'API.

A noter que la solution est articulée autour de 3 projets :

- Ovc - Youtube to mp3 converter
- Ovc - Wrapper (librairie de classe)
- Ovc - Downloader (librairie de classe)



Disponible ici : https://bitbucket.org/3dotdev/ovc-youtube-to-mp3-converter-hq

Il n'y a ici rien de révolutionnaire mais toute source (libre) mérite que l'on s'en inspire.

Bon codage à tous.

mardi 7 juillet 2015

DotNetPatcher v4.4.2 : projet open source disponible !

DotNet Patcher est un projet de développement qui a débuté en février 2013. Je me suis très largement inspiré de NCloak qui utilisait egalement la très réputée librairie MonoCecil.
Depuis ses débuts DNP a fait l'objet de quelques évolutions et optimisations pour qu'aujourd'hui je décide finalement de proposer sa source a qui souhaiterait en apprendre autant que moi au travers d'autres projets open source : Merci à tous ses dev chevronnés qui proposent encore des sources libres.
2015 : DNP sera rendu publique. Fin de ce projet pour enfin rebondir sur un autre projet qui me tient encore plus à coeur !

Disponible ici : https://bitbucket.org/3dotdev/dotnet-patcher

a+

vendredi 3 juillet 2015

Source VbNet : Détecter si le disque dur est un SSD !

Bonsoir à tous,

Il fut un temps j'utilisais les requêtes WMI pour savoir si un disque dur était de type SSD mais cette technique n'était pas des plus fiables puisqu'elle se basait sur tout ou partie du nom.....
Je suis tombé il y a peu de temps sur ce billet https://emoacht.wordpress.com/2012/11/06/csharp-ssd/  qui illustre et démontre d'une manière très fiable comment répondre à la question de ce sujet !

Donc, j'ai retravaillé cette librairie et je l'ai adapté pour mes besoins personnels, ce qui donne ceci :

http://pastebin.com/71d3exki

(Vous trouverez comment appeler la fonction sur mon pastebin)


Enjoy !

jeudi 4 juin 2015

DotNet Patcher : MAJ vers 4.4

BugFix : Incohérence dans l'application des paramètres (string encrypt, antidebug,...etc...) : réglé !
Ajouté : Ajout d'un schéma de renommage : Flowing
Ajouté : Invalid metadata
Ajouté : Détection des appels de méthodes de l'espace de nom "System.Reflection"
Modifié : Si vous ajoutez des dépendances alors DNP se charge de les ajouter dans le gestionnaire des règles d'exclusion
Modifié : Amélioration de l'Anti-Tamper

dimanche 3 mai 2015

DotNet Patcher : MAJ vers 4.3.5

BugFix : Le stub créé par le packer ne contenait pas d'informations d'assembly (Custom Attributes)
Modifié : Création d'informations d'assembly (Custom Attributes) avec Mono Cecil.
Modifié : Pas de renommage des paramètres si le renommage des méthodes n'est pas coché !
Modifié : Suppresion du code non utilisé dans la librairie "Vestris.ResourcesLib" !
Modifié : Nettoyage et réorganisation du code source.

DotNet Patcher : MAJ vers 4.3.4

BugFix : Le fichier protégé ne se lancait pas à cause du Packer ---> le stub est désormais créé avec Cecil (plus avec Codedom !)
BugFix : Exclusion de certains corps de méthode lors de l'encryption de chaines, de booléen de chiffres...etc....
BugFix : Problème lors de l'encryption de chaines (ldarg opcode)
BugFix : J'exclue finalement le renommage des méthodes "overriden" (retour en arrière)
BugFix : Detection de l'argument constructeur portant la valeur "system.Resources.Tools.StronglyTypedResourceBuilder" avant le renomage des resources
BugFix : Mauvaise détection de la version du framework depuis la classe CodedomCompiler
Ajouté : Schema de renommage : Symbols
Modifié : Nettoyage et réorganisation du code source.

lundi 13 avril 2015

DotNet Patcher : MAJ vers 4.3.3

BugFix : L'obfuscation (String, Numeric, Boolean) prends désormais effet dans le corps d'une méthode de type constructeur (.cctor)
Ajouté : Possibilité de cacher les appels de méthodes de type Pinvoke (exceptées SendMessage et PostMessage)
Modifié : Nettoyage et réorganisation du code source.

mercredi 18 mars 2015

Télécharger des fichiers en file d'attente avec progressbar et label

Télécharger des fichiers peut, à première vue, sembler facile à coder..... mais lorsqu'on souhaite y apporter des fonctionnalités dans le but d'obtenir un gestionnaire "avancé" de téléchargement de fichiers, cela peut s'avérer plus compliquer !
Dans ce billet il était question de créer un tel gestionnaire mais pour un soucis de ré-utilisabilité, le débat m'a amené à développer en toute modestie une classe en tenant compte des spécificités suivantes :

- Télécharger des fichiers et les enregistrer dans un répertoire de destination de son choix
- Affichage de la progression dans une progressbar et un label (indiquant l'url en cours)
- A la toute fin du téléchargement, afficher le résultat des réussites et des échecs !
- Séparer la mise à jour de l'UI des traitements
- Créer une librairie de classe pouvant être utilisée dans n'importe quel projet

Voilà à quoi pourrait ressembler une telle librairie :


1- Création d'une structure permettant de définir les informations du fichier à télécharger :

Public Structure DownloadInfos
    Public Name As String
    Public Url As String
    Public DestDir As String
End Structure

2- Création d'une classe permettant d'ajouter des urls (+ infos) en liste d'attente pour le téléchargement :

Public Class DownloadList
 
#Region " Fields "
    Private m_list As Queue(Of DownloadInfos)
#End Region
 
#Region " Methods "
 
    Sub New()
        m_list = New Queue(Of DownloadInfos)
    End Sub
 
    Public Sub Enqueue(item As DownloadInfos)
        m_list.Enqueue(item)
    End Sub
 
    Public Function Any() As Boolean
        Return Enumerable.Any(Of DownloadInfos)(m_list)
    End Function
 
    Public Function Dequeue() As DownloadInfos
        Return m_list.Dequeue()
    End Function
 
    Public Sub Clear()
        m_list.Clear()
    End Sub
 
#End Region
End Class

3- Création d'une classe qui permettra de connaitre le statut (réussite ou échec + message d'erreur) de chaque fichier téléchargé à la toute fin de tache :

Imports System.Text
 
Public Class DownloadResult
 
#Region " Enumerations "
    Enum State
        Erreur = 0
        Completed = 1
    End Enum
#End Region
 
#Region " Fields "
    Private ReadOnly m_url As String
    Private ReadOnly m_etat As State
    Private ReadOnly m_message As String
#End Region
 
#Region " Properties "
    Public ReadOnly Property Url As String
        Get
            Return m_url
        End Get
    End Property
 
    Public ReadOnly Property Etat As State
        Get
            Return m_etat
        End Get
    End Property
 
    Public ReadOnly Property Message As String
        Get
            Return m_message
        End Get
    End Property
#End Region
 
#Region " Methods "
    Sub New(url$, etat As State, message$)
        m_url = url
        m_etat = etat
        m_message = message
    End Sub
 
    Public Overrides Function ToString() As String
        If (Me.Etat = State.Completed) Then
            Return ("Téléchargement réussi : " & Me.m_url)
        End If
        Return ("Téléchargement en échec : " & Me.m_url)
    End Function
#End Region

End Class

4- Création d'une classe qui hérite de la classe EventArgs pour connaitre le statut des fichiers téléchargés à la toute fin de la tache :

Imports System.Text
 
Public Class TerminatedEventArgs
    Inherits EventArgs
 
#Region " Fields "
    Private m_Result As IEnumerable(Of DownloadResult)
#End Region
 
#Region " Properties "
    Public ReadOnly Property Result As IEnumerable(Of DownloadResult)
        Get
            Return m_Result
        End Get
    End Property
#End Region
 
#Region " Methods "
    Public Sub New(Result As IEnumerable(Of DownloadResult))
        m_Result = Result
    End Sub
 
    Public Overrides Function ToString() As String
        Return String.Join(Environment.NewLine, m_Result)
    End Function
#End Region
 
End Class

5- Création de la classe principale dans laquelle on permet la mise à jour de la partie UI côté utilisateur au moyen de 2 eventHandler :

Imports System.Net
Imports System.IO
Imports System.ComponentModel
 
Public Class Downloader
    Implements IDisposable
 
#Region " Fields "
    Private WithEvents wc As WebClient
    Private downloadUrls As DownloadList
    Private results As List(Of DownloadResult)
    Private m_filesCount As Integer
#End Region
 
#Region " Properties "
    Public ReadOnly Property FilesCount As Integer
        Get
            Return m_filesCount
        End Get
    End Property
#End Region
 
#Region " Events "
    Public Event ProgressChanged As ProgressChangedDelegate
    Public Event Terminated(sender As Object, e As TerminatedEventArgs)
#End Region
 
#Region " Delegates "
    Public Delegate Sub ProgressChangedDelegate(sender As Object, e As DownloadProgressChangedEventArgs)
#End Region
 
#Region " Methods "
    Public Sub New()
        wc = New WebClient
        downloadUrls = New DownloadList
        results = New List(Of DownloadResult)
        m_filesCount = 0
    End Sub
 
    Public Sub AddInfos(Infos As DownloadInfos)
        downloadUrls.Enqueue(Infos)
        m_filesCount += 1
    End Sub
 
    Public Sub DownloadFiles()
        'On vérifie que la liste des urls n'est pas vide avant de lancer le téléchargement (vérification basée sur la taille de la liste intiale donc après l'appel de la méthode Enqueue)
        If m_filesCount <> 0 Then
            ' On vérifie que la liste n'est pas vide à chaque lancement de la routine
            If downloadUrls.Any() Then
                With wc
                    'L'url "s" est retournée et ensuite supprimée de la liste avec la méthode Dequeue
                    Dim s = downloadUrls.Dequeue()
                    ' On s'attarde ici à tout ce qui pourrait être utile en vue de constituer le chemin de destination du fichier téléchargé !
                    Dim fiName As New FileInfo(New Uri(s.Url).AbsolutePath)
                    ' A noter que le 3ème argument permet de savoir côté UI quel fichier est en cours de téléchargement !
                    .DownloadFileAsync(New Uri(s.Url), s.DestDir & "\" & fiName.Name, s)
                End With
                Return
            Else
                ' C'est ici qu'on déclenche un event pour dire que le téléchargement de tous les fichiers est bien terminé !
                ' On en profite pour passer le résultat final des téléchargements (réussi et échec) en argument de l'event Terminated !
                RaiseEvent Terminated(Me, New TerminatedEventArgs(results))
                ClearLists()
            End If
        End If
    End Sub
 
    Private Sub ClearLists()
        'On vide les listes pour la prochaine utilisation de la fonction DownloadFiles
        downloadUrls.Clear()
        results.Clear()
    End Sub
 
    Private Sub DownloadFiles_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs) Handles wc.DownloadProgressChanged
        ' On déclenche l'event ProgressChangedEvent pour permettre la MAJ de la progressbar côté UI
        RaiseEvent ProgressChanged(sender, e)
    End Sub
 
    Private Sub DownloadFiles_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs) Handles wc.DownloadFileCompleted
        ' On masque cet event côté UI car il permet de savoir à quel moment se termine la fin du téléchargement de chaque fichier !
        If Not e.UserState Is Nothing Then
            Dim Infos = DirectCast(e.UserState, DownloadInfos)
            If e.Error IsNot Nothing Then
                results.Add(New DownloadResult(Infos.Url, DownloadResult.State.Erreur, e.Error.ToString))
            Else
                results.Add(New DownloadResult(Infos.Url, DownloadResult.State.Completed, "Completed"))
            End If
        End If
 
        DownloadFiles()
    End Sub
#End Region
 
#Region "IDisposable Support"
    Private disposedValue As Boolean
 
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                wc.Dispose()
            End If
        End If
        Me.disposedValue = True
    End Sub
 
    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region
 
End Class

6- Enfin l'appel de la classe ,depuis l'application cliente ou formulaire principal (nécessite 1 bouton, 1 progressbar, 1 Label et bien sur le référencement de la librairie portant l'espace de nom "Download" ) :

Imports System.Net
Imports System.ComponentModel
Imports Download
 
Public Class Form1
 
    Private WithEvents DL As New Downloader
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Using DL
            Dim url1 As New DownloadInfos() With {.Name = "GC", .Url = "http://wallace87000.upd.fr/Gif Animation Creator.exe", .DestDir = "D:\Sauvegardes"}
            DL.AddInfos(url1)
            Dim url2 As New DownloadInfos() With {.Name = "IU", .Url = "http://wallace87000.upd.fr/ImaboxUploader.exe", .DestDir = "D:\Sauvegardes"}
            DL.AddInfos(url2)
 
            DL.DownloadFiles()
        End Using
    End Sub
 
    Private Sub DL_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs) Handles DL.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
        Label1.Text = DirectCast(e.UserState, DownloadInfos).Url
    End Sub
 
    Private Sub DL_DownloadTerminated(sender As Object, e As TerminatedEventArgs) Handles DL.Terminated
        MsgBox(e.ToString)
    End Sub
 
End Class

A+
















dimanche 1 mars 2015

DotNet Patcher : MAJ vers 4.3.2

BugFix : Le fichier protégé ne se lançait plus à cause du Packer !
BugFix : L'utilisation des styles visuels de la Progressbar avec affichage de texte causait une exception !

jeudi 19 février 2015

DotNet Patcher : MAJ vers 4.3

BugFix : Plus de message d'erreur à l'issu d'une détection de dlls dépendantes manquantes !
BugFix : En mode Packer le binaire est obfusqué avant d'être empaqueté et le Stub à son tour obfusqué
BugFix : Les fichiers résiduels sont tous supprimés dans le dossier User Temp
BugFix : Plus de crash si le shema de renommage comporte ce paramètre en addition : Empty Namespaces renaming + Not Types renaming
BugFix : Reinitialise l'etat des controles après la fin de tache !
BugFix : Impossible d'utiliser le Packer si l'analyse des dépendances n'est pas activée !
BugFix : Renomme correctement les informations d'assembly après avoir utilisé le remplacement d'icone !
Modifié : Améliorations des fonctions d'encodage et d'encryption (String, Boolean,Integer, Double, Single) !
Ajouté : Possibilité d'embarquer les dlls dépendantes en tant que ressources au lieu de les fusionnées depuis l'onglet "Dependencies" (Embedded ou Merged) avec les options Encryption et/ou compression.

lundi 9 février 2015

DotNet Patcher : MAJ vers 4.2.1

BugFix : Conserve le contenu du répertoire "Protected" si existant !
Modifié : Vous pouvez choisir d'afficher l'assembly protégé depuis la fenêtre résultat à l'issu de l'obfuscation.
Ajouté : Renommage des méthodes avec attribut Overrides et de visibilité "Private" et "Public" !
Ajouté : Renommage des méthodes (Getter et Setter) exceptés celles qui ont le "DebuggerHiddenAttribute" et/ou un retour de type "Generic" !

dimanche 8 février 2015

DotNet Patcher : MAJ vers 4.2

BugFix : La fonction de suppression de dll dépendantes est désormais fonctionnelle !
BugFix : Le renommage des propriétés n'affecte plus la visualisation des ressources !
BugFix : La création d'appels pour les champs de propriétés dans la fonction HideCalls a été supprimé !
BugFix : N'affiche plus d'exception non gérée si aucun paramètre n'a été coché avant l'obfuscation !
BugFix : XertzLoginTheme : déclaration d'un EventHandler pour le contrôle Checkbox !
Modifié : Glissé-déposé du binaire à protéger sur la textbox de la fenêtre principale.
Modifié : Le fichier protégé est créé dans le répertoire "Protected" à la racine du fichier original.
Modifié : XertzLoginTheme : Modifications visuelles du thème original (Button, Checkbox, Listbox, ControlBox)
Ajouté : Affichage de la structure de l'assembly dans un treeview.
Ajouté : Gestion des règles d'exclusion (exclusion, par types et entités) depuis un treeview.

mercredi 4 février 2015

DotNet Patcher : intégration d'un module d'exclusion

Pour ceux qui suivent de très près DNP et DNR, vous avez remarqués récemment la création et l'intégration d'un module "très simpliste" d'exclusion de renommage dans le projet DotNet Renamer !

L'agrémentation de DNR n'est autre qu'une infime partie des modifications que j'apporte en parallèle à DNP, c'est pourquoi l'intégration de ce même module est sur le point de voir le jour dans la nouvelle version de DotNet Patcher.

Ce module a été développé de manière à outre-passer les bugs rencontrés lors du renommage de certains types dans l'assembly qui faisaient appel à l'espace de noms "System.Reflection", ce qui avait pour effet de corrompre certains appels de méthodes !

En addition au module d'exclusion de DNR, il sera possible d'exclure :
- Encryption de String
- Encodage d'Integer
- Encryption de Boolean
.......etc........

Voici en image ce qui armera DNP incessamment sous- peu :


A bientôt.

dimanche 1 février 2015

DotNet Renamer : MAJ vers 1.2

- BugFix : Création puis appel de la méthode Cls_Content.CleanUp (plus besoin de fermer puis ré ouvrir DNR pour protéger un autre binaire !).
BugFix : Renommage des paramètres d'application (après renommage les "Embedded Resources" reste disponibles/visibles !).
BugFix : L’événement CheckedChanged du contrôle checkbox (du theme "XertzLoginTheme") prenait en compte uniquement le click !
Modifié : Remplacement de la classe Cls_CecilHelper par Cls_DnlibHelper.
Modifié : Regroupement du renommage des paramètres et variables dans "Méthodes" depuis l'interface de DNR.
Ajouté : Affichage de la structure de l'assembly dans un treeview.
Ajouté : Gestion des règles d'exclusion (exclusion, par types et entités) depuis un treeview.

mardi 27 janvier 2015

DotNet Renamer : MAJ vers 1.1.9

Modifié : Utilisation de dnlib (MonoCecil a été supprimé !)
Ajouté : Sélection du fichier de sortie (enregistrer sous)
Ajouté : Glissé-déposé le fichier à protéger sur le champs Textbox (en version GUI) sur DotNetRenamer.exe (version cmdline)
Ajouté : Utilisation de l'outil en ligne de commande avec les switch : Full, Medium, Customize
Ajouté : Le fichier DotNetRenamer.ini permet d'enregistrer le preset Customize afin de le charger plus tard

Merci à Motuslechat pour ces idées qui ont permis d'agrémenter le projet



dimanche 11 janvier 2015