Interruption inexistant 6h

Signaler
-
Messages postés
7
Date d'inscription
vendredi 16 décembre 2011
Statut
Membre
Dernière intervention
27 décembre 2012
-
salut
je veut créer une instructions invalide et de créer une routine d'interruption .je sais pas comment change l'adresse dans le vecteur d'interruption pour qu'elle point sur mon routine créer déjà .
merci de me répondre.

2 réponses

Messages postés
559
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
27 octobre 2020
2
de mémoire il s'agit de l'int 33h ou de la fonction 33h de l'int 21h.
Le mieux est de telecharger l'aide des interruptions dos,taper ces mots dans google.
Messages postés
7
Date d'inscription
vendredi 16 décembre 2011
Statut
Membre
Dernière intervention
27 décembre 2012

a) Dans le contexte d'un système OS qui fonctionne en mode ?réel? comme MSDOS, vous avez directement accès à l'IDT ou indirectement par l'Int 25h et ainsi la possibilité de faire tout et n'importe quoi.
b) Dans le cas d'un système comme NT ( XP ) qui fonctionne en mode protégé, l'accès à l'IDT vous est totalement interdit il est même impossible directement. Il reste alors plusieurs contextes , l'exécution se fait à l'intérieur d'une fenêtre ?CMD? ( mode VM ) ou dans une fenêtre Win32 standard ?Console? ou non ( Ring 3 ) , ou encore en mode ?Kernel? ( Ring 0 ).

Dans une CMD XP ou sous MSDOS, il est possible de faire
Lds dx,seg_offset_int_xx
Mov al,num_int_xx
Mov ah,25h
Int 21h

Et
Seg_offset_int_xx :
Push ax
Push dx
Mov dl,?.?
Mov ah,2
Int 21h
Pop dx
Pop ax
Iret

et enfin
?
int num_int_xx
qui affichera un ?.? , marrant non ?

Dans le cas de l'execution en mode Kernel je n'ai pas trouvé la moindre référence à l'affectation ou la construction d'une INT, ce qui me paraît totalement prévisible.

Dans le contexte d'une fenêtre Win32, j'ai vérifié aussi, tout en étant persuadé qu'il est impossible de faire ce que vous souhaitez. Il existe quelque chose d'approchant ( le cas des Int 1 et 3 est à lui seul, spécial, car il existe bien un mécanisme qui permet de les détourner pour faire un debugger à votre sauce )qui permet de traiter les exceptions ( voir TRY ) prisent en charge par le système. Mais cela ne permet pas de créer une liaison entre une "INT n" et son traitement.
Voici un début de code.
#include "STFIO.H"
#include "WINDOWS.H"
static LONG WINAPI Int_3Fh ( PEXCEPTION_POINTERS pExceptionInfo )
{
PEXCEPTION_RECORD pe = pExceptionInfo->ExceptionRecord;
PCONTEXT pc = pExceptionInfo->ContextRecord;
puts ( "Int 3F.\n" );
printf
(
"ExceptionCode = %x\n"
"ExceptionFlags = %x\n"
"ExceptionAddress = %x\n"
"NumberParameters = %x\n"
"EIP = %x\n"
, pe->ExceptionCode
, pe->ExceptionFlags
, pe->ExceptionAddress
, pe->NumberParameters
, pc->Eip
);
// pour les exceptions prises en charge par le système
// il faut le laisser terminer.
// return EXCEPTION_EXECUTE_HANDLER;

// dans le cas d'une Int qui n'existe pas il faut
// au moins passer au code op suivant ?
pc->Eip++; // dans le cas 3F
return EXCEPTION_CONTINUE_EXECUTION;
}
main ()
{
printf ( "%x\n" , SetUnhandledExceptionFilter( Int_3Fh ) );
_asm
{
int 3fh
// cli
// mov ecx,0
// div ecx ; et tout autre exception ...
}
puts ( "Fin du Teste\n" );
}
#define STATUS_WAIT_0 ((DWORD )0x00000000L)
#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L)
#define STATUS_USER_APC ((DWORD )0x000000C0L)
#define STATUS_TIMEOUT ((DWORD )0x00000102L)
#define STATUS_PENDING ((DWORD )0x00000103L)
#define STATUS_SEGMENT_NOTIFICATION ((DWORD )0x40000005L)
#define STATUS_GUARD_PAGE_VIOLATION ((DWORD )0x80000001L)
#define STATUS_DATATYPE_MISALIGNMENT ((DWORD )0x80000002L)
#define STATUS_BREAKPOINT ((DWORD )0x80000003L)
#define STATUS_SINGLE_STEP ((DWORD )0x80000004L)
#define STATUS_ACCESS_VIOLATION ((DWORD )0xC0000005L)
#define STATUS_IN_PAGE_ERROR ((DWORD )0xC0000006L)
#define STATUS_INVALID_HANDLE ((DWORD )0xC0000008L)
#define STATUS_NO_MEMORY ((DWORD )0xC0000017L)
#define STATUS_ILLEGAL_INSTRUCTION ((DWORD )0xC000001DL)
#define STATUS_NONCONTINUABLE_EXCEPTION ((DWORD )0xC0000025L)
#define STATUS_INVALID_DISPOSITION ((DWORD )0xC0000026L)
#define STATUS_ARRAY_BOUNDS_EXCEEDED ((DWORD )0xC000008CL)
#define STATUS_FLOAT_DENORMAL_OPERAND ((DWORD )0xC000008DL)
#define STATUS_FLOAT_DIVIDE_BY_ZERO ((DWORD )0xC000008EL)
#define STATUS_FLOAT_INEXACT_RESULT ((DWORD )0xC000008FL)
#define STATUS_FLOAT_INVALID_OPERATION ((DWORD )0xC0000090L)
#define STATUS_FLOAT_OVERFLOW ((DWORD )0xC0000091L)
#define STATUS_FLOAT_STACK_CHECK ((DWORD )0xC0000092L)
#define STATUS_FLOAT_UNDERFLOW ((DWORD )0xC0000093L)
#define STATUS_INTEGER_DIVIDE_BY_ZERO ((DWORD )0xC0000094L)
#define STATUS_INTEGER_OVERFLOW ((DWORD )0xC0000095L)
#define STATUS_PRIVILEGED_INSTRUCTION ((DWORD )0xC0000096L)
#define STATUS_STACK_OVERFLOW ((DWORD )0xC00000FDL)
#define STATUS_CONTROL_C_EXIT ((DWORD )0xC000013AL)
#define STATUS_FLOAT_MULTIPLE_FAULTS ((DWORD )0xC00002B4L)
#define STATUS_FLOAT_MULTIPLE_TRAPS ((DWORD )0xC00002B5L)
#define STATUS_ILLEGAL_VLM_REFERENCE ((DWORD )0xC00002C0L)

désolez de ne pouvoir faire mieux ...
salutation.