2010-01-27 35 views
2

En utilisant Windows Detours en C++, j'ai vu qu'il est possible de faire des appels de fonction trampoline afin d'intercepter la fonctionnalité de base de Windows et de renvoyer des jeux de résultats personnalisés, sans modifier l'appel de fonction d'origine. Je me demandais s'il y avait un moyen de surcharger un appel Java Randomization afin que je puisse implémenter mon propre ensemble de résultats. Dans une question précédente, I asked if there was any way to make C# mimic the Java randomization function. Comme solution possible, sans encombrer l'autre question, je voulais savoir si quelqu'un avait déjà eu l'expérience de la mise en place d'une solution de type «détouré».Est-il possible de surcharger une implémentation Java de la classe Random?

+0

ne pouvez-vous créer votre propre classe? – Bozho

+0

Si je me trompe: Vous ne demandez pas si vous pouvez hériter de la classe, mais plutôt rediriger les appels, de sorte que les appels à Random.next() appellera votre méthode plutôt que celle par défaut? Si oui, non, il n'y a aucun moyen de le faire, et il n'y en aura jamais; ce serait une énorme vulnérabilité en matière de sécurité ... –

+0

Ne pourriez-vous pas transmettre votre propre semence? – Aaron

Répondre

4

Si vous êtes responsable de l'instanciation d'un objet java.util.Random, vous pouvez sous-classer java.util.Random et instancier votre propre classe à la place. Si un autre code, que vous ne pouvez pas changer, est responsable de l'instanciation, vous ne pouvez évidemment pas utiliser votre propre sous-classe. Je suppose que ce n'est pas une option dans votre cas. Une autre alternative consiste à modifier l'implémentation au moment du chargement de la classe. Fondamentalement, vous réécrivez le bytecode de java.util.Random pour faire autre chose que ce qu'il fait par défaut. L'inconvénient de ceci est que cela affectera toutes les instances de java.util.Random, et pas seulement l'instance que vous voudrez peut-être changer. Là encore, la plupart des codes ne s'appuient pas sur les détails d'implémentation du RNG, ce qui n'est probablement pas un problème.

Javassist est une jolie bibliothèque de codes octets. Il vous permettra de réécrire le code d'octet au moment du chargement de la classe, de sorte que vous pourriez, par exemple. remplacez le corps de la méthode qui produit le nombre aléatoire par un appel à votre propre classe qui implémente l'algorithme RNG dont vous avez besoin.

Vous pouvez écrire un simple processeur de fichiers de classe qui sera exécuté pour la classe java.util.Random. Le code pourrait être quelque chose comme ceci:

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("Random"); // maybe java.util.Random 
CtMethod m = cc.getDeclaredMethod("nextLong"); 
m.setBody("my.super.duper.RandomClass.nextLong()"); 
cc.writeFile();