Modifier un programme windows en hexadecimal [Résolu]

Messages postés
467
Date d'inscription
mercredi 12 août 2009
Dernière intervention
17 octobre 2011
- 16 juin 2010 à 16:26 - Dernière réponse :
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
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 !
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Dernière intervention
14 février 2014
- 16 juin 2010 à 19:44
3
Merci
salut,

win 32 assembly, pe header

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

@++

Merci cs_patatalo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_patatalo
Meilleure réponse
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Dernière intervention
30 juin 2013
- 17 juin 2010 à 18:56
3
Merci
@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

Merci cs_ghuysmans99 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_ghuysmans99
Messages postés
467
Date d'inscription
mercredi 12 août 2009
Dernière intervention
17 octobre 2011
- 19 juin 2010 à 12:48
0
Merci
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 !
Commenter la réponse de Zestyr
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Dernière intervention
30 juin 2013
- 19 juin 2010 à 14:46
0
Merci
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
Commenter la réponse de cs_ghuysmans99
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Dernière intervention
14 février 2014
- 19 juin 2010 à 19:43
0
Merci
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é.

@++
Commenter la réponse de cs_patatalo
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Dernière intervention
30 juin 2013
- 19 juin 2010 à 21:36
0
Merci
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
Commenter la réponse de cs_ghuysmans99
Messages postés
467
Date d'inscription
mercredi 12 août 2009
Dernière intervention
17 octobre 2011
- 19 juin 2010 à 22:13
0
Merci
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 !
Commenter la réponse de Zestyr
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Dernière intervention
30 juin 2013
- 19 juin 2010 à 22:55
0
Merci
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
Commenter la réponse de cs_ghuysmans99
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Dernière intervention
14 février 2014
- 22 juin 2010 à 00:42
0
Merci
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.

@++
Commenter la réponse de cs_patatalo
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Dernière intervention
29 janvier 2016
- 28 sept. 2010 à 00:52
0
Merci
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
Commenter la réponse de Guilou34
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Dernière intervention
30 juin 2013
- 28 sept. 2010 à 21:11
0
Merci
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
Commenter la réponse de cs_ghuysmans99

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.