Modifier un programme en route

Fermé
nico - 24 janv. 2008 à 10:09
 nico - 25 janv. 2008 à 08:59
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
A voir également:

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 655
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.
0
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
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.
0
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
0
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.
0

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
0
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
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.
0
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.
0
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
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.
0
ok merci
ca va déjà m'aider à m'orienter
0
j'ai regarder ta doc
apparemment ca peux marcher
le problème c'est que je travaille sous linux donc je pourrai pas injecter une dll
0
Ya plus personne pour m'aider?
0