Modifier un programme en route
Fermé
Bonjour,
je souhaite créer un programme qui me permettra de le modifier sans l'arrêter
est-ce que quelqu'un sait comment le faire?
j'avais pour idée d'écraser la fonction que j'ai écrite en utilisant des pointeurs de fonctions mais j'ai besoin d'un peu plus d'info pour le faire
merci d'avance
je souhaite créer un programme qui me permettra de le modifier sans l'arrêter
est-ce que quelqu'un sait comment le faire?
j'avais pour idée d'écraser la fonction que j'ai écrite en utilisant des pointeurs de fonctions mais j'ai besoin d'un peu plus d'info pour le faire
merci d'avance
A voir également:
- Modifier un programme en route
- Modifier dns - Guide
- Modifier liste déroulante excel - Guide
- Modifier story facebook - Guide
- Comment modifier un pdf - Guide
- Mettre en veille un programme - Guide
11 réponses
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 662
24 janv. 2008 à 10:18
24 janv. 2008 à 10:18
C'est le genre de chose facile à faire en Python.
Tu peux modifier en cours d'éxecution des méthodes, fonctions, etc.
Tu peux modifier en cours d'éxecution des méthodes, fonctions, etc.
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
24 janv. 2008 à 10:49
24 janv. 2008 à 10:49
Bonjour,
Je couperais la chose en deux, il y a les langages interprétés où on peut régénérer du code assez facilement et les langages compilés...
Dans le cas du Java et peut-être d'autres, il existe la classe Class et des classes représentant chaque classe du programme (à partir de n'importe quelle instance je pense que l'on peut appeler getClass() ou un truc du style, on peut je pense accéder jusqu'au byte code à partir de là (à moins que la machine virtuelle utilisée quand j'ai fait ça était "spéciale").
Dans le cas de langage type C/C++, on peut ajouter du code dynamiquement en générant un fichier source, en le compilant dans une librairie avec un appel système et en chargeant cette libraire dynamiquement pour accéder à ses fonctions. (Oui, c'est un peu lourd ^^) On pourra noter que chaque .class en Java est une librairie dynamique et on peut peut-être même l'appeler directement une fois le fichier compilé et dans le même répertoire que la classe appelante. Sinon il faut faire avec la méthode statique "forName" de la classe Class pour trouver la classe voulue et en obtenir des instances avec "newInstance", par contre je ne pense pas qu'on puisse créer dynamiquement des nouvelles classes sans en recompiler. Pour le C++ et dans le but de modifier réellement, je compilerais une fonction, puis on peut charger le fichier module (.o, .obj...), l'analyser pour récupérer le code voulu et aller modifier la copie en mémoire du code du programme à modifier à la volée. (Et il faudra là un bon paquet de docs sur le format des exécutables....)
M.
Je couperais la chose en deux, il y a les langages interprétés où on peut régénérer du code assez facilement et les langages compilés...
Dans le cas du Java et peut-être d'autres, il existe la classe Class et des classes représentant chaque classe du programme (à partir de n'importe quelle instance je pense que l'on peut appeler getClass() ou un truc du style, on peut je pense accéder jusqu'au byte code à partir de là (à moins que la machine virtuelle utilisée quand j'ai fait ça était "spéciale").
Dans le cas de langage type C/C++, on peut ajouter du code dynamiquement en générant un fichier source, en le compilant dans une librairie avec un appel système et en chargeant cette libraire dynamiquement pour accéder à ses fonctions. (Oui, c'est un peu lourd ^^) On pourra noter que chaque .class en Java est une librairie dynamique et on peut peut-être même l'appeler directement une fois le fichier compilé et dans le même répertoire que la classe appelante. Sinon il faut faire avec la méthode statique "forName" de la classe Class pour trouver la classe voulue et en obtenir des instances avec "newInstance", par contre je ne pense pas qu'on puisse créer dynamiquement des nouvelles classes sans en recompiler. Pour le C++ et dans le but de modifier réellement, je compilerais une fonction, puis on peut charger le fichier module (.o, .obj...), l'analyser pour récupérer le code voulu et aller modifier la copie en mémoire du code du programme à modifier à la volée. (Et il faudra là un bon paquet de docs sur le format des exécutables....)
M.
Je veux le faire avec Ruby mais mon code est en C
Pour l'instant je m'occupe de le changer en C pour savoir si c'est possible
je crois avoir compris ce que tu veux dire mahmah
je sais pas si j'arriverais à le faire mais je vais essayer
en tout cas merci
Pour l'instant je m'occupe de le changer en C pour savoir si c'est possible
je crois avoir compris ce que tu veux dire mahmah
je sais pas si j'arriverais à le faire mais je vais essayer
en tout cas merci
et sinon je voulais savoir un truc
Est-il possible d'affecter au programme qui risque d'être changé ou à la fonction une adresse mémoire?
En gros faire un pointeur de fonction (ou de programme) dans la librairie où l'on met cette fonction
et aller la chercher directement à partir du programme
un truc du genre, je sais pas si vous comprenez le système
en gros c'est un programme en Ruby qui doit mettre mon code en C(compilé serait mieux) à une adresse défini par le programme en C.
Est-il possible d'affecter au programme qui risque d'être changé ou à la fonction une adresse mémoire?
En gros faire un pointeur de fonction (ou de programme) dans la librairie où l'on met cette fonction
et aller la chercher directement à partir du programme
un truc du genre, je sais pas si vous comprenez le système
en gros c'est un programme en Ruby qui doit mettre mon code en C(compilé serait mieux) à une adresse défini par le programme en C.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
en fait c'est la dernière méthode qui me convient le mieux
celle qui est en C++
As-tu des cocs pour moi MahMah
celle qui est en C++
As-tu des cocs pour moi MahMah
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
24 janv. 2008 à 12:21
24 janv. 2008 à 12:21
Si j'ai bien compris, un programme C doit modifier le code d'un programme Ruby pendant son exécution, c'est bien ça ?
Hmmm... je me demande si ce sera possible de modifier, au sens réécrire un bout de code... (humainement c'est faisable, pour un programme c'est plus chaud.)
Par contre c'est possible de remplacer une fonction complètement.
Et surtout, le Ruby c'est un langage interprété ça non ? Avec beaucoup de chance il peut suffir de modifier un fichier source directement (enfin une copie) A voir si il sera relu par l'interpréteur et comment demander d'inclure de nouveaux fichiers à la volée. Sinon, autre solution: écrire un interpréteur Ruby qui maîtrisera complètement le code exécuté mais sera peut-être moins performant et il faut voir si tu as des contraintes d'utilisations car celle-ci impose tout de même de changer tout l'interpréteur pour chaque utilisateur) Il faut voir également si c'est possible de faire un simple surcouche qui lit les fichiers sources, fait les modifications que tu souhaites et rebalance le résultat dans l'interpréteur original. (Et ça ce serait top je pense)
Sinon, si c'est effectivement un langage compilé je hookerais des fonctions entières.
Format Windows (avec plein de liens en bas)
M.
Hmmm... je me demande si ce sera possible de modifier, au sens réécrire un bout de code... (humainement c'est faisable, pour un programme c'est plus chaud.)
Par contre c'est possible de remplacer une fonction complètement.
Et surtout, le Ruby c'est un langage interprété ça non ? Avec beaucoup de chance il peut suffir de modifier un fichier source directement (enfin une copie) A voir si il sera relu par l'interpréteur et comment demander d'inclure de nouveaux fichiers à la volée. Sinon, autre solution: écrire un interpréteur Ruby qui maîtrisera complètement le code exécuté mais sera peut-être moins performant et il faut voir si tu as des contraintes d'utilisations car celle-ci impose tout de même de changer tout l'interpréteur pour chaque utilisateur) Il faut voir également si c'est possible de faire un simple surcouche qui lit les fichiers sources, fait les modifications que tu souhaites et rebalance le résultat dans l'interpréteur original. (Et ça ce serait top je pense)
Sinon, si c'est effectivement un langage compilé je hookerais des fonctions entières.
Format Windows (avec plein de liens en bas)
M.
en fait c'est l'inverse
c'est avec ruby que je dois changé mon programme C
je dois mettre dans la mémoire des fichiers .obj à un endroit précis pour pouvoir l'utiliser en C
Et donc le truc à faire, c'est de le mettre au même endroit que l'ancien.
Ca, ca serait la meilleur des solutions
Après j'ai bien pensé à utiliser des pointeurs de fonctions.
Il suffirait que je mette mes fonctions compilés dans la mémoire ou un truc comme ca.
Le problème c'est que je ne sais pas le faire.
c'est avec ruby que je dois changé mon programme C
je dois mettre dans la mémoire des fichiers .obj à un endroit précis pour pouvoir l'utiliser en C
Et donc le truc à faire, c'est de le mettre au même endroit que l'ancien.
Ca, ca serait la meilleur des solutions
Après j'ai bien pensé à utiliser des pointeurs de fonctions.
Il suffirait que je mette mes fonctions compilés dans la mémoire ou un truc comme ca.
Le problème c'est que je ne sais pas le faire.
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
24 janv. 2008 à 14:13
24 janv. 2008 à 14:13
Je ne connais rien au ruby et mais si c'est imposé comme langage de base et bien... je ferais une dll en C et l'importerais en Ruby. (A moins que le but ne soit pas le programme final mais sa réalisation en Ruby... )
Tu pourras trouver un exemple C de hooking là.
Injection d'une DLL
Je ne peux pas t'aider plus..
M.
Tu pourras trouver un exemple C de hooking là.
Injection d'une DLL
Je ne peux pas t'aider plus..
M.