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

x86 16-bits Assembleur Discussion :

TASM : détournement d'interruptions


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut TASM : détournement d'interruptions
    S'il-vous-plaît, je voudrais savoir où est la faute dans cette macro de détournement d'interruption 23h :

    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
    redirige_int macro
          mov ah,35h ;  cf la doc de int 21h. on récupère l'ancien handler en es:bx
          mov al, 23h ; adresse de "oldhandler" dans es:bx (utilisé par 21h pour y stocker l'adresse de l'ancien vecteur)
         int 21h
    	  mov cx, es
    	  push cx
    	 	 push bx ; pour les recupérer apres
    mov ax,ds
    mov es,ax
    mov ax,0
    mov ds,ax
    mov bx,812h
    mov bx,offset traiter_ctrl_break; ma propre routine
    mov bx,814h
    mov ax,cs
    mov bx,ax
    mov ax,es
    mov ds,ax
     
     
    endm redirige_int

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    La méthode universelle pour détourner une interruption est de modifier son vecteur situé à l'adresse 0:(4 x int) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            xor     ax,ax
            mov     es,ax                   ; ES = 0
            cli                             ; Déconnecte les interruptions
            mov     word ptr es:8Ch,dx      ; Avec DX nouvel offset du vecteur
            mov     word ptr es:8Ch+2,ds    ; Avec DS nouveau segment du vecteur
            sti                             ; Reconnecte les interruptions
    8Ch = 23h x 4


    Une méthode plus sage sous DOS est décrite ici (procédure INSTALLE) :
    http://www.developpez.net/forums/d84...e/#post5636015
    Il s'agit d'un programme résident.

    Une précaution toutefois avec l'interruption 23h (interception break), il est obligatoire de restituer le vecteur précédent utilisé par le DOS une fois le programme terminé.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    vrément merci, vous etes tres gentil, vous mavez aidé enormement, je suis nouvo sur ce site de forum, je suis vrement content avec cet activité, je vous remerci une autre fois.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    svp, eske je peut savoir comment avoir l'offset d'une procedure ,le mettre dans un registre et puis son segment puisque jai besoin de defenir ds:dx de la nouvelle routine, je veu savoir le syntaxe comment (tasm). merci d'avance.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    jai corriger comme vous mavez dit mai je comprend pas pourkoi ca marche pas, ya pas des erreur mai la sémantique je pense, c'est la macro:



    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
    redirige_int macro
          mov ah,35h ;  cf la doc de int 21h. on récupère l'ancien handler en es:bx
          mov al, 23h ; adresse de "oldhandler" dans es:bx (utilisé par 21h pour y stocker l'adresse de l'ancien vecteur)
         int 21h
    	  mov cx, es
    	  push cx
    	 	 push bx 
    mov ax,ds
    mov es,ax
    mov ax,0
    mov ds,ax
    cli
    mov bx,word ptr es:8Ch
    mov bx,offset traiter_ctrl_break
    mov bx,word ptr es:8Ch+2
    mov ax,cs
    mov bx,ax
    mov ax,es
    mov ds,ax
    sti
     
    endm redirige_int

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    Un petit exemple pour tout clarifier :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    ; Requiert DOS 2 ou plus.
    ;       MASM    EX;
    ;       LINK    EX;
    ;       EXE2BIN EX EX.COM
     
     
    Int_detourne    EQU     23h
     
     
    CODE    SEGMENT
            ASSUME  CS:CODE, DS:CODE
            ORG     100h
     
    Depart:
             jmp     Debut
     
    TRAITEMENT      PROC
            iret
    TRAITEMENT      ENDP
     
    Debut:
            ; Sauve ancien vecteur...
            mov     ax,3500h + Int_detourne
            int     21h
            mov     word ptr Anc_vect + 0,bx
            mov     word ptr Anc_vect + 2,es
            ; ... avant de le modifier
            mov     al,Int_detourne
            mov     dx,offset TRAITEMENT    ; DS:DX : nouveau vecteur
            call    DETOURNE
     
            ; (...)
     
            ; Restitue ancien vecteur
            push    ds
            mov     al,Int_detourne
            lds     dx,Anc_vect             ; Charge Anc_vect dans DS:DX
            call    DETOURNE
            pop     ds
     
            ret                             ; Fin
     
    DETOURNE        PROC
    ; Affecte un nouveau vecteur à une interruption donnée.
    ; Entrée :      AL      interruption concernée
    ;               DS:DX   nouveau vecteur
            push    ax
     
            mov     ah,25h
            int     21h
     
            pop     ax
            ret
    DETOURNE        ENDP
     
     
    Anc_vect        dd      (?)
     
    CODE    ENDS
     
            END     Depart
    Le procédure DETOURNE peut être écrite de la façon suivante :
    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
     
    DETOURNE        PROC
    ; Affecte un nouveau vecteur à une interruption donnée.
    ; Entrée :      AL      interruption concernée
    ;               DS:DX   nouveau vecteur
            push    ax
            push    bx
            push    es
     
            xchg    bx,ax                   ; BL <- AL
            xor     ax,ax
            mov     es,ax                   ; ES = AX = 0
            mov     al,4
            mul     bl                      ; AX = 4 * BL
            xchg    bx,ax                   ; BX <- AX
            cli
            mov     word ptr es:[bx+0],dx   ; 0:[interruption * 4 + 0] <- DX
            mov     word ptr es:[bx+2],ds   ; 0:[interruption * 4 + 2] <- DS
            sti
     
            pop     es
            pop     bx
            pop     ax
            ret
    DETOURNE        ENDP
    Cependant, le service 25h de l'interruption 21h du DOS s'avère plus souple d'emploi.

    P.S. : si vous comprenez cet exemple, détourner une interruption vous semblera un jeu d'enfant. Une instruction INT appelle la routine pointée par son vecteur qui se termine généralement par une instruction IRET. Cette dernière dépile et restitue le registre d'état (FLAG), le segment et l'offset de l'appelant.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    Je remonte ce sujet pour apporter des précisions sur l'interception Ctrl-C du DOS.
    Le meilleur moyen de détourner l'interruption 23h est d'utiliser la fonction DOS 25h qui configure les vecteurs d'interruption. En effet, pour cette interruption spécifique, DOS ne modifie pas le vecteur appelé par le processeur mais appelle lui-même la routine de l'utilisateur. Ainsi, celle-ci peut indiquer à DOS la manière de continuer le programme.
    Vous verrez les pièges à éviter au lien suivant :
    http://www.developpez.net/forums/d10...eme-assembleur

Discussions similaires

  1. Détournement de l'interruption clavier 9h
    Par jayce23 dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 14/05/2012, 23h38
  2. Détournement d'une interruption
    Par 3iten dans le forum Assembleur
    Réponses: 1
    Dernier message: 29/12/2011, 01h48
  3. [TASM] Détournement d'interruption
    Par adrien_najaque dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 24/05/2008, 13h23
  4. [TASM][Débutant] Fonction 0AH de l'interruption 21h
    Par Punkfloyd1967 dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 13/04/2008, 14h08
  5. Détournement d'une interruption
    Par Invité dans le forum Assembleur
    Réponses: 18
    Dernier message: 16/02/2005, 13h49

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