[C++] Modification dll pour méthode native

Fermé
Utilisateur anonyme - 6 août 2017 à 15:50
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 18 août 2017 à 13:56
Bonjour,

je ne sais pas si je fais bien de poster dans cette section mais bon... Alors voici mon problème et ce que j'ai essayé :

Je cherche à modifier le "chemin d'accès" d'une dll vers une méthode native Java (ou du moins le package d'accès). J'ai essayer de modifier à partir d'un éditeur hexadécimal mais lorsque je change le package, d'autres choses changent comme le nom de certaines fonctions/méthodes (je ne sais pas comment ça ce dis en c++) ce qui rend la dll inutilisable (en plus que le nom n'est pas correct car au lieu que ça ressemble à ex : Java_package_subPackage et bien ça ressemble à ça :
_package_subpackage) je vous demande donc comment je pourrai faire sachant que c'est une dll c++, merci de votre aide même si ce problème est différent (je pense) des autres problèmes de ce forum ... Bonne journée !

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 août 2017 à 13:56
Bonjour,

Voyons d'abord si j'ai compris ton problème. Concrètement, une librairie liste d'abord les symboles (fonctions, etc...) fournies par la librairie, et l'adresse du symbole (donc le code la fonction) dans ladite librairie. Cela suffit par la suite à lier un programme avec une ou plusieurs fonctions de la librairie. Si je comprends bien ce que tu veux faire, tu souhaites détourner une fonction de son code initial pour lui faire exécuter un bout de code "à toi" écrit en java.

En soi, injecter du code machine à soi dans une librairie est faisable pour peu que tu aies les droits en écriture sur la dll. Mais par contre injecter du java dans une librairie, ce n'est pas possible.

En effet :
- Le code java est exécuté par une JVM.
- Un binaire compilé en java n'est pas du code machine (contrairement au C++), mais du bytecode. Il n'est donc pas réutilisable en tant que tel dans une librairie.
- Contrairement au bytecode, le binaire généré par un compilateur C/C++ dépend de l'OS, de son architecture, et du compilateur. Autant dire que c'est plus compliqué qu'un copier coller :-)

À la rigueur tu pourrais imaginer que la fonction modifiée fasse un appel système à un programme java depuis le code C++. Ce n'est clairement pas une solution très élégante (en particulier si java n'est pas installé sur la machine en question).

Il y aurait deux manières plus propres de faire.
- Si tu as accès au code source de la librairie, il serait plus simple de la recompiler en modifiant la fonction que tu veux corriger.
- Une autre manière de faire serait de modifier le programme qui appelle la fonction que tu veux modifier pour qu'il appelle la fonction de ton choix. Il est notamment possible dans ce cas de "rediriger" un symbole :
https://stackoverflow.com/questions/12905187/replacing-symbol-from-object-file-at-compile-time-for-example-swapping-out-main
https://stackoverflow.com/questions/7204836/renaming-symbols-at-compile-time-without-changing-the-code-in-a-cross-platform-w

Toutefois, ces deux solutions nécessitent une recompilation (soit du programme, soit de la librairie). Tenter de faire la même chose "à la main" avec un éditeur hexadécimal est beaucoup plus compliqué (pour ne pas dire irréalisable).

Bonne chance
0