Modifier un programme windows en hexadecimal

Résolu
Zestyr Messages postés 466 Date d'inscription mercredi 12 août 2009 Statut Membre Dernière intervention 17 octobre 2011 - 16 juin 2010 à 16:26
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 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 ;)

Merci,
Cordialement Zestyr

Try not ! Do or do not ! There is not try !

11 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
16 juin 2010 à 19:44
salut,

win 32 assembly, pe header

tu ne peux rien faire avec seulement un éditeur hexa, il te faut également un debugger.

@++
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
17 juin 2010 à 18:56
@patatalo : Si si c'est faisable, il sera juste mort avant d'avoir un truc fonctionnel

Plus sérieusement, utilise un debugger comme OllyDbg ou si tu veux quelque chose de plus poussé (mais malheureusement payant), IDA.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
3
Zestyr Messages postés 466 Date d'inscription mercredi 12 août 2009 Statut Membre Dernière intervention 17 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

Try not ! Do or do not ! There is not try !
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
19 juin 2010 à 14:46
Je sais que IDA le fait, mais pour les autres debuggers je l'ignore.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0

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

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
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é.

@++
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
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
0
Zestyr Messages postés 466 Date d'inscription mercredi 12 août 2009 Statut Membre Dernière intervention 17 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

Try not ! Do or do not ! There is not try !
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
19 juin 2010 à 22:55
1) Réponse sur CodeProject : http://www.codeproject.com/KB/cpp/PEChecksum.aspx

2) Tu dois créer un thread dans le process qui chargera la DLL dans son espace mémoire. Il y a plein d'exemples sur le site.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
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.

@++
0
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
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
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
28 sept. 2010 à 21:11
Programme sous Windows (supposé actuel), donc oublie tout de suite DOS et le mode réel 16 bits

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Rejoignez-nous