2012-09-05 3 views
1

Je souhaite protéger certains algorithmes, contre l'ingénierie inverse. Je sais qu'il y a toujours un risque, mais je veux rendre le travail aussi compliqué que possible. Je sais à Java il y a ProGuard et autre obfuscator. Mais le plus de connaissances ne sont pas dans la structure de l'application, mais dans les détails numériques de l'algorithme. Et en lisant à ce sujet, m'a fait douter de la protection de l'algorithme.Obfuscateur pour les algorithmes en Java

Le simple renommage de certaines variables ne rendrait pas assez difficile la rétro-ingénierie des algorithmes. Peut-être vous pouvez me dire, quelles méthodes seraient plus appropriées pour les algorithmes et qui d'obfuscator peut faire le meilleur travail sur les algorithmes. En ce moment, je pense à un peu de travail manuel et à le combiner avec un outil.

+11

Si votre algorithme est si important, n'en donnez aucune implémentation à quelqu'un d'autre. Exécutez-le uniquement sur du matériel que vous * contrôlez * et vendez-le en tant que service. Tout le reste va être inversé. –

+0

Les numéros peuvent-ils être stockés de manière cryptée ou obscurcie? –

+1

Peut-être que vous pouvez traduire l'algo spécifique en tant que c/C++ dll et l'appeler avec JNI? Beaucoup plus difficile à inverseengineer – Rolle

Répondre

1

En supposant que votre algorithme doit être exécuté en tant que bytecode Java, sur des JVM arbitraires. Ensuite, les utilisateurs peuvent pirater leur JVM pour vider le bytecode quelque part, peu importe à quel point vous masquer le processus de chargement des classes. Une fois que vous avez le bytecode, vous pouvez contrôler l'analyse des flux, c'est-à-dire décider quelle information est transmise d'où à où.

Vous pouvez confondre l'ordre des instructions individuelles, mais cela ne changera pas le calcul. Pour quelqu'un qui veut simplement exécuter votre algorithme non modifié, cela ne change rien. Dans quelle mesure une réorganisation va-t-elle empêcher les gens de modifier votre algorithme? Cela dépend beaucoup de l'algorithme et de la complexité du flux de contrôle.

Vous pourriez confondre le flux de contrôle en utilisant une réflexion de façon obscure, ou en implémentant votre propre interpréteur et en l'utilisant pour exécuter l'algorithme. Mais ces deux approches seront probablement sévèrement pénalisées par les performances de l'algorithme. Dans d'autres langues (comme le code x86 natif), vous pourriez confondre le désassembleur en introduisant une ambiguïté sur la façon dont les octets devraient être divisés en instructions, en utilisant certains octets comme partie de queue d'une instruction dans un cas, mais en tant que instruction distincte dans d'autres cas. Mais en Java il n'y a pas une telle option, la signification du bytecode est trop bien définie.

Une façon dont pourrait être en mesure d'obscurcir les choses quelque peu est de mélanger étroitement l'algorithme avec d'autres étapes du programme. Pour un programme en ligne droite, cela peut rendre les choses un peu plus difficiles à suivre, en particulier si vous passez des numéros à travers des objets GUI invisibles ou des choses bizarres similaires. Mais une fois que vous avez besoin de boucles ou similaires, il semble très difficile d'aligner les limites de la boucle, donc je doute que cette approche ait beaucoup de potentiel non plus. Et je doute qu'il y ait un obfuscateur prêt à l'emploi pour cela, alors vous devriez faire les choses à la main.

+0

Je pense que même les possibilités d'obscurcissement du code dans l'assembleur natif ne posent pas vraiment de problème à un attaquant déterminé (par exemple, regardez la vitesse à laquelle les systèmes DRM sont cassés). –

+0

Native Code est pour nous. Ok, je vois le meilleur moyen d'obfuscuer le code est par main. Ce n'est pas sur l'utilisation de l'algorithme, c'est plus sur la compréhension de l'algorithme. Merci pour vos conseils. – GiCo

+0

@GiCo Bien qu'obscurcir le code à la main est une alternative appropriée, je suis un peu déconcerté par ce que vous entendez par détails numériques. Si vous faites référence à certaines constantes, essayez d'éviter les nombres codés en dur (par exemple, stockez les nombres dans des tableaux d'octets et convertissez-les si nécessaire). –

1

Dans mon exeperience, vous pouvez utiliser .so fichier I.e. implémentation native avec l'implémentation java et il est vraiment difficile de suivre avec du code obfsucated mais seul inconvénient est que vous devrez utiliser JNI pour cela.

+0

En réalité, nous voulons nous éloigner du code natif, car nous ne sommes pas sûrs de pouvoir gérer les différentes architectures système. Nous cherchons un moyen de faire une bonne obfuscation, en augmentant le travail peut-être à un mois de travail. Je pense que ce sera un obstacle assez important, parce que les gens ne pourraient pas vraiment l'utiliser sans notre connaissance et donc le bénéfice n'est pas si grand. C'est un petit domaine, tout le monde travaille avec presque tout le monde. – GiCo

Questions connexes