Thérapie codique

Fermé
biohazard - 10 févr. 2009 à 21:11
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 10 févr. 2009 à 22:52
Bonjour,
Je voudrait savoir si on pourrait créer un programme qui modifie le code d'un autre programme? Avec ca, on pourrait faire de la "thérapie codique" (thérapie génique appliquée aux programmes informatiques), nan? Genre ajouter une instruction à plein de programmes en une fois, ou comparer un code et corriger les erreurs juste avec un programme? Est-ce que ca existe? Je sais ca parait impossible mais en s'attaquant directement au binaire ou en utilisant un assembleur ce serait faisable nan? Je voudrait aussi savoir quel bouts de code permettrait de faire ca (déja, choper le code du programme cible, ajouter le bout de code voulu et ensuite le réinsérer en mémoire à la place de l'ancien code du programme)?
A voir également:

7 réponses

Bonjour

Je voudrait savoir si on pourrait créer un programme qui modifie le code d'un autre programme Oui, ça se fait très courament. Ça s'appelle un virus quand c'est fait avec de mauvaises intentions et un patch quand c'est fait avec de bonnes intentions.
0
Voila, moi c'est des patchs que je veux faire. Vous pourriez m'expliquer comment ca marche? Quels code utiliser pour modifier le code d'un autre programme?
0
Pour faire un patch d'un programme, il n'y a aucune règle générale. Il faut connaître ce programme en particulier et surtout de quelles corrections il a besoin.
0
Ba imaginons que par exemple je veuille modifier ce programme (je sais c hyper basique, je débute):
#include <stdio.h>
int pow(int x, int y)
{
int pow=1
for(;y>0;y--)
pow*=x;
return pow;
}
int facto(int a)
{
int c=1;
int b;
for (b=a,b>0,b--)
{
c*=b;
}
return c;
)
int main (void)
{
int a;
int b;
int c;
int P;
printf("entrez un nombre d'éléments\n");
scanf("%i",&a);
printf("entrez le nombre d'états de ces éléments\n");
scanf("%i",&b)
int c= pow((1/2),b)
P= c*(facto(a))/((facto(b))*(facto(a)))
printf("la probabilité de trouver a dans l'état b est de");
printf("%i", P);
return 0;

Admettons que je me sois trompé dans mon code et que je veuille le modifier, que je veuille remplacer la ligne
P= c*(facto(a))/((facto(b))*(facto(a))) par P= c*(facto(a)/((facto(b))*((facto(a-b)))
Admettons que je veuille créer un programme qui ira modifier cette ligne, comment je fais ? C'est quoi le code?
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 févr. 2009 à 22:29
Ce n'est plus au niveau du C que ça se change, le C a été compilé en langage machine pour faire un programme.
Donc c'est directement du code machine que tu attaques avec un patch binaire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Donc faut utiliser un assembleur? Faut traduire le code à changer à la base en C en assembleur? Et une fois que c'est fais on fait comment? Y'a pas moyen de créer un programme en C qui se convertisse lui même en assembleur pour aller modifier le programme cible?
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 févr. 2009 à 22:38
Le gros problème c'est qu'il faut connaitre à l'avance le contenu exact du binaire à changer.
Si tu modifies une petite ligne d'un code C, tout le code binaire va basculer: changement d'adresse d'instruction avec réaction en chaine...

Et tu ne peux pas vraiment savoir à l'avance à quoi va ressembler ton code une fois compilé.
0
Admettons qu'on ait le code source du programme cible et le code à ajouter. Si on traduit le code source en binaire et qu'on utilise un assembleur pour voir le code en assembleur. On traduit aussi notre code à ajouter en assembleur. Il n'y a plus qu'à ajouter au code source du programme cible le code qu'on veut ajouter nan?
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 févr. 2009 à 22:52
L'idéal c'est d'avoir le code binaire du programme à patcher, le code binaire corrigé (suffit de compiler avec la correction en C) puis de faire la différence entre les deux (bindiff).
Ensuite tu crées un programme qui va changer la différence dans le programme buggé, mais il en existe déjà.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 févr. 2009 à 22:50
Ceci étant, la plus belle prouesse que je connaisse en matière de patch, c'est ça:
http://www.ksplice.com/

Un truc capable d'appliquer directement des mises à jour du noyau linux sans rebooter, en patchant la mémoire.
Incroyable....
0