none
system.invalidcastexception specified cast is not valid RRS feed

  • Question

  • Bonjour,

    Je reviens avec une autre question technique, depuis plusieurs semaines j'essaye de faire un programme qui protège un executable de la décompilation ou de l'hex.

    Après plusieurs tests infructueux j'ai enfin trouvé un moyen de le faire en cryptant le fichier à protéger et en l'éxecutant en mémoire.

    Cependant je fais fasse à une erreur que je n'arrive pas à résoudre.

    Je fais donc appel à Alex ou Gilles pour me donner un coup de main !!

    Voilà le code :

    Class Class1
      Public Shared key As String = "azerty"
    
      Public Shared Sub Main()
        Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
        Dim resources As String() = assembly.GetManifestResourceNames()
        For Each resource As String In resources
          If resource.Contains("temp.exe") Then
            Dim resourceStream As System.IO.Stream = assembly.GetManifestResourceStream(resource)
            Dim resourcesBuffer As Byte() = New Byte(resourceStream.Length - 1) {}
            resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length)
            Dim Data As Byte() = DeCrypt(resourcesBuffer, System.Text.Encoding.Default.GetBytes(key))
            Try
              Execute(Data, System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
              resourceStream.Close()
            Catch ex As Exception
              Console.WriteLine(ex.ToString)
              Console.ReadLine()
              resourceStream.Close()
            End Try
    
          End If
        Next
      End Sub
    
      Public Shared Function DeCrypt(ByVal Data() As Byte, ByVal key() As Byte) As Byte()
        Dim i As Integer
        For i = (Data.Length * 2) + key.Length To 0 Step -1
          Data(i Mod Data.Length) = CByte((CInt(Data(i Mod Data.Length) Xor key(i Mod key.Length)) - CInt(Data((i + 1) Mod Data.Length)) + 256) Mod 256)
        Next
        Return Data
      End Function
    
    
      Shared Sub Execute(ByVal data As Byte(), ByVal target As String)
    'code to execute in memory
    End Sub
    End Class

    et voici le message d'erreur :

    system.invalidcastexception specified cast is not valid at Class1.

    Shared Sub Execute(ByVal data As Byte(), ByVal target As String)

    Si vous pouviez m'expliquer le problème ça serait sympa!

    Merci

    • Modifié BreizhNet jeudi 10 juin 2010 02:21 reformatage du code
    mercredi 9 juin 2010 16:13

Réponses

  • Bon, si on vide totalement la fonction Execute. Le but est d'être sûr à 100 % où se situe le problème. Pour moi, cela ne vient pas de l'appel de la fonction Execute mais de l'intérieur de cette fonction.

    Si le corps de cette fonction est vide, l'erreur survient elle ?

    Je pense que pour repartir sur une bonne base il faut :
    1) être sur de l'endroit où se trouve le problème
    2) supprimer ce qui n'a pas de rapport avec le problème (par exemple retourner un tableau d'octets constants dans decypt, récupérer le tableau mais ne pas le traiter dans Execute etc..). Si cela marche, c'est que le problème n'est pas sur l'appel de Execute mais dans le corps de Execute...

    Bon courage.

     

     

     

     

     

     

    • Marqué comme réponse BreizhNet lundi 12 juillet 2010 18:53
    jeudi 17 juin 2010 14:17
    Modérateur

Toutes les réponses

  • Bonjour,

    Pouvez-vous reformater votre code ? Car il est illisible... :-\

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 9 juin 2010 21:37
    Modérateur
  • Bonjour,

    Pouvez-vous reformater votre code ? Car il est illisible... :-\

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr

    Désolé le formatage a sauté après une 1ère édition du post, j'ai modifié.
    jeudi 10 juin 2010 02:22
  • Bonjour,

     

    A première vue, je ne trouve rien qui pourrait générer cette erreur. Pouvez-vous confirmer que l’erreur se produit à l’appel de la méthode Execute ?

     

    Je ne vois aucun ‘cast’ invalide dans cette méthode. Les paramètres attendus sont de type Byte() et string, et la méthode reçoit ‘Data’, qui est de type Byte()

     

    L’exception est interceptée par le ‘catch’ de Try ?

     

    Cordialement,

    Alex

     

    __________________________________________________________________________________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

     

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Workflow Foundation

     

     

    jeudi 10 juin 2010 15:32
  • Bonjour,

    Supprimez le Try/Catch et laissez Visual Studio vous positionner sur la ligne qui pose problème...

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 10 juin 2010 20:31
    Modérateur
  • J'ai uploader le projet complet si vous voulez tester : http://www.share-finder.com/temp.rar
    vendredi 11 juin 2010 12:50
  • Bonjour,

     

    J’ai testé votre projet, en cryptant un exécutable et ensuite en utilisant le code que vous avez fourni dans ce thread pour le décrypter, mais je n’obtiens pas cette erreur. Pouvez-vous confirmer que c’est la méthode Execute qui produit l’erreur ?

     

    Cordialement,

    Alex

    __________________________________________________________________________________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

     

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Workflow Foundation

     

     

    lundi 14 juin 2010 10:45
  • C'est bizarre, vous avez utilisé quel code pour crypter l'executable?

    Oui l'erreur vient bien du sub execute.

    lundi 14 juin 2010 17:59
  •  

    Bonjour,

     

    J’ai utilisé le projet que vous avez chargé sur http://www.share-finder.com/temp.rar

     

    J’ai réussi d’entrer dans Execute sans erreur.

    Comme avez-vous fait pour ajouter l’exe crypté dans les ressources de votre projet ? Et l’erreur d’Execute, elle se manifeste à l’appel de la méthode, donc il s’agit d’une erreur due à la transmission des paramètres, ou elle est déterminée par une instruction à l’intérieur de la méthode ?

     

    Cordialement,

    Alex

    __________________________________________________________________________________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

     

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Workflow Foundation

     

    mardi 15 juin 2010 08:41
  • Merci d'avoir pris le temps de regarder, dans les ressources du project temp.rar, j'ai mis en String1 le code que j'ai posté en 1er, il est compilé en utilisant Codedom, l'executable crypté est ajouté en ressource lors de la compilation avec codedom. Je pense que le problème viens de la décryption du fichier qui ne donne pas la bonne valeur mais je n'en suis pas sur...
    mardi 15 juin 2010 15:32
  • Bonjour,

    L'erreur est elle vraiment dans ce programme ? Je soupçonne qu'il se pourrait que l'erreur soit en fait dans le programme décrypté...

    mardi 15 juin 2010 16:03
    Modérateur
  • J'ai essayé avec plusieurs programmes et l'erreur reste la même.
    mercredi 16 juin 2010 18:38
  • Donc comme indiqué par Gilles, que se passe t'il si on supprime le try/catch pour voir la ligne exacte où se situe l'erreur ? Cela permettrait de voir quel est l'emplacement de l'erreur qui est je pense dans la procédure Execute.

    Comme cela fonctionne pour Alex je penserais à un problème de version (qq chose comme deux types homonymes mais l'un n'étant pas en même version que l'autre, les deux types ne sont en fait pas les mêmes ???)

    jeudi 17 juin 2010 08:02
    Modérateur
  • J'ai essayé de compiler avec visual studio le code que je compilai via mon application et codedom, j'ai ajouté l'executable crypté manuellement en ressource et ça fonctionne sans erreurs. Par contre quand je compile en utilisant codedom, l'executable généré ne fonctionne pas.

    Lorsque je debug l'executable généré avec codedom voilà le message d'erreur que j'obtient (sans try catch)

    System.InvalidCastException was unhandled
      Message="Specified cast is not valid."
      Source="Protected"
      StackTrace:
           at BuiltIn.Class1.Execute(Byte[] data, String target)
           at BuiltIn.Class1.Main()

    Le problème doit surement venir de la façon dont est compilé l'executable, voici le code que j'utilise pour compiler et ajouter l'exe crypté en ressources :

     

     

     Private Function CompileCode(ByVal _CodeProvider As System.CodeDom.Compiler.CodeDomProvider, ByVal _SourceCode As String, ByVal _ExeFile As String, ByVal _ResourceFile As String) As Boolean
      Dim _CodeCompiler As System.CodeDom.Compiler.ICodeCompiler = _CodeProvider.CreateCompiler()
      Dim _CompilerParameters As New System.CodeDom.Compiler.CompilerParameters()
      _CompilerParameters.OutputAssembly = _ExeFile
      _CompilerParameters.GenerateExecutable = True
      _CompilerParameters.GenerateInMemory = True
      _CompilerParameters.WarningLevel = 3
      _CompilerParameters.TreatWarningsAsErrors = False
      _CompilerParameters.CompilerOptions = "/imports:Microsoft.VisualBasic,System,System.Collections,System.Collections.Generic,System.Diagnostics /optioncompare:Binary /optionexplicit+ /optionstrict:custom /nowarn:42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 /rootnamespace:Protected"
     _CompilerParameters.TempFiles = New System.CodeDom.Compiler.TempFileCollection(".", False) _CompilerParameters.EmbeddedResources.Add(_ResourceFile) Try Dim _CompilerResults As System.CodeDom.Compiler.CompilerResults = Nothing _CompilerResults = _CodeCompiler.CompileAssemblyFromSource(_CompilerParameters, _SourceCode) If _CompilerResults.Errors.Count > 0 Then For i As Integer = 0 To _CompilerResults.Errors.Count - 1 myerrors = (i.ToString() & ": ") + _CompilerResults.Errors(i).ToString() + Environment.NewLine Next Return False Else End If Catch Return False End Try Return True End Function Private Sub Protect() If CompileCode(New Microsoft.VisualBasic.VBCodeProvider(), My.Resources.String1.Replace("azerty", TextBox2.Text), mypath, output) Then Textlogs.AppendText("Executable successfully protected" & vbNewLine) File.Delete(output) Else Textlogs.AppendText("Error" & vbNewLine) Textlogs.AppendText(myerrors + Environment.NewLine) File.Delete(output) End If End Sub

     

    Je vous remercie encore tous les 3 pour le temps que vous prenez à m'aider.

    jeudi 17 juin 2010 09:46
  • Cela donne quoi si on génère le code source au lieu de compiler directement ? Je dirais que c'est l'application générée via CodeDom qui comporte cette erreur de "casting". Donc générer juste le source et le charger dans VS pour l'exécuter et voir où se situe l'erreur dans l'application générée...

     

    jeudi 17 juin 2010 12:59
    Modérateur
  • J'ai récupéré le code généré, je l'a mis dans un nouveau projet et ça fonctionne... c'est à n'y rien comprendre...

    jeudi 17 juin 2010 13:50
  • Bon, si on vide totalement la fonction Execute. Le but est d'être sûr à 100 % où se situe le problème. Pour moi, cela ne vient pas de l'appel de la fonction Execute mais de l'intérieur de cette fonction.

    Si le corps de cette fonction est vide, l'erreur survient elle ?

    Je pense que pour repartir sur une bonne base il faut :
    1) être sur de l'endroit où se trouve le problème
    2) supprimer ce qui n'a pas de rapport avec le problème (par exemple retourner un tableau d'octets constants dans decypt, récupérer le tableau mais ne pas le traiter dans Execute etc..). Si cela marche, c'est que le problème n'est pas sur l'appel de Execute mais dans le corps de Execute...

    Bon courage.

     

     

     

     

     

     

    • Marqué comme réponse BreizhNet lundi 12 juillet 2010 18:53
    jeudi 17 juin 2010 14:17
    Modérateur
  • Bonjour,

    BreizhNet, avez vous avancé suite aux remarques de Patrice SCRIBE ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    lundi 12 juillet 2010 09:24
    Modérateur
  • Bonjour,

    BreizhNet, avez vous avancé suite aux remarques de Patrice SCRIBE ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr

    Non, j'ai abandonné et j'ai utilisé une manière différente de codedom pour ajouter mon exe dans les resources.

    Je marque la réponse de patrice comme "réponse" et je vous remercie du temps que vous avez pris à me répondre.

    lundi 12 juillet 2010 18:53