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

Assembleur Discussion :

Détournement d'une interruption


Sujet :

Assembleur

  1. #1
    Invité
    Invité(e)
    Par défaut Détournement d'une interruption
    Bonjour,

    J'aimerais détourner l'interruption 34H. A cette fin, dans la table des vecteurs d'interruption, je change l'adresse de mon interruption. Mon interruption affiche simplement une lettre en guise de test. Sauf erreur de ma part, après avoir changé l'adresse de l'int34, je peux appeller celle-ci en faisant "INT 34H", non ? Car apparemment ça n'a pas l'air de fonctionner...

    Je n'ai pas jugé nécessaire de sauvegarder l'adresse originale de l'int 34 étant donné que celle-ci est inutilisée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    .MODEL SMALL
    .STACK
    .DATA
    .CODE
     
         MOV AX,@DATA             
         MOV DS,AX
     
         MOV AX,0B800H             
         MOV ES,AX                   
     
         ; ON DETOURNE L'INT 34H
         MOV AH,25H
         MOV AL,34H                 ; NUMERO DE L'INT A DETOURNER
         MOV DX,OFFSET GEST_ECRAN   
         INT 21h
     
         ; APPEL DE L'INT DETOURNEE 34H
         INT 34H
     
         MOV AX,4C00H
         INT 21H
     
    ; ---------------------------------------------
     
         GEST_ECRAN PROC
     
         MOV ES:[170],BYTE PTR 'A'
     
         IRET                   
     
         GEST_ECRAN ENDP
     
    END
    Merci de vos remarques

    [EDIT] Si je me trompe de balises, ça va pas aller [\EDIT]

  2. #2
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Bonjour !

    Le problème est tout simple :
    Je ne sais pas pourquoi, mais les consoles DOS sont en mode texte 03h mais il faut y passer explicitement pour pouvoir écrire directement dans la mémoire vidéo...

    Il faut donc simplement rajouter ça au début de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov    ax, 0003h
    int    10h
    Jusque là ça fonctionnera mais tu n'auras pas le temps de voir le caractère s'afficher que le programme sera terminé.
    Il faut donc attendre l'appui d'une touche :
    Là, c'est bon, mais je te conseille plusieurs choses :
    - Sauvegarde l'ancien vecteur (on sait jamais)
    - Sauvegarde les registres sur la pile à l'entrée de ton Int
    - Assigne es à 0B800h dans ta procédure et pas dans ton programme principal (quand ton code sera plus long, se sera difficile de changer à chaque fois...)

    Salut !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir et merci de ta réponse Nico !

    En parcourant l'historique des messages, j'avais effectivement vu que tu parlais de ce code dans un de tes messages.

    Mais j'ai malheureusement toujours le même problème. Lorsque je lance l'exécution du programme, j'ai une jolie fenêtre Windows : "Le processeur NTVDM a rencontré une instruction non-autorisée...". Se pourrait-il que Windows m'interdise de modifier cette INT (pourtant inutilisée) de mon vecteur d'interruptions ?

    Bien à toi,
    Did2604.

    [EDIT] Merci pour tes remarques, les deux premières étaient d'office prises en compte dans l'évolution de mon programme [\EDIT]

  4. #4
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Salut !

    Ce n'est pas possible, j'ai testé et ça marche chez moi (avec FASM), mais je n'ai pas le temps de t'en dire plus tout de suite...

    Salut !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  5. #5
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    avec fasm ca marche et c logique puisque tu produit un flat !

    did2604, le detournement necessite ausi le segment qui est DS et qui ne pointe pas sur code mais sur data

    A++
    TangiX

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir Tangix et merci de ta réponse.

    Excuse-moi mais je ne comprends pas très bien ta réponse :
    Le detournement necessite ausi le segment qui est DS et qui ne pointe pas sur code mais sur data
    C'est bien pour ça que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MOV AX,@DATA                   ; DEFINITION DU SEGMENT DE DONNEES
    MOV DS,AX
    Lorsque je souhaite détourner l'int 34H, si je ne me trompe pas, il faut lui donner DSX. DS est initilisé ci-dessus. Ensuite, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MOV DX, OFFSET GEST_ECRAN
    N'hésite surtout pas à me corriger si je me trompe dans mon raisonnement...

    Bonne soirée à tous les deux,

    PS : j'ai toujours travaillé avec MASM, TASM, NASM en général, je n'utilise donc pas FASM. A cette fin, j'aimerais savoir ce qu'est un flat ? Ca m'intrigue

  7. #7
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    lut !
    tu inialise DS sur ton data segment
    or ton interruption est dans ton segment de code
    donc le temps de l'interruption tu doit faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov ax, @CODE
    mov ds, ax
    et remettre la valeur de DS normal (je te conseille un push/pop (habitude a prendre pour de plu gros programme))

    dans un flat tous les segment ne font qu'un (meme valeur) donc forcement DS=CS

    A++
    TangiX

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci bien Tangix de tes éclaircissements, j'avoue que je n'y aurais pas pensé tout seul, pourtant ça découle de source.... Enfin,ça fonctionne à présent. Je vais pouvoir étoffer un peu tout cela

    Je découvre les détournements d'interruptions, donc j'expérimente un peu

    Merci aussi à Nico
    Bonne soirée à tous les deux,
    Did2604.

  9. #9
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Salut TangiX !

    Un FASM, tu n'est pas obligé de faire un flat (un éxecutable qui ne comportera pas d'en-tête comme les programmes DOS ou Win32), ce que j'ai fait pour tester c'est un .exe DOS et je n'ai pas vu l'erreur de segment de did2604...

    A bientôt !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  10. #10
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    re Nico*3-3

    avec cette erreur ca ne peux pas marcher !
    la seule solution que je voit c que fasm fait une structure com avec une extension exe (eh oui ca marche quand meme !) verifie avec un debugger ou un editeur hexa mais ca m'etonnerait que tu ai un exe conforme qui marche avec ce code

    A++
    TangiX

  11. #11
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Salut TangiX !

    Pardon mes dire devaient prêter à confusion...
    Ce que je voulais dire, c'est que j'ai refait un petit programme chez moi avec FASM qui était censé détourner l'interruption 34h, or je n'ai pas réécris le code de did2604, j'ai refais mon propre programme.

    Il n'y a donc pas de problème, le code initial de did2604 ne fonctionnait pas...
    Désolé pour la confusion...

    Et FASM fait très bien des structures .exe et .com conformes, donc. 8)

    Salut !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  12. #12
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    oki, j'comprend mieux maintenant

    A++
    TangiX

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je vais encore poser une petite question qui est dans la continuité du message initial. Le détournement se fait parfaitement, le programme fonctionne donc comme je le souhaitais. Histoire d'améliorer un peu le tout, je sauvegarde l'adresse de l'INT34 avant d'y mettre ma propre adresse, ensuite j'écris donc la nouvelle adresse. A présent j'aimerais relire l'adresse qui a été écrite et là ça bug, le programme plante. J'utilise la fonction 35h/int21h qui prend en entrée :

    AH <- 35H
    AL <- Numéro de l'int.

    Voici le programme. C'est donc à "SAUVEGARDE DE LA NOUVELLE ADRESSE DE L'INT 34H" que ça me pose des problèmes. Pourtant, je n'avais aucun problème en l'appellant une première fois...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    .MODEL SMALL
    .STACK
    .DATA
         MSG1 DB "GESTIONNAIRE D'ECRAN INITALISE EN B800H$"
     
    .CODE
     
         MOV AX,0003H  
         INT 10H         	
     
         ; SAUVEGARDE DE L'ADRESSE ACTUELLE DE L'INT 34H
         MOV AH,35H
         MOV AL,34H
         INT 21H               
     
         ; INITIALISATION DE DS POUR LE DETOURNEMENT
         MOV AX,@CODE			
         MOV DS,AX			
     
          ; INITIALISATION DE ES A LA MEMOIRE VIDEO
         MOV AX,0B800H                   
         MOV ES,AX   
     
         ; ON DETOURNE L'INT 34H
         MOV AH,25H
         MOV AL,34H                 
         MOV DX,OFFSET GEST_ECRAN   
         INT 21H
     
         ; SAUVEGARDE DE LA NOUVELLE ADRESSE DE L'INT 34H
         MOV AH,35H
         MOV AL,34H
         INT 21H  
     
         ; INITIALISATION DE DS POUR LES DONNEES
         MOV AX,@DATA			
         MOV DS,AX
    Encore un problème de mauvais segment ?

    Merci de vos éclaircissements

  14. #14
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    slt,
    Pour sauvegarder il ne suffit pas d'appeler l'int, il faut aussi 'sauvegarder' le resultat dans la mémoire !
    le resultat de l'int 21h/35h se trouve dans DS et DX (omme la 21h/25h)

    A++ et bonne soirée
    TangiX

  15. #15
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Salut !

    Tu as fait une grosse erreur
    Int 21h -> Fonction 35h, lecture du vecteur actuel :
    Entrée :
    -ah = 35h
    -al Numéro de l'Int
    Sortie :
    -es:bx = Adresse du vecteur actuel

    La fonction 35h ne sauvegarde pas le vecteur dans le DOS, elle te le renvoie dans es:bx...
    C'est donc à toi de le sauvegarder dans ton programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    mov    ah, 35h
    mov    al, 34h
    int    21h
     
    mov    [Vecteur], bx
    mov    [Vecteur+2], es
     
    ...
    Où Vecteur étant une variable de 2 Mots et la syntaxe celle de FASM.
    Ensuite pour le restaurer, il faut appeler la fonction 25h etc...

    TangiX : C'est plutôt es:bx et pas ds:dx comme la fonction 25h...

    A bientôt !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Merci pour vos réponses, Tangix et Nico*3-3.

    Effectivement, le pointeur vers la routine d'interruption se trouve en ES:BX. Mais après tout, imaginons (je sais, ça n'a aucun intérêt) d'appeller la fonction pour sauvegarder l'adresse, elle la range en ES:BX et je ne veux pas m'en servir ? Je continue mon programme et j'appelle une seconde fois cette fonction de nouveau sans sauvegarder ES:BX, pourquoi ne puis-je pas ?

    Ma question est un peu tordue je sais, mais bon

    Bonne soirée,
    Did2604.

  17. #17
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Tu peux très bien faire cela (mais effectivement ça n'a aucun intérêt).

    La fonction 35h renvoie un un pointeur en es:bx sur le vecteur actuel, ce qui veut dire que si tu as déjà modifié le vecteur tu auras dans es:bx le vecteur de ton Int...

    Ca n'a pas vraiment d'intérêt puisque tu sais déjà où elle est (dans ton programme 8) )
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  18. #18
    Invité
    Invité(e)
    Par défaut
    Merci de tes derniers éclaircissements Nico*3-3 et également de ta rapidité de réponse (de même pour Tangix)

    Comme on avait dit, ça n'a aucun intérêt, mais j'aime bien de me casser un peu la tête

    Bonne soirée,
    Did2604.

  19. #19
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    euh...ouais dsl pr l'erreur...les gars de microsoft n'ont qu'a etre plus logique !
    enfin c le principe qui compte ( et pi g pas mes docs sur moa !)

    A++
    TangiX

Discussions similaires

  1. Détournement d'une interruption
    Par 3iten dans le forum Assembleur
    Réponses: 1
    Dernier message: 29/12/2011, 01h48
  2. Rediriger une interruption
    Par beraaa dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 31/12/2007, 06h16
  3. Réponses: 2
    Dernier message: 13/12/2006, 17h40
  4. [Debug] Désactiver une interruption
    Par Taname dans le forum Assembleur
    Réponses: 11
    Dernier message: 11/12/2006, 13h33
  5. Réponses: 2
    Dernier message: 14/07/2004, 16h55

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