2017-08-04 2 views
6

Je travaille avec un addon serveur pour Minecraft, qui se trouve être obscurci. J'ai toujours pensé que, après l'obfuscation, il est impossible de restaurer les noms de classe d'origine parce qu'ils sont complètement supprimés, et c'est ce que j'ai lu partout. Après avoir bricolé pendant un moment, j'ai remarqué que lorsqu'une exception non saisie apparaît dans la console, elle montre les noms obfusqués des classes (par exemple, à cratereloaded.aT.d), puis entre parenthèses, où elle montre généralement la Le nom de la classe et la ligne fautive, il montre le nom de la classe d'origine, ce qui me porte à croire qu'il peut effectivement être désobfuscated. Mais de tous les outils que j'ai essayés, aucun ne semble capable de restaurer le nom de classe d'origine, même si après un examen hexadécimal, j'ai confirmé que le nom de classe original IS était réellement incorporé dans les fichiers .class compilés.Stacktrace de code obfuscated affiche nom de classe non obtus?

Existe-t-il un outil capable de l'utiliser pour restaurer les noms de classe automatiquement?

Exemple stacktrace:

[03:49:57] [Server thread/ERROR]: Error occurred while disabling CrateReloaded v1.3.97.1 (Is it up to date?) 
java.lang.NullPointerException: null 
    at cratereloaded.aT.d(CrateManager.java:303) ~[?:?] 
    at cratereloaded.aT.bm(CrateManager.java:298) ~[?:?] 
    at cratereloaded.aT.cleanup(CrateManager.java:83) ~[?:?] 
    at cratereloaded.aX.disable(Manager.java:27) ~[?:?] 
    at cratereloaded.b.cleanup(CrateReloaded.java:122) ~[?:?] 
    at cratereloaded.b.onDisable(CrateReloaded.java:109) ~[?:?] 
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:266) ~[spigot.jar:git-Spigot-596221b-2c5c611] 
    at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:361) [spigot.jar:git-Spigot-596221b-2c5c611] 
    at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:421) [spigot.jar:git-Spigot-596221b-2c5c611] 
    at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:414) [spigot.jar:git-Spigot-596221b-2c5c611] 
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.disablePlugins(CraftServer.java:342) [spigot.jar:git-Spigot-596221b-2c5c611] 
    at net.minecraft.server.v1_12_R1.MinecraftServer.stop(MinecraftServer.java:464) [spigot.jar:git-Spigot-596221b-2c5c611] 
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:612) [spigot.jar:git-Spigot-596221b-2c5c611] 
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] 

Répondre

6

Je pris un coup d'œil à CrateReloaded. Il semble que bien que le code ait été obfusqué, l'auteur a oublié de supprimer les informations de débogage. Par conséquent, vous voyez la désobfuscation quelque peu magique dans la trace de la pile.

Il existe plusieurs décompilateurs autonomes - CFR, Fernflower, JD-Core, JAD, Procryon, etc., qui peuvent être utilisés pour décompiler JARs dans le code source proche de qualité. Vous pouvez également utiliser des ressources en ligne telles que Decompilers online pour créer des sources.

Si vous utilisez Eclipse, je vous recommande d'ajouter le plugin Eclipse Class Decompiler via Eclipse Marketplace. Ce plugin prend en charge les décompilateurs mentionnés ci-dessus et décodera les fichiers de classe à la volée. Par exemple, si CrateReloaded est inclus en tant que dépendance normale ou dépendance Maven, vous pouvez effectuer une exploration en profondeur dans le JAR via l'explorateur de projet. L'ouverture d'une classe la rend sous sa forme décompilée. Plus important encore, cette décompilation fonctionne automatiquement lors du débogage des étapes en code obfusqué.

Cependant, Je vous encourage fortement à ne pas compter sur les plugins Obfuscated Spigot/Bukkit .

  • Il va à l'encontre de la GPL. Bukkit est GPL, le code qui utilise Bukkit et est distribué est également GPL. Par conséquent l'auteur, tout en conservant tous les droits au code , doit fournir un moyen pour les autres de ... générer, installer et exécuter le code objet et de modifier le travail, y compris les scripts pour contrôler les activités . Il existe certaines exceptions, telles que l'auteur développant le code sous une forme obfusquée plutôt que d'utiliser un utilitaire, ou ont considéré leur travail comme en tant que bibliothèque système. Intentionally obfuscating code envoie le mauvais message, en particulier car il est seulement fonctionnel en raison du code écrit par beaucoup d'autres tels que Bukkit, Apache, Google, etc, qui sont tous open source.

  • Les auteurs de plugins vont et viennent pour une raison ou une autre.J'ai vu beaucoup de bons plugins devenir obsolètes parce que leur auteur a perdu son intérêt, a obtenu un vrai travail, etc. Ayant le code source disponible, permet aux opérateurs de serveur de maintenir une version interne pour leurs serveurs et d'autres pour prendre le relais et continuer développement.

  • Malgré les meilleures intentions, un code d'extension peut être de mauvaise qualité. Un opérateur de serveur prudent examinera toujours le code source du plugin pour évaluer l'expérience de l'auteur et la qualité du code.

  • Certains plug-ins peuvent contenir des vulnérabilités intentionnelles ou non-intentionnelles qui pourraient compromettre un serveur . Avoir le code source disponible permet à l'opérateur et à la communauté d'examiner le code.

  • Certains plugins peuvent souffrir de la fluidité et commencent à en faire trop. Alors que les capacités de base d'un plug-in peuvent être souhaitées, d'autres fonctionnalités wizbang, neat, cool ajoutés dans le temps peuvent gêner, nécessitant plus de configuration, si possible, pour désactiver les fonctionnalités non nécessaires. Nous appelons cela le Swiss Army Knife Syndrome. Dans de tels cas, les opérateurs de serveur peuvent créer leur propre version et mettre à jour le code en tant que nécessaire lors de la publication de nouvelles versions de serveur.

Il est évident que, si votre plugin est destiné à un serveur privé non accessible par le public, certaines de ces préoccupations ne sont pas applicables. Mais si c'est le cas, s'il vous plaît considérez-les.

+0

L'intention du plugin était certainement de faire partie d'un serveur privé, et au moment de poser cette question, j'avais déjà une solution de travail hacky. J'ai été contacté par l'auteur de CrateReloaded après avoir signalé un problème avec son API, et il a accepté volontiers la tâche d'exposer plus de plugin dans les futures mises à jour. – XXLuigiMario

+0

Excellent. Je suis heureux d'apprendre que l'auteur est prêt à fournir du code, ce qui est conforme à la GPL. – Frelling