TSR & Détournement d'interrupt(ion) [Résolu]

Signaler
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
bonjour à tous.
j'ai fait un petit prog en asm 32bits pour dos mais il ne fonctionne pas ... reste à savoir pourquoi !!
pourriez-vous m'aider ??

;Change Int19h (write 'Interrupt Disabled!!' on the screen)
Org 100h

Install:
    Call Change19H

EndInstall:
        Call GoTSR
   
Change19H:
    Mov AH,25H
    Mov AL,19H
;    Push DX
    Mov DX,NewInt19H
    Int 21
;    Pop DX
    Ret

NewInt19H:
;        Push DX
        Mov DX,Msg
    Call PrintStr
;        Pop DX
    IRET

GoTSR:
        Mov AH,31h
        Mov AL,00h
    Mov DX,DS
        Int 21h
        Ret

PrintStr:
    ;Print String on the screen (DS:DX)
    Mov AH,09h
    Int 21h
    Ret

Msg    DB 'Interrupt Disabled!!','$'

12 réponses

Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
1-La Fonction 31h demande que DX contienne le nombre de paragraphe à reserver. Or ici  DX=0, donc pas de TSR.
2-Lorsqu'elle est exécutée par int 21h, le retour au  DOS est immédiat.( Ici l'instruction ret  ne sera donc pas exécutée )
3-Dans "change  19h"  il faut:
mov dx,offset newint19h. (ici DX contiendra le contenu de newint19h , c'est à dire le code de mov dx,msg).
4-De  même il faut: mov dx,offset msg
5-En général, le code d'un  TSR doit se disposer de la manière suivante
org 100h
Debut: jmp Install 
Newint:
  ....
iret

Install:
(ici modifier l'interrupt et tout le code qui ne doit s'exécuter qu'au chargement du module)
tsr:
mov dx,offset install
mov cl,  4
shl dx,cl  ; conversion en paragraphe,  
mov ah,31h
int 21h
end DebutAmicalement<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
justement, je me suis aperçu que nasm n'était pas approprié pour ça ...
j'ai donc pris tasm.
et maintenant ca fonctionne !
voilà le code :

Code            Segment
                Org 100h
                Assume Cs:Code
Start: Jmp Main                         ; Go to the Entry Point



;####################################################################
;########################### Vars & Consts ##########################



NewIntMsgS DB 'This interrupt has been erased','$'



IntDet Equ 19h
TstFnc Equ 19h
TstFncR Equ 0FFh



;####################################################################
;############################ Procedures ############################



CheckInstalled Proc Near
  Mov AH,19h
  Mov AX,TstFnc
  Int 19h
  Cmp AH,TstFncR
  Je CheckInstalled_OK
  Jne CheckInstalled_ERR
 Ret
 CheckInstalled_OK:
  Call DetourneInt
  Call GoTSR
 CheckInstalled_ERR:
  Mov DX,Offset(AiMsg)
  Call PrintStr
  Int 20h
CheckInstalled EndP



DetourneInt Proc Near
 ;Détourne l'interrupt
  Mov AH,25H
  Mov AL,IntDet
  Mov DX,Offset(NewInt)
  Int 21h
 Ret
DetourneInt EndP



GoTSR Proc Near
 ;Met le programme en TSR
  Mov DX,Offset(DynVarsEnd)
  Inc DX
  Int 27h
 Ret
GoTSR EndP



NewInt Proc Near
  Cmp AX,TstFnc
  Jne NewIntMsg
 NewIntTest:
   Mov AH,TstFncR
  Jmp IntRet
 NewIntMsg:
   Mov AL,'X'
   Mov BL,7
   Mov CX,1
   ;Call PrintChr
 IntRet:
  IRet
NewInt EndP



PrintChr Proc Near
 ;Affiche un chr. à l'écran avec l'int 10h (Al=chr, Bl=couleur, Cx=répet.)
 Mov AH,09h
 Mov BH,00h
 Int 0h
PrintChr EndP



PrintStr Proc Near
 ;Affiche une chaine de caractères à l'écran (DS:DX)
  Mov AH,09h
  Int 21h
 Ret
PrintStr EndP



;####################################################################
;########################### Entry Point ############################



Main Proc Near
 ;Entry Point
  ;Affiche le titre
   Mov DX,Offset(CmdMsg)
   Call PrintStr
  ;Call CheckInstalled ;Il va rebooter !!
  Call DetourneInt
  Call GoTSR
; Ret
Main EndP



;####################################################################
;########################### Dynamics Vars ############################
DynVars: ;Début des vars. dyn.



CmdMsg DB '+------------------------------------+',13,10
 DB '¦     Anti-Reboot(AR) Protection     ¦',13,10
 DB '+------------------------------------+',13,10
 DB '$'
AiMsg DB 'Program already installed !','$'



DynVarsEnd: ;Fin des vars dyn.
;####################################################################
;############################ Code Ends #############################



Code    Ends
        End Start



�1A;


PS: j'utilise notepad++ comme éditeur ... il peut éditer n'importe quoi !!
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

je ne suis pas d'accord pour dire que nasm est orienté linux, c'est un des rares assembleur multi-platforme.
ce qui fonctionne avec TASM fonctionne bien evidemment avec NASM, le tout etant de comprendre la synthaxe des deux.

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

il faut restorer tout les segments et registres (flags compris) modifiés puis effectuer un jmp far vers l'ancienne routine.
tu peux bien sur pusher segment puis offset de l'ancienne routine puis faire un retf mais je pense que le jmp far est plus efficace.

@++
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
ok! tuas raison pour tous les points SAUF que dans mov dx,offset newint19h dx contiendra non pas le code de newint19h mais un pointeur !!

et encore un autre truc, j'utilise NASM donc pas de Offset ...

et encore enore un autre truc : shl dx,cl sert à quoi ??

merci d'avoir répondu ...
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
et au fait, ca ne marche PAS ...
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Salut
 Je me suis mal exprimé : "ici " signifie  "dans ton cas"  c'est à dire pour mov dx,newint19h
Avec Nasm il faut utiliser:  lea  dx,newint19h . Lea = Load Effective address
L'allocation de mémoire sous msdos s'opére par paragraphes. Un paragraphe = 16 octets.
Erreur de ma part,  il faut shr dx,cl et non pas shl . Shr  dx,cl = Shift right  dx cl fois. Ce qui revient à diviser dx par16 donc convertir la taille du TSR en paragraphes puisque cl=4.
Qui est-ce qui ne marche pas ?  Pour tester ton  programme il faut bien sûr exécuter  int19h ( une interruption  utilisée par le Bios à la fin du POST)  Avant de le rendre résident , vérifie son fonctionement. Avec  ceci par exemple:
 org 100h
debut:
lea dx,newint19
mov al,19h
mov ah,25h
int 21h
 int 19h ; exécute int 19h
mov ah,0
int 16h ; attend clavier
mov ah,4ch
int 21h ; exit
newint19:
lea dx,msg
mov ah,9
int 21h
iret
msg db 'succes$'


end debut

.  
  
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
l'instruction LEA ne marche pas ...
et le programme en lui-même ne marche pas non plus

ps: j'ai remplacé lea par mov et ca ne plante pas à la compil, ca ne FONCTIONNE pas !
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
 


Le problème vient de mon ignorance de Nasm. Mille excuses.
 En fait pour cet assembleur mov dx,nom charge effectivement dx avec l'offset de nom, pour charger le contenu de nom il faut écrire mov dx,[nom]
Quant à Lea il ne peut être utilisé que si l'adresse est complexe.
Avec Masm et Tasm il existe des directives pour définir le modèle utilisé ce qui n'est pas le cas avec  Nasm .
Ton programme suppose que cs et ds sont identiques. Est-ce bien le cas? Sinon il suffit d'ajouter au début push cs  , pop ds.
Je me demande  si tu ne t'es  pas inspiré d'un code rédigé pour Tasm ou Masm en model tiny. C'est ce que j'ai cru à première vue. Je vais télécharger Nasm : on apprend à tout age.






    
 
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
oui effectivement je m'en suis inspiré mais je n'ai pas fait Ctrl-C Ctrl-V
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Nasm est asembleur orienté Linux, il y a quelques différences avec masm et tasm
En enregistrant le code suivant sous le nom int16.asm par exemple, la ligne de commande
 nasm -f bin int16.asm -o int16.com
génère un com qui pourra te servir de modèle
 
bits 16
org 100h
debut:
jmp install
newint19:
push ds ; en principe une interruption doit restaurer tous les régistres utilisés
push cs ;  ds= ds de l'appel
 pop ds ; ds=cs
mov dx,message
mov ah,9
int 21h
mov ah,1
;
boucle:
 int 16h
jz boucle
pop ds
iret
message db 'pressez une touche$'
install:
mov dx,newint19
mov ax,2519h
int 21h
mov dx,install
mov cl,3
shr dx,cl
mov ax,3100h
int 21h


pour le tester:


int19


debug
a
int 19
(ici un retour ligne pour quitter l'assembleur)
g
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
encore une chose : quand on fait un TSR qui détourne une int. et qui fait du chaînage, comment fait-on avant le RetF ??
Doit-on d'abord empiler le segment ou l'offset ?