Zestyr
Messages postés466Date d'inscriptionmercredi 12 août 2009StatutMembreDernière intervention17 octobre 2011
-
16 juin 2010 à 16:26
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 2013
-
28 sept. 2010 à 21:11
Bonjours, je savais pas trop où poster ce sujet alors je me suis permis de le faire ici.
Je souhaiterais ajouter des instructions à un programme (.exe). En examinant avec un editeur hexadecimal (EditHexa) des exécutables windows d'un programme HelloWorld que j'ai compilé en C avec Code::Blocks, DevCpp, et Vc j'ai pu remarquer quelques similitudes. J'ai remarquer aussi que des libraries, des commandes, des fonctions et des programmes étaient appelés.
J'aimerais que vous me guidiez vers des documents me permettant de comprendre comment un programme est exécuté sous windows, et des documents sur des méthodes pour ajouter des instructions à un programme.
Enfin bref tous ce qui pourrait m'aider ;)
Zestyr
Messages postés466Date d'inscriptionmercredi 12 août 2009StatutMembreDernière intervention17 octobre 2011 19 juin 2010 à 12:48
Salut, veuillez escuser mon temps de réponse.
Merci beaucoup pour vos réponses
Avec un debugger c'est plus claire. J'aimerais aussi savoir où ( la position ) l'on peut rajouter des instructions en hexa pour qu'elle soit exécutées.
Un grand merci aussi à ceux qui pourront me donner des informations supplémentaire,
Cordialement Zestyr
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 19 juin 2010 à 19:43
salut,
tout dépend de ce que ton programme doit faire. Le problème si tu modifie un programme avec son binaire, c'est que tu dois pouvoir justement creer de la place pour ajouter ton code dedans. Soit ajouter une section et lancer dans le programme par un call, jmp ou modifier le point d'entrée, le header pourrait être a modifier (checksum, ...). Soit modifier le programme pour gagner de la place tout en conservant ses besoins de base et ajouter ton code dans les trous obtenus. Avec un programme codé en C, c'est assez simple de gagner de la place, avec un programme codé en assembleur, ça pourrait être plus compliqué vu qu'à la base, il devrait être optimisé.
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 19 juin 2010 à 21:36
La méthode la plus propre à mon sens est d'injecter une DLL dans le programme à son démarrage qui modifiera des morceaux de code de ce dernier. Pour ton info, Windows ne s'occupe pas du checksum des exécutables.
VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Zestyr
Messages postés466Date d'inscriptionmercredi 12 août 2009StatutMembreDernière intervention17 octobre 2011 19 juin 2010 à 22:13
C'est quoi le checksum d'un exécutable ? ( j'ai une petite idée mais bon ... )
@ghuysmans99: Comment s'y prendre pour injecter une DLL ?
@patatalo: Y'a t'il une méthode plus ou moins universel pour faire de la place ? Dans mon exécutable codé en C il y a pleins de octets avec une valeur hexadécimal de 00 qui se suivent, puis-je rajouter des instructions là ? Il y a quelques jours
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 22 juin 2010 à 00:42
re,
non, pas de methodes universelle pour gagner de la place etant donné que déjà, il n'y a pas de code universel.
le plus simple serait peut-être de voir en fin de programme car l'alignement est de 4Ko en memoire mais encore une fois, rien de sur car le code pourrait avoir une taille alignée sur 4ko pile ou un peu moins et donc, pas de place.
il est possible aussi de gratouiller quelques octets par-ci par-là avec les alignements de fonctions.
Sinon, il faut recoder une fonction avec le debugger pour gagner quelques octets et faire les modifs dans le fichier hexa.
tu peux aussi mettre un VirtualAlloc et un ReadFile pour charger un bout de code en mémoire mais ce code n'aura pas d'offset fixe et devra donc être prévu pour fonctionner sans.
Pour la modification des 0, je dirais pourquoi pas mais si tu regarde avec un editeur hexa, assure toi de ne pas être dans la section data. Même en section code, il n'est pas dit qu'un programme n'utiliserait pas cet emplacement pour une raison ou une autre si il s'attends a être initialisé a 0, il pourrait ne plus fonctionner.
Le plus simple serait peut-être quand même d'agrandir la section code.
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 28 sept. 2010 à 00:52
Salut
Il y a des procédés relativement simples pour modifier un programme exe evec un éditeur hexadécimal.
Supposont d'abord qu'il s'agit d'un bout de code relativement petit, qu'on est en mode réèl et qu'on peut le désassembler evec Debug de Microsoft.
Où le loger? Dans les messages tout simplement. En général il y a moyen de les abréger tout en les laisant compréhensifs.
Comment l'appeller? Avec un call simple si les messages sont dans CS avec un call far s'ils se trouvent dasn un autre segment.
Bien entendu il faut noter les instructions qui seront recouvertes par cet appel et les retranscrire avant le ret ou le retf et aussi sauver er restaurer les registres modifiés.
Si cette solution n'est pas applicable, il reste celle des overlays. C'est une fonction Msdos relativement mal documentée mais que je connais bien pour l'avoir utilisée il y a bien longtemps quand la mémoire était plus petite que 64Ko.
Plus de détails si nécessares