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 :

Utilisation de ancienne int 21h après l'avoir détournée


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Utilisation de ancienne int 21h après l'avoir détournée
    bonjours,
    je suis une novice en assembleur
    je voudrais detourner l'interruption 21h

    j'ai utilisé le code suivant pour la modification:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mov     ax, 3521h           ;obtenir l'offset et le segment de l'int21h 
                                                ;(l'originale)
                    int     21h                 
                    mov     ancienneInt21hOfs, bx    ; Sauvgarder l'offset
                    mov     ancientInt21hSeg, es    ; sauvgarde le  segment
     
                    mov     ax, 2521h         
                    lea     dx, nouvelle21h 
                    int     21h
    je voudrais savoir si je peux utiliser l'ancienne interruption 21h dans la définition de la nouvelle21h

    et comment pourrais-je utiliser l'ancienne 21h dans le reste du code surtout après avoir sauvegardé son segement et son offset.

    j'ai vu que peux être jmp far pourrais faire l'affaire mais j'ai pas su commment l'utiliser.


    merci pour votre aide

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2009
    Messages : 36
    Points : 52
    Points
    52
    Par défaut
    Bonjour glINSAT,

    Il suffit de faire un "call far" vers l'adresse de l'int 21h que tu as
    sauvegardé, en empilant les FLAGS avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        push cs
        mov ax, ancientInt21hSeg
        mov cs, ax
        pushf
        call dword ptr cs:ancienneInt21hOfs
        pop cs
    Je ne suis pas sûr de la syntaxe, je n'utilise pas MASM.

    Tommy

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    merci tommy pour votre réponse je l'ai bien essayé mais
    mov cs,ax et call dword ptr cs:OLDINT21Hoff sont deux instructions interdites (invalid operand(s) to instruction)

  4. #4
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    J'ai un doute là, ça marche ça ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov     ancientInt21hSeg, es    ; sauvgarde le  segment
    Il me semblait qu'on ne pouvait utiliser autre chose qu'un registre pour
    modifier un registre de segment

    a+ François

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2009
    Messages : 36
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par glINSAT Voir le message
    merci tommy pour votre réponse je l'ai bien essayé mais
    mov cs,ax et call dword ptr cs:OLDINT21Hoff sont deux instructions interdites (invalid operand(s) to instruction)
    J'ai testé, mais je n'ai pas le même résultat que toi. En fait, c'est juste "pop cs" qui est interdit, et pas le reste. Donc, à la place de "pop cs", il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	pop ax
    	mov cs, ax
    D'ailleurs, pourquoi tous les débutants utilisent MASM ?

    Citation Envoyé par Forthman Voir le message
    Il me semblait qu'on ne pouvait utiliser autre chose qu'un registre pour
    modifier un registre de segment
    Et non. On peut très bien spécifier directement un emplacement mémoire, sans passer par un registre.

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Citation Envoyé par tommy60 Voir le message
    Bonjour glINSAT,

    Il suffit de faire un "call far" vers l'adresse de l'int 21h que tu as
    sauvegardé, en empilant les FLAGS avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        push cs
        mov ax, ancientInt21hSeg
        mov cs, ax
        pushf
        call dword ptr cs:ancienneInt21hOfs
        pop cs
    Je ne suis pas sûr de la syntaxe, je n'utilise pas MASM.

    Tommy
    Un truc me chagrine quand-même...
    Comment le code écrit après "mov cs,ax" peut être exécuté puisque le segment
    de code a changé ?

    a+ François

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2009
    Messages : 36
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Forthman Voir le message
    Comment le code écrit après "mov cs,ax" peut être exécuté puisque le segment
    de code a changé ?
    Aïe, effectivement! Mon code marche, mais pas à tout les coups. Si le segment du programme n'est pas le même que le segment de l'interruption 21h originelle, il se peut que ça plante.
    Désolé, ça arrive de faire des erreurs, surtout quand on a pas appris l'assembleur sous DOS...

    @glINSAT: remplace CS par un autre registre de segment. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mov ax, ancientInt21hSeg
    mov gs, ax
    pushf
    call dword ptr gs:ancienneInt21hOfs

  8. #8
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    Personnellement, je modifierais mon code avant de détourner l'int 21h et j'insèrerais l'ancien sélecteur dans mon code.

    L'appel de l'ancienne int 21 se ferait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pushf
    db 9Ah (opcode du call directe, a verifier)
    offset:
    dw 0
    segment:
    dw 0
    Il faut bien initialiser les valeurs offset et segment aux valeurs de l'ancienne int 21h avant sinon ça plante.

    Sinon, pour récupérer les valeurs, il faudrait utiliser ce code (par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mov ax,0
    mov es,ax
    mov bh,0
    mov bl,21h (vecteur dont on veut récuperer les info)
    shl bx,2 
    mov ax,es:[bx]
    mov [offset],ax
    mov ax,es:[bx+2]
    mov [segment],ax

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2009
    Messages : 36
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par bifur Voir le message
    db 9Ah (opcode du call directe, a verifier)
    9Ah correspond bien à l'opcode de l'instruction CALL FAR.

  10. #10
    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
    Lorsqu'on détourne une interruption, on doit sauver l'offset suivi du segment de son ancien vecteur dans un espace contigu de quatre octets. De plus, on doit savoir ce que fait le processeur lorsqu'il rencontre une instruction INT :
    - il dépose d'abord le registre FLAGS sur la pile, puis le registre de segment de code courant CS et le registre IP pointant la prochaine instruction ;
    - ensuite, lit le numéro d'int. avant d'effectuer un appel lointain de l'adresse située en 0:n°x4 ;
    - enfin, il dépile les registres IP, CS et FLAGS.
    Un exemple avec l'interruption 10h des appels du vecteur d'origine dans la routine pointée par le nouveau vecteur :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    ; Fait que le mode vidéo 5 d'une carte VGA ou EGA offre les mêmes couleurs
    ; que celui d'une carte CGA reliée à un moniteur RGB :
    ; cyan, rouge et blanc.
    ; Par exemple, sous BASICA et GW-BASIC standard, le TSR intercepte l'action
    ; de SCREEN 1,1 puis de COLOR ou de PALETTE.
    ;       MASM MODE5;
    ;       LINK MODE5;
    ;       EXE2BIN MODE5
    ; Ce TSR ne vérifie ni s'il est déjà chargé ni si une carte VGA ou EGA
    ; est effectivement active.
     
     
    RougeVif        EQU     14h
     
    SEG_NUL SEGMENT AT 0
     
    Adresse_nulle   LABEL   FAR
     
    SEG_NUL ENDS
     
     
    CODE    SEGMENT
            ASSUME  CS:CODE
            ORG     100h
     
    Depart:
            JMP     SHORT INSTALLE
     
    RESIDANT        PROC
            CMP     AX,5                    ; Mode vidéo 5 demandé ?
            JE      FctBonne                ; Si oui, fonction bonne
     
            PUSH    DS                      ; Sauve DS & AX
            PUSH    AX
     
            MOV     AX,40h
            MOV     DS,AX                   ; ES : segment de données du BIOS
            CMP     BYTE PTR DS:49h,5       ; Mode vidéo 5 actif ?
     
            POP     AX                      ; Restitue DS & AX
            POP     DS
     
            JNE     AncInt                  ; Si non, se branche à l'anc. vect.
            CMP     AX,1002h                ; Fct 10h, s-fct 2 (modifie palette) ?
            JE      FctBonne
            CMP     AH,0Bh                  ; Fct Bh (fixe palette graph. CGA) ?
            JNE     AncInt
            OR      BH,BH                   ; S-fct 0 (fixe couleur de fond) ?
            JNZ     Retour                  ; Sinon, empêche de changer de palette
            CMP     BL,0Fh                  ; Couleurs vives ?
            JA      FctBonne                ; Si oui, ignore l'instruction suiv.
            MOV     BYTE PTR CS:Rouge,RougeVif-10h          ; Rouge normal
    FctBonne:
            PUSH    AX                      ; Sauve AX & BX
            PUSH    BX
     
            PUSHF                           ; Exécute la fonction vidéo demandée :
            CALL    DWORD PTR CS:AncVect    ; reg. FLAG empilé & anc. vect. appelé
            MOV     AX,1000h                ; Modifie un attribut de palette
            MOV     BL,2                    ; Attribut 2
            MOV     BH,RougeVif             ; Rouge vif par défaut
    Rouge   EQU     $-1
            PUSHF
            CALL    DWORD PTR CS:AncVect
            MOV     BYTE PTR CS:Rouge,RougeVif
     
            POP     BX                      ; Restitue AX & BX
            POP     AX
    Retour:
            IRET                            ; Retour d'interruption
    AncInt:
            JMP     Adresse_nulle
    AncVect EQU     $-4                     ; Ancien vecteur
    RESIDANT        ENDP
     
    INSTALLE        PROC
            XOR     AX,AX
            MOV     ES,AX                   ; ES = 0
            MOV     BX,ES:40h               ; Offset  en 0:(10h * 4 + 0)
            MOV     ES,ES:42h               ; Segment en 0:(10h * 4 + 2)
    ; Les quatres instructions préc. peuvent être remplacées sous DOS 2+ par :
    ; mov ax,3510h
    ; int 21h
            MOV     WORD PTR DS:AncVect+0,BX
            MOV     WORD PTR DS:AncVect+2,ES
            MOV     DX,OFFSET RESIDANT
            MOV     AX,2510h                ; Modifie le vecteur d'une int.
            INT     21h                     ; DS:DX : nouveau vecteur
     
            MOV     DX,OFFSET INSTALLE      ; Octets à laisser en mémoire
            INT     27h                     ; après avoir terminé le prgm
    INSTALLE        ENDP
     
    CODE    ENDS
     
            END     Depart

Discussions similaires

  1. [.COM] Réserver de la RAM fct 48h int 21h
    Par bulerias dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 06/12/2010, 14h33
  2. utiliser un programme apres l'avoir decompressé
    Par bracket dans le forum Linux
    Réponses: 9
    Dernier message: 17/11/2009, 09h28
  3. Rebrancher l'évenement onmousemove après l'avoir débranché
    Par Christophe Charron dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/03/2006, 08h48
  4. [nero] Comment utiliser une ancienne session
    Par FFF dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 17/08/2005, 14h03
  5. Int 21H AX=716Ch ne fait pas mon affaire !!
    Par TheBigMac dans le forum Assembleur
    Réponses: 4
    Dernier message: 10/09/2004, 20h51

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