gestion d'intérruptions, modification 80x86

gestion d'intérruptions, modification 80x86 - ASM - Programmation

Marsh Posté le 22-03-2010 à 15:47:08    

Bonjour,
j'essaie de m'informer sur le sujet mais j'ai bien de la misère à trouver. Je programme en asm 80x86 et j'essaie de modifier l'interruption 9h de la table de vecteur d'interruption. Je sais que pour ce faire, je dois modifié le IP qui pointera sur la nouvelle instruction que je déciderai. Par contre, je ne sais tout simplement pas à quoi devrait ressembler ma nouvelle instruction. Je veut que mon interruption matérielle(dans ce cas-ci gérée par le clavier) affiche la caractère en décimal choisi sur le clavier.
J'ai essayé certaines choses par contre... rien n'abouti.
Merci de m'éclairer un peu!

Reply

Marsh Posté le 22-03-2010 à 15:47:08   

Reply

Marsh Posté le 23-03-2010 à 11:09:46    

Quand tu parles de la nouvelle instruction, tu veux dire "l'instruction sur laquelle pointe l'IP" ?
 
Parce que de mémoire y'a rien de spécifique... à part qu'à la fin évidemment faut balancer le bon return pour revenir au point d'interruption, mais au début, que dalle.

Reply

Marsh Posté le 23-03-2010 à 11:35:13    

"Modifier le IP qui pointera sur la nouvelle instruction que je déciderai"....

 

Mais ça va pas non ? et l'adresse de retour, tu la récupères comment ? Et le contexte de pile, et tout ? T'as envie de bloquer ta machine toi hein [:mlc]

 

Le détournement d'un vecteur d'interruption se fait de la manière suivante :
- on sauvegarde d'abord l'adresse de l'ancien handler (fonction 35h de l'interruption 21h)
- on met en place le nouveau handler (fonction 25h de l'interruption 21h)
- une fois le boulot terminé, on remet tout en place (idem)

 

exemple

Code :
  1. ; d'abord, on sauvegarde l'ancien handler
  2. mov ax, 0x3509 ; ah=0x35, al=0x09, cf la doc de int 21h. on récupère l'ancien handler en es:bx
  3. les bx, oldhandler ; adresse de "oldhandler" dans es:bx (utilisé par 21h pour y stocker l'adresse de l'ancien vecteur)
  4. int 21h
  5.  
  6. ; on met en place le nouveau handler
  7. mov ax, 0x2509 ; service 25h de int 21h utilisé, cf doc
  8. lds dx, newhandler ;
  9. int 21h
  10.  
  11. ; et on remet tout en place quand c'est terminé
  12. mov ax, 0x2509
  13. lds dx, oldhandler
  14. int 21h
 

Ne pas oublier de terminer le code de ton vecteur par l'instruction "iret".

 

La doc de 21h, service 35h : http://www.gladir.com/LEXIQUE/INTR/int21f35.htm
Et celle du service 25h : http://www.gladir.com/LEXIQUE/INTR/int21f25.htm


Message édité par Harkonnen le 23-03-2010 à 11:42:26

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-04-2010 à 09:47:38    

A la fin de ton interruption matérielle tu es obligé d'envoyer 0x20 sur le port 0x20 avant le iret.
Evite aussi de massacrer les registres : voilà pourquoi tu devras empiler ceux que tu modifies sur la pile (et pas oublier de les dépiler avant le iret)


---------------
VB.NET is good ... VB6 is better !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed