injection de code dans fichier PE

injection de code dans fichier PE - C - Programmation

Marsh Posté le 26-01-2007 à 21:34:01    

Salut a tous, je cherche a injecter du code dans un fichier executable au format pe (sous xp 32bits)
 
le code ouvre simplement une message box qui affiche "salut".
 
le probleme est qu'une fois compile, les addresses utilises dans le code que je veux injecter ne sont pas valide dans le fichier cible
 
je voudrais donc (si cela est possible) creer un label qui me permettrait d'utiliser des addresses relatives et donc d'avoir des pointeurs valides
 
(j'ai teste avec goto, mais ca ne semble pas fonctionner)
 
voila voila  :hello:


Message édité par _ky_ le 26-01-2007 à 21:36:20
Reply

Marsh Posté le 26-01-2007 à 21:34:01   

Reply

Marsh Posté le 26-01-2007 à 22:27:12    

Tu fais ca en quel langage ? L'assembleur me parait obligatoire pour ce genre de manip, des que tu veux controler un peu le code genere ...

Reply

Marsh Posté le 26-01-2007 à 22:30:09    

c'est du c, je pourrais peut-etre utiliser de l'assembleur in line, mais je suis pas sur : /

Reply

Marsh Posté le 26-01-2007 à 22:38:12    

Avec de l'assembleur inline, tu seras sur de ce que tu injectes, sauf bien sur si tu appelles des fonctions externes dans ce code. Reste a reperer dans ton module ou se trouve ce que tu injectes.  
 
Si tu veux appeler MessageBox, je te souhaite bien du plaisir, car il te faut reperer dans la table d'importation du PE l'entree qui correspond a MessageBox, et la rajouter au cas ou elle n'existe pas ....  Une autre alternative consiste a reperer l'adresse ou reside user32 et te farcir la table d'exportation pour trouver MessageBox ...

Reply

Marsh Posté le 26-01-2007 à 23:03:04    

jme suis deja amuse a parser la table d'exportation
 
mon probleme (pour le moment :) ) c'est juste de savoir ou son stockees mes datas pour la message box

Reply

Marsh Posté le 26-01-2007 à 23:27:17    

Ouais, ben moi je dis : assembleur. Y'a un truc assez simple qui consiste a faire un call relatif vers l'instruction suivante qui est un pop. Ainsi tu reperes ou tu es dans la memoire. Apres, si tu sais par rapport a ce call ou se trouvent tes donnees, c'est gagne.

Reply

Marsh Posté le 26-01-2007 à 23:38:00    

Pour répondre simplement, une technique couramment employée est de calculer un delta comme suit :  
 


    call Delta
Delta:
    pop ebp ; ou n'importe quel registre en fait
    sub ebp, Delta
...
    push 0
    lea eax, [ebp+Titre]
    push eax
    lea eax, [ebp+Texte]
    push eax
    push 0
    call MessageBoxA


 
C'est ce qu'on appelle un code relogeable. Le delta se trouvant dans EBP, il suffit de l'ajouter à toutes tes adresses.
 
Edit : Comme le dit Ace17 :)
 
Sinon, une méthode plus simple pour injecter du code sans se prendre la tête, est d'utiliser VirtualAllocEx pour créer une section virtuelle dans le processus distant puis d'écrire dedans avec WriteProcessMemory et enfin d'exécuter la fonction avec CreateRemoteThread. La fonction injectée étant simplement un LoadLibraryA qui va charger ta dll. Ainsi, tu n'as qu'à créer un petit bout de code relogeable en asm qui va récupérer l'adresse de LoadLibraryA et l'appeler en passant en paramètre le chemin de ta dll et tout le code que tu veux en C dans une dll.
 


Message édité par anordem le 26-01-2007 à 23:39:02
Reply

Marsh Posté le 26-01-2007 à 23:44:12    

bon, ben jvais chercher du cote de l'asm je crois...
 
merci a tous

Reply

Marsh Posté le 27-01-2007 à 00:09:23    

y'a un excellent article ici : http://www.codeproject.com/system/ [...] sembler3_2
 
on devrait donner une médaille au créateur de CodeProject tellement ce site est précieux et une mine inépuisable de culture de programmation

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed