IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

injection de code dans fichier PE


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut injection de code dans fichier PE
    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

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    tu dois d'abord apprendre l'assembleur ... reflechir sur les notions de compilation // linkage ...
    et ensuite peut etre que si tu t'acharne, tu arriveras a faire une bidouille pas trop deguelasse qui marche ...
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    merci de ta reponse charmante ca fait plaisir de l'aide comme ca

    toi qui semble maitriser la compilation et le linkage et peut-etre meme le c, peut tu m'expliquer comment on realise des labels dans ce langage ou meme si cela est possible?

    ja parle de label utilisables dans une image binaire

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Pourquoi veux-tu faire cela? Ma vision de la situation est que si tu ne possèdes pas les sources de l'exécutable en question, c'est que tu n'as pas l'autorisation de modifier le programme.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    je ne veus pas vraiment modifier le code du fichier cible, mais simplement appeler un bloc de code suplementaire

    et sinon, c'est simplement un projet que j'ai a realiser dans le cadre de mes etudes, je cherche pas a craquer je ne sais quoi

    le but est de comprendre le fonctionnement d'un virus

    comme l'a dit Dark_Ebola, c'est effectivement faisable en assembleur, mais je cherche a le faire en c

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonsoir,

    Citation Envoyé par _ky_
    Salut a tous, je cherche a injecter du code dans un fichier executable au format pe (sous xp 32bits)
    Juste pour être sûr : vous modifiez le fichier dans lequel vous injectez du code, c'est bien cela ?

    Citation Envoyé par _ky_
    le code ouvre simplement une message box qui affiche "salut".
    En appelant user32.dll::MessageBoxA ?

    Citation Envoyé par _ky_
    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
    Les adresses de quoi ? Des données ? Du code ? Doit-on comprendre que le code injecté est lui aussi écrit en C ? Si oui : est-il entièrement contenu dans une seule fonction ? Si oui : comment traitez-vous son prologue et son épilogue ?

    Citation Envoyé par _ky_
    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)
    Un label ? Je ne suis pas certain de suivre. Si vous pouviez préciser ce à quoi vous pensiez...

    Cordialement,
    DS.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Je pense qu'il faut sutout te documenter sur la spécification du format PE, sur le mécansime d'édition des liens et de chargement du programme, sur le code machine. Ensuite un fichier exécutable est un fichier binaire comme un autre que tu peux ouvrir, fermer et modifier. J'ai pas plus d'idées à te donner, j'ai l'impression qu'il doit y avoir pas mal d'infos à ce sujet sur le net.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    l'idee est de modifier un fichier au format pe afin de lui rajouter une section de code executable

    le code executable contenu dans la nouvelle section affichera une fenetre grace a MessageBoxA

    l'idee que j'ai eu (potentiellement mauvaise) et de faire un programme qui ouvre une pop-up puis de le compiler et d'inserer le code machine optenu dans la section
    tout cela a l'aide d'un programme injecteur

    j'ai l'addresse de la fonction grace au prog qui injecte, mais les addresses des variables utilisees pour la messagebox sont ne correspondent pas a des addresses reelles dans le fichier cible les section de donnees etant differentes.

    le code est ecrit integralement en C

    je n'ai pas encore teste l'idee que j'expose, et pas reflechis aux problematiques de prologue et d'epilogue.

    l'idee que je voulais exploiter etait celle ci:

    creer une section avec un label (comme en assembleur) contenant mes chaines (pour message box) et utiliser des addresses relatives au label pour trouver les chaines.

    compte tenu de mon taux de fatigue, mon idee n'est peut-etre pas la bonne...
    j'envisage de me tourner vers l'assembleur plutot

    j'espere avoir ete clair, merci de votre aide en tout cas

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par mujigka
    Je pense qu'il faut sutout te documenter sur la spécification du format PE, sur le mécansime d'édition des liens et de chargement du programme, sur le code machine. Ensuite un fichier exécutable est un fichier binaire comme un autre que tu peux ouvrir, fermer et modifier. J'ai pas plus d'idées à te donner, j'ai l'impression qu'il doit y avoir pas mal d'infos à ce sujet sur le net.
    Thierry
    je connais, je pense, assez bien le format pe, je peut ajouter une section contenant du texte sans aucun probleme, mais je ne sais pas trop trop comment executer du code dans ma nouvelle section

  10. #10
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Si j'ai bien compris, l'injection se fait en statique (écriture dans le fichier PE) et non pas au runtime (écriture en mémoire, une fois le fichier mappé par le loader de Windows), c'est bien ça ? (on parle généralement d'injection uniquement pour le runtime)

    le code executable contenu dans la nouvelle section affichera une fenetre grace a MessageBoxA
    Le programme injecté contient-il déjà un import (cf. IAT) pour MessageBoxA ? Dans le cas contraire, la résolution de l'import de la fonction devra se faire au runtime (et là les choses se compliquent de manière drastique).

    l'idee que j'ai eu (potentiellement mauvaise) et de faire un programme qui ouvre une pop-up puis de le compiler et d'inserer le code machine optenu dans la section tout cela a l'aide d'un programme injecteur
    Effectivement, ça n'est pas la bonne manière de procéder. Les adresses des chaînes de caractère seront évidemment différentes entre l'injecteur et l'injecté.

    creer une section avec un label (comme en assembleur) contenant mes chaines (pour message box) et utiliser des addresses relatives au label pour trouver les chaines.
    En définitive cela revient au même problème que vu ci-dessus.

    Pour faire cela convenablement (de manière statique), il faut :

    1) S'assurer que le programme injecté importe MessageBoxA.

    2) Trouver l'adresse de la fonction dans l'IAT (Import Address Table).

    3) L'injecteur devra écrire dans l'injecté un CALL vers cette adresse (ce qui reviendra à faire un CALL MessageBoxA) : point de salut en dehors de l'assembleur. Le CALL vers une fonction dans la table d'import est de type 0xE9.

    4) Pour ce qui est des chaînes de caractères, on peut soit :

    - Les injecter dans la section .data (au risque qu'elles soient effacées au runtime, le programme pouvant y mettre ses propres données)
    -Les injecter à la fin de la section .data qui est généralement saine pour ce genre de chose, mais une étude du data flow confirme ou infirme ce genre de chose.
    - Les injecter à la fin de la section de code (dans ce qu'on appelle "la cave") qui est une partie généralement inutilisée. Les compilos embarquent souvent des données (en lecture seule) au sein même de la section de code.
    - Créer une section spécifique rassemblant code (la MessageBox injectée) et donnée (les chaînes à passées en args. à MessageBox).

    5) Comme on sait alors où sont placées les chaînes (il faudra faire une conversion offset -> VA) il ne reste plus qu'a faire des PUSH avec les adresses de ces mêmes chaînes, puis finalement le CALL vers MessageBoxA.

    6) Rediriger le code flow de l'injecté vers les PUSH et le CALL de la MessageBox.

    (il existe une autre solution : embarquer tout le code supplémentaire dans une DLL et appeler cette DLL depuis le programme qui nécessite ce code supplémentaire. Le problème reste qu'il faut appeler LoadLibray() et GetProcAddress() depuis le programme injecté).

    Ca reste des explications sommaires, mais je pense, le meilleur moyen (en statique uniquement, au runtime c'est complètement différent) d'écrire du nouveau code dans un PE.

    Si tu bloques vraiment je peux te fournir un mini guide "pas à pas" (mais pas l'injecteur, il te restera quand même du boulot à faire de ton coté ) avec deux programmes d'exemples (un sans la MessageBox et un autre avec).

    N'hésites pas si tu as des questions.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    merci de ton aide qui m'est vraiment tres utile

    en ce qui concerne MessageBoxA:

    j'arrive a recuperer l'addresse d'une dll mappee en memoire et a parser sa table d'export, donc si j'ai bien compris, je peut recuperer l'addresse de MessageBoxA de cette facon(dans le programme injecteur).

    pour ce qui est de la position des donnees dans le code injecte, je souhaiterai les placer dans un section specifique qui contiendrait aussi le code, mais je ne sais pas vraiment comment indiquer au compilo que je veux stoker les donnees dans cette section et non dans .data

    il me semble que j'ai bien compris le principe, mais je galere un peu a le mettre en pratique, je serai interrresse par ton mini guide "pas à pas"

    merci encore

  12. #12
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    En fait _Ky_, ce que je ne saisis toujours pas, c'est si tu travailles uniquement sur le binaire en statique (tu modifies uniquement le fichier PE, comme un fichier "normal"), uniquement à l'exécution ( à grand coup de Read/WriteProcessMemory() ) ou un peu des deux (une partie des modifications sur le binaire et une autre en mémoire).

    Si tu pouvais éclairer un peu sur ce point

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    au temps pour moi
    je travaille sur un fichier binaire sur le disque

  14. #14
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    je travaille sur un fichier binaire sur le disque
    D'accord Donc on parlera plutôt d'écriture que d'injection.

    j'arrive a recuperer l'addresse d'une dll mappee en memoire et a parser sa table d'export, donc si j'ai bien compris, je peut recuperer l'addresse de MessageBoxA de cette facon(dans le programme injecteur).
    En fait il y a, je crois, déjà un problème du fait que les DLLs ne se mappent pas toujours à la même adresse (phénomène des "relocations"), tu peux donc pas le faire une fois pour toute depuis le programme qui écrit sur ton binaire. Ca doit être le programme cible qui soit calcul l'adresse à l'exécution (ce qui nécessie d'injecter une fonction capable de récupèrer l'adresse), soit, plus simple, de mettre directement la fonction dans l'IAT (comme ça c'est Windows qui s'en occupe lors du chargement du processus, et lui ne se trompe jamais et il fait cela tout seul).

    pour ce qui est de la position des donnees dans le code injecte, je souhaiterai les placer dans un section specifique qui contiendrait aussi le code
    Là ca va, ça n'est pas très compliqué

    mais je ne sais pas vraiment comment indiquer au compilo que je veux stoker les donnees dans cette section et non dans .data
    Là je ne comprend plus ce que tu veux dire... Compiler quoi pour mettre où ?

    Si jamais tu essayes de compiler un code pour l'écrire ensuite dans le programme cible, ça ne marchera jamais : un compilateur écrit les données à des adresses fixes, donc tout est fixé dans ton exe. Si tu écris ce code dans un autre exe, tout va aller de travers parce que les adresses correspondent à celle de l'exe qui a été compilé, pas celui qui est la cible [l'injecté / le programme auqeul on ajoute la fonction].

    Tu ne peux écrire dans la cible que du code qui correspond à la cible (adresses des donnés, etc.). Il faut donc tout préparer à l'avance ! (les adresses des données, du code, etc.) puis écrire ce code et ces données préparés là où tu le souhaites (disons dans une nouvelle section) en accord avec les adresses qui sont dans le code préparé.

    Hmm, j'espère que je suis clair (et que j'ai bien compris où se situait le problème).

    Je vais essayé de préparer deux petits programmes. J'essaierais de t'expliquer les grandes lignes.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Neitsa
    Si jamais tu essayes de compiler un code pour l'écrire ensuite dans le programme cible, ça ne marchera jamais : un compilateur écrit les données à des adresses fixes, donc tout est fixé dans ton exe. Si tu écris ce code dans un autre exe, tout va aller de travers parce que les adresses correspondent à celle de l'exe qui a été compilé, pas celui qui est la cible [l'injecté / le programme auqeul on ajoute la fonction].

    Tu ne peux écrire dans la cible que du code qui correspond à la cible (adresses des donnés, etc.). Il faut donc tout préparer à l'avance ! (les adresses des données, du code, etc.) puis écrire ce code et ces données préparés là où tu le souhaites (disons dans une nouvelle section) en accord avec les adresses qui sont dans le code préparé.
    c'est precisement mon probleme , desole de pas avoir ete tres clair

    la question que je me pose, c'est comment preparer le code pour qu'il puisse s'executer correctement une fois injecte?

    Citation Envoyé par Neitsa
    Ca doit être le programme cible qui soit calcul l'adresse à l'exécution (ce qui nécessie d'injecter une fonction capable de récupèrer l'adresse), soit, plus simple, de mettre directement la fonction dans l'IAT (comme ça c'est Windows qui s'en occupe lors du chargement du processus, et lui ne se trompe jamais et il fait cela tout seul).
    tu veux dire mettra la fonction dans l'IAT du binaire cible? mais dans ce cas la, il faut forcement que celui-ci appelle user32.dll non?

    enfin, si j'arrive a faire fonctionner correctement du code injecte, je pourrais recuperer l'addresse de la fonction en live je pense

    merci pour toutes ces infos

  16. #16
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Voilà, j'ai fais un p'tit truc rapide histoire de montrer une possibilité.

    J'ai fais un petit programme minimal, une seule fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	MessageBeep(-1);
    	return 0;
    }

    Sous un débuggeur ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    00401000 <>/$  6A FF          PUSH    -1                                              ; /BeepType = -1. (standard beep)
    00401002   |.  FF15 00204000  CALL    NEAR DWORD PTR DS:[<&USER32.MessageBeep>]       ; \MessageBeep
    00401008   |.  33C0           XOR     EAX,EAX
    0040100A   \.  C3             RETN
    1) Ajout de la fonction supplémentaire

    Là j'ai utilisé un outils extérieur pour aller vite (iidking). IIDKing s'occupe de tout au niveau de l'IAT, il produit un petit rapport dans ce style :

    user32.dll::MessageBoxA->call dword ptr [405044]
    2) Ajout de la section supplémentaire pour les données et le code :
    Là j'utilise un éditeur hexa.

    2-a) J'incrémente le nombre de section dans l'IMAGE_FILE_HEADER (de 5 je passe à 6)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    000000DE  DW 0006           ;  NumberOfSections = 6
    2-b) J'ajoute l'IMAGE_SECTION_HEADER qui va bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    00000298  ASCII ".Neitsa"    ; SECTION
    000002A0  DD 00000200        ;  VirtualSize = 200 (512.)
    000002A4  DD 00006000        ;  VirtualAddress = 6000
    000002A8  DD 00000200        ;  SizeOfRawData = 200 (512.)
    000002AC  DD 00000C00        ;  PointerToRawData = C00
    000002B0  DD 00000000        ;  PointerToRelocations = 0
    000002B4  DD 00000000        ;  PointerToLineNumbers = 0
    000002B8  DW 0000            ;  NumberOfRelocations = 0
    000002BA  DW 0000            ;  NumberOfLineNumbers = 0
    000002BC  DD E0000020        ;  Characteristics = CODE|EXECUTE|READ|WRITE
    2-c) J'ajoute physiquement la section à la fin de l'exécutable (donc en 0xC00 [PointerToRawData]) en collant 0x200 octets [SizeOfRawData] à zéro.

    3) Ajout des donnés

    Ma nouvelle section est en 0xC00. J'y ajoute deux petites phrases, une pour le texte et une pour le caption de la MessageBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    0x0C00  48 65 6C 6C 6F 20 57 6F 72 6C 64 20 21 00 54 65   Hello World !.Te
    0x0C10  73 74 20 70 6F 75 72 20 5F 6B 79 5F 00 00            st pour _ky_
    Mon texte est en 0xC00 et mon caption en 0x0C0E. J'ai donc (en Virtual Address, respectivement 0x406000 et 0x40600E).

    4) Ajout du code

    Je met ma MessageBox juste en dessous (Là j'utilise un débuggeur, peut pas faire autrement, c'est difficile de coder en opcode ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    0040601E     6A 00            PUSH    0 ; option
    00406020     68 0E604000      PUSH    AddFunc_.0040600E   ; ASCII "Test pour _ky_" ; caption
    00406025     68 00604000      PUSH    AddFunc_.00406000    ; ASCII "Hello World !" ; Texte de la MB
    0040602A     6A 00            PUSH    0
    0040602C     FF15 44504000    CALL    DWORD PTR [405044] ; USER32.MessageBoxA (adresse donnée par IIDKing)
    5) Redirection du code flow

    Sous MessageBeep, je met un JMP vers mon nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    00401008    .- E9 11500000    JMP     AddFunc_.0040601E ; saute vers les PUSH de MessageBox
    0040100D   /.  33C0           XOR     EAX,EAX
    0040100F   \.  C3             RETN
    et sous ma MessageBox, je saute après ce nouveau JMP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    0040602C     FF15 44504000    CALL    DWORD PTR [405044] ; USER32.MessageBoxA (adresse donnée par IIDKing)
    00406032   - E9 D6AFFFFF      JMP     AddFunc_.0040100D ; saute sur le XOR
    Voilà

    Maintenant si je voulais faire un "patcheur" qui ajouterais cette MessageBox au programme directement, je n'aurai plus qu'a faire un diff. des deux fichiers et coder un petit programme qui écrirait les octets voulus aux bonnes adresses (adresses de type "offset", pas VA ni RVA)

    Là, je t'avoue que c'est du très vite fait, mais ça donne une idée de la marche à suivre général.

    On pourrait se passer du programme IIDKing, mais ça rendait cette explication trop longue. Vu que tu sembles connaître le format PE, tu connais la chanson : Ajout d'un IMAGE_IMPORT_DESCRIPTOR, d'un IMAGE_THUNK_DATA, d'un IMAGE_IMPORT_BY_NAME, etc.

    Les binaires sont dans l'archive attachée en pièce jointe.

    Si tu as d'autres questions, n'hésites pas
    Fichiers attachés Fichiers attachés

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    houahouuuuuu

    merci de cette reponse, je vais profiter de mon samedi soir et essayer avec ca, ca devrait m'etre tres utile en tout cas


Discussions similaires

  1. Injection de code dans le .htaccess
    Par reureureu dans le forum Sécurité
    Réponses: 8
    Dernier message: 19/01/2013, 16h52
  2. Sécurité contre injection de code dans upload
    Par langevert dans le forum Langage
    Réponses: 3
    Dernier message: 11/12/2009, 00h24
  3. injection de code dans une application
    Par youp_db dans le forum C
    Réponses: 16
    Dernier message: 21/07/2006, 12h33
  4. [Excel] Injecter du code VBA par le biais d'un fichier *.cvs
    Par llsn dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/05/2006, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo