[C++] Modification dll pour méthode native
Fermé
Utilisateur anonyme
-
6 août 2017 à 15:50
mamiemando Messages postés 33475 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 janvier 2025 - 18 août 2017 à 13:56
mamiemando Messages postés 33475 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 janvier 2025 - 18 août 2017 à 13:56
A voir également:
- [C++] Modification dll pour méthode native
- Suivi de modification word - Guide
- Logiciel gratuit modification pdf - Guide
- Modification dns - Guide
1 réponse
mamiemando
Messages postés
33475
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 janvier 2025
7 815
18 août 2017 à 13:56
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
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