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
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
A voir également:
- Thérapie codique
- Imo thérapie avis - Télécharger - Messagerie
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.
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.
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?
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.
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?
#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?
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
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.
Donc c'est directement du code machine que tu attaques avec un patch binaire.
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?
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
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é.
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é.
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?
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
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à.
Ensuite tu crées un programme qui va changer la différence dans le programme buggé, mais il en existe déjà.
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
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....
http://www.ksplice.com/
Un truc capable d'appliquer directement des mises à jour du noyau linux sans rebooter, en patchant la mémoire.
Incroyable....