MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Signer un mod

    Planifier Épinglé Verrouillé Déplacé Java & outils de développement
    forgegradle
    14 Messages 4 Publieurs 3.3k Vues 3 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • SCAREXS Hors-ligne
      SCAREX
      dernière édition par robin4002

      Sommaire

      • Introduction
      • Pré-requis
      • Code
        • build.gradle
        • Classe principale
        • FML Plugin
      • Crédits

      Introduction

      Dans ce tutoriel je vais vous montrer comment sécuriser votre mod.

      ATTENTION ! Lisez d’abord cette partie avant d’attaquer le tutoriel

      La technique ici est de rajouter une signature au jar, mais cette technique n’est pas infaillible ! Si la personne supprime la signature et arrive à modifier la classe qui regarde la signature dans votre mod par n’importe quel moyen vous n’aurez aucun moyen de contrer ça.

      Pré-requis

      • Installer et configurer l’espace de travail de Forge

      Code

      Tout d’abord il va vous falloir créer un fichier où vous allez stocker vos informations sur votre signature, pour ça lancez la console (dans le dossier de votre mod si vous voulez placer le fichier dans le dossier de votre mod) :
      keytool -genkey -alias <votre pseudo> -keyalg RSA -keysize 2048

      Si vous voulez modifier l’emplacement du keystore rajoutez -keystore <emplacement>
      Par défaut le fichier se trouve dans C:/Users/<utilisateur>/.keystore sous windows, et /home/<utilisateur>/.keystore sous Linux

      Vous devrez donc répondre à plusieurs questions : la première sera le mot de passe du keystore ensuite vous aurez des questions plus personnelles (conseil : ne mettez pas vos informations personnelles car ces informations se trouveront dans votre jar) comme votre nom et prénom (ou pseudo), ville, pays etc. Ensuite donnez le mot passe de la clé du keystore, par défaut c’est celle du keystore (entrez pour laisser les valeurs par défaut).

      Maintenant rendez-vous dans le dossier de gradle général : par défaut le dossier se trouve dans C:/Users/<utilisateur>/.gradle, /home/<utilisateur>/.gradle sous linux et /Users/<utilisateur>/.gradle sous Max. Si vous avez modifié l’emplacement dans gradle rendez-vous dans exécuter et tapez %GRADLE_USER_HOME% ce qui vous amènera directement dans le dossier de gradle.

      Vous devriez voir un fichier appelé gradle.properties, si ce n’est pas le cas créez le et remplissez ces informations :

      • keyStore=<lien vers votre keystore créé plus tôt>
      • keyStoreAlias=<votre pseudo>
      • keyStorePass=<mot de passe du keystore>
      • keyStoreKeyPass=<mot de passe de la clé du keystore>

      build.gradle :

      Rajoutez une tâche signJar (ou un autre nom) :

      task signJar(type: SignJar) {
          onlyIf { // On exécute seulement s'il y a un keystore spécifié dans le gradle.properties
              project.hasProperty('keyStore')
          }
      
          keyStore = project.keyStore // on indique le keystore ainsi que toutes les autres variables
          alias = project.keyStoreAlias
          storePass = project.keyStorePass
          keyPass = project.keyStoreKeyPass
          inputFile = jar.archivePath // On indique le jar d'entrée et de sortie
          outputFile = jar.archivePath
      }
      
      assemble.dependsOn signJar // Lorsque l'on compile le jar on le signe
      

      Si vous voulez signer plusieurs jar rajoutez une tâche pour chaque en changeant l’emplacement du jar en n’oubliant pas de les exécuter.

      Maintenant vous allez devoir rajouter la signature dans votre mod, donc si vous utilisez l’interface @Mod suivez le premier cas sinon si vous utilisez un plugin fml suivez le deuxième cas.

      Classe principale :

      Lancez la console et tapez : keytool -list -alias <votre pseudo> -v (rajoutez -keystore <emplacement du keystore> si vous utilisez un emplacement spécifique).
      Vous allez donc devoir taper le mot de passe du keystore, puis les informations du keystore s’afficheront, ce qui nous intéresse c’est le SHA1 : rendez-vous dans l’interface @Mod et rajoutez la variable certificateFingerprint de type String avec comme valeur le SHA1 dans la console sans les “:” et en minuscules.

      exemple : @Mod(modid = “modid”, certificateFingerprint = “ab57cd89ef”)

      Maintenant rajoutez une fonction avec comme paramètre FMLFingerPrintViolationEvent avec l’annotation @EventHandler. Cette fonction sera appelée si le certificat n’est pas valide (en réalité cette fonction ne sera appelée que si vous spécifiez la variable certificateFingerprint mais qu’il n’y pas de signature, dans le cas où le certificat n’est pas correct c’est la JVM qui empêchera la lecture du fichier)

      FML Plugin :

      Si vous utilisez un plugin fml ça va être différent :

      Si vous avez un ModContainer ré-écrivez la fonction getSigningCertificate et renvoyez ceci :

      @Override
          public Certificate getSigningCertificate() {
              Certificate[] certificates = getClass().getProtectionDomain().getCodeSource().getCertificates(); // On récupère les certificats
              return certificates != null ? certificates[0] : null; // On renvoie le premier certificat s'il existe
          }
      

      Maintenant dans votre plugin fml rajoutez une classe de setup :

      @Override
          public String getSetupClass() {
              return CallHook.class.getName();
          }
      
      public class CallHook implements IFMLCallHook
          {
              @Override
              public Void call() throws Exception {
                  if (getClass().getProtectionDomain().getCodeSource().getCertificates() == null) { // On regarde s'il n'y a pas de certificat
                      System.out.println("DO NOT USE THIS JAR !"); // On affiche un message
                  }
                  return null;
              }
      
              @Override
              public void injectData(Map <string, object="">data) {}
          }
      

      Grâce à ceci un message s’affichera en disant de ne pas utiliser le mod s’il n’y a pas de certificat. Si un fichier a été modifié le fichier sera considéré comme illisible ce qui dans la plupart des cas fera crasher le jeu ou bien votre mod ne sera pas chargé.

      En revanche comme je l’ai dit au début si une personne supprime le certificat et modifie les fonctions regardant si le certificat est présent vous n’avez AUCUN moyen fiable de savoir si le jar a été modifié.

      Crédits

      Rédaction :

      • SCAREX

      Correction :

      • Toutoune1008

      Creative Commons
      Ce tutoriel de SCAREX publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

      retourSommaire des tutoriels

      Site web contenant mes scripts : http://SCAREXgaming.github.io

      Pas de demandes de support par MP ni par skype SVP.
      Je n'accepte sur skype que l…

      1 réponse Dernière réponse Répondre Citer 0
      • D Hors-ligne
        Degraduck
        dernière édition par

        Salut par curiosité j’ai testé j’ai tout fais sauf l’étape plugin FML car je ne sais aps ce qu’est un plugin FML xD mais rien ne se passe je vois pas en quoi le mod est signer 🙂

        1 réponse Dernière réponse Répondre Citer 0
        • robin4002R Hors-ligne
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
          dernière édition par

          Pour vérifier que ton mod est bien signé, modifies un fichier du jar, logiquement il va crasher au lancement.

          1 réponse Dernière réponse Répondre Citer 0
          • D Hors-ligne
            Degraduck
            dernière édition par robin4002

            Aucun crash ^^

            Mon fichier gradle.properties:

            keyStore=C:\Users\Sullivan.keystore
            keyStoreAlias=Degraduck
            keyStorePass=monmdp
            keyStoreKeyPass=monmdp
            

            Mon code dans la class principale:

            @Mod(modid = Constants.MODID, name = Constants.MODNAME, version = Constants.MODVERSION, certificateFingerprint = "13acf16405b3ac8d7ccab68563acefda5f644c75")
            
            @EventHandler
            public void signature(FMLFingerprintViolationEvent event){
            
            }
            
            1 réponse Dernière réponse Répondre Citer 0
            • robin4002R Hors-ligne
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs
              dernière édition par

              As-tu bien ajouté la tâche signJar dans le fichier build.gradle ?

              1 réponse Dernière réponse Répondre Citer 0
              • D Hors-ligne
                Degraduck
                dernière édition par robin4002

                Oui voici mon fichier:

                buildscript {
                repositories {
                mavenCentral()
                maven {
                name = "forge"
                url = "http://files.minecraftforge.net/maven"
                }
                maven {
                name = "sonatype"
                url = "https://oss.sonatype.org/content/repositories/snapshots/"
                }
                }
                dependencies {
                classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
                }
                }
                
                apply plugin: 'forge'
                
                version = "1.0"
                group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
                archivesBaseName = "modid"
                
                minecraft {
                version = "1.7.10-10.13.4.1558-1.7.10"
                runDir = "eclipse"
                }
                
                dependencies {
                // you may put jars on which you depend on in ./libs
                // or you may define them like so..
                //compile "some.group:artifact:version:classifier"
                //compile "some.group:artifact:version"
                
                // real examples
                //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
                //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
                
                // for more info…
                // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
                // http://www.gradle.org/docs/current/userguide/dependency_management.html
                
                }
                
                processResources
                {
                // this will ensure that this task is redone when the versions change.
                inputs.property "version", project.version
                inputs.property "mcversion", project.minecraft.version
                
                // replace stuff in mcmod.info, nothing else
                from(sourceSets.main.resources.srcDirs) {
                include 'mcmod.info'
                
                // replace version and mcversion
                expand 'version':project.version, 'mcversion':project.minecraft.version
                }
                
                // copy everything else, thats not the mcmod.info
                from(sourceSets.main.resources.srcDirs) {
                exclude 'mcmod.info'
                }
                }
                
                task signJar(type: SignJar) {
                onlyIf { // On exécute seulement s'il y a un keystore spécifié dans le gradle.properties
                project.hasProperty('keyStore')
                }
                
                keyStore = project.keyStore // on indique le keystore ainsi que toutes les autres variables
                alias = project.keyStoreAlias
                storePass = project.keyStorePass
                keyPass = project.keyStoreKeyPass
                inputFile = jar.archivePath // On indique le jar d'entrée et de sortie
                outputFile = jar.archivePath
                }
                
                assemble.dependsOn signJar // Lorsque l'on compile le jar on le signe
                
                1 réponse Dernière réponse Répondre Citer 0
                • robin4002R Hors-ligne
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                  dernière édition par

                  Dans ta fonction public void signature(FMLFingerprintViolationEvent event){
                  ajoutes un System.out.println(“empreinte invalide”);
                  et regardes s’il affiche après avoir modifié le jar.

                  1 réponse Dernière réponse Répondre Citer 0
                  • D Hors-ligne
                    Degraduck
                    dernière édition par robin4002

                    Oui en lançant j’ai bien:

                    [14:34:53] [Client thread/INFO] [STDOUT]: [com.degraduck.atlantidecraft.core.AtlantideCraft:signature:63]: empreinte invalide
                    
                    1 réponse Dernière réponse Répondre Citer 0
                    • robin4002R Hors-ligne
                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                      dernière édition par

                      Donc ça fonctionne comme prévu.
                      À toi de faire ce que tu veux dans la fonction en question.

                      1 réponse Dernière réponse Répondre Citer 0
                      • D Hors-ligne
                        Degraduck
                        dernière édition par

                        Ah d’accord je pensais que ça crashait au lancement tout seul, j’avais pas compris que c’était a moi de lui dire de crash dans ma fonction^^

                        1 réponse Dernière réponse Répondre Citer 0
                        • robin4002R Hors-ligne
                          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                          dernière édition par

                          C’était aussi ce que je pensais au début.

                          1 réponse Dernière réponse Répondre Citer 0
                          • Flow ArgF Hors-ligne
                            Flow Arg Moddeurs confirmés
                            dernière édition par

                            Est-on réellement obliger de passer par le keytool de java ? Ou alors peut-on également et manuellement calculer le sha-1 du fichier et de le mettre en paramètre du @Mod ? Car si je comprend bien, le sha1 mis dans l’annotation correspond au sha1 de notre mod, je me trompe ?

                            Mon GitHub
                            Mon repo Maven
                            Mon Updater
                            Je suis un membre apprécié et joueur, j'ai déjà obtenu 10 points de réputation.

                            1 réponse Dernière réponse Répondre Citer 0
                            • robin4002R Hors-ligne
                              robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                              dernière édition par robin4002

                              Le sha1 qui se trouve dans @mod c’est la signature de la clé avec laquelle tu signes, pas celle du mod.

                              Il y a probablement moyen de signer sans keytool mais je ne vois pas l’intérêt de vouloir se passer de cet outil qui simplifie la procédure.
                              https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html

                              1 réponse Dernière réponse Répondre Citer 0
                              • Flow ArgF Hors-ligne
                                Flow Arg Moddeurs confirmés
                                dernière édition par

                                merci de ces informations !

                                Mon GitHub
                                Mon repo Maven
                                Mon Updater
                                Je suis un membre apprécié et joueur, j'ai déjà obtenu 10 points de réputation.

                                1 réponse Dernière réponse Répondre Citer 0
                                • 1 / 1
                                • Premier message
                                  Dernier message
                                Design by Woryk
                                ContactMentions Légales

                                MINECRAFT FORGE FRANCE © 2024

                                Powered by NodeBB