Placer l'Interrupt Flag (IF) a zéro en Ring3 et sous XP !

Signaler
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003
-
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003
-
La question est assez parlante ...
et n'est pas anodine ... croyez le bien !
Bien évidemment, en Ring3 sous Xp, CLI est interdit !
Alors ?
Comment trouver l'astuce ou le chemin détourné pour
pouvoir placer ce flag IF a zéro ... ( sous ring3 et XP) ...
Celui qui a une solution, c'est un as ! clair !
Avant de penser que vous avez une solution ...
essayez la vite fait ... car ce n'est pas aussi évident que l'on pourrait le penser. Certaines solutions qui donneraient l'impression de pouvoir arriver a cela sans problème ...
Ne fonctionne pas du tout !
Toutes les idées sont les bien venues,
et merci, merci, a tous et toutes ....
Robby,

13 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
J'ai deja fait tout un tas de vaines tentatives, le seul moyen correct est d'utiliser BlockInput(1) mais faut voir si correspond a tes besoins.
BruNews, ciao...
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003

J'ai fait connaissance avec cette fonction BlockInput !
Je ne connaissais pas ...c'est déjà ca !
Mais sinon, non ... ca suffit pas !
BlockInput ne place pas l' interrupt flag a 0.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
A sur qu'il ne le place pas, il faut passer en ring0 pour cela mais XP laisse un temps si court qu'on ne peut rien faire.
BruNews, ciao...
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003

Oui, Ring0 est, en principe, le seul état dans lequel on puisse zéroter facilement le IF via l'instruction CLI, ok !
Je ne comprends pas cette phrase:
mais XP laisse un temps si court qu'on ne peut rien faire.
Que veux tu dire par la ?
Il laisse trop peu de temps quand, quand on fait quoi ?
merci de bien voiloir m'expliquer ta phrase.
Robby,
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Je parlais en Ring0, on peut passer mais c'est quasi limite qu'on ne peut rien y faire. Nous avons deja effectue pas mal de tests, vois les sources deja publiees ou nous avons eu un debat sur le sujet. Le flag en lui meme n'a plus d'importance, XP a devie les interruptions et les events se produisent mais tu as une faute generale des qu'il s'aperçoit qu'il n'est plus seul en Ring0.
BruNews, ciao...
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003

Ah bon !
moi, je passe en Ring0 via diverses méthodes.
1) je hook un service de la table de service n°0 et ensuite Sysenter
2) ou alors je construis une table n°2, depuis ring3.
3) je hook le vecteur n°0 de l' IDT et je passe en ring0 via
un "mov eax,0 + dic eax"
4) CallGate aussi ...
Et je peux rester en ring0 autant de temps que je veux.
As tu positionner le registre FS a 30h quand tu te trouves en
Ring0 ? Car sous XP, Fs est tjs a 38h en ring3 et tjs a 30h en ring0 ! Via un appel Sysenter (table de service n°0 hookée ou table de services n°2), le système place lui meme le registre FS a 30h. Mais je ne sais pas quelle méthode tu utiises ... attention a FS, c'est hyper important. Si tu passes en ring0 en conservant dans FS sa valeur ring3 ... boum!
voila .. a+
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Derniers essais etaient faits en CallGate mais faudra revoir en verifiant avec tes indications, le prob est que le temps manque pour les delires.
BruNews, ciao...
Messages postés
21
Date d'inscription
dimanche 17 août 2003
Statut
Membre
Dernière intervention
27 mars 2004

Salut,

Je n'apporterai rien de constructif, mais quand même, j'aimerais réagir, parce que bon, je sais que mon source est loin d'être parfait, mais de là à affirmer qu'on a même pas le temps de faire un cli, c'est quand même une sacré dose de mauvaise foi.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Ohe Chrishka, faut pas faire d'interpretation sur mes propos pour ensuite taxer de mauvaise foi. Le 'cli' bien entendu passe mais la moindre boucle de temporisation non.
Il n'est pas question d'attaquer qui que ce soit ici, on n'est pas dans les querelles de gamins. Si toto8966 ou qui que ce soit d'autre apporte des lumieres sur un sujet, elles sont les bienvenues.
Sans rancune Chrishka, le but n'etait vraiment pas de te froisser mais de faire avancer le chmilibilic.
BruNews, ciao...
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003

Bien entendu qu'on a le temps de placer un CLI.
Mais la moindre boucle pose problème ?
Oui, j'ai eu ce soucis avec le soft de Chris au départ .
Aucune critique a son égard .. Chris est un gars super gentil, et sans lui je serais encore au fond d'une caverne dans cette histoire de ring0 via CallGate ... encore merci Chris!
Mais dans le soft de Chris, il manque un pti truc !
Petit truc qui n'a rien avoir avec la stricte théorie du CallGate.
Pour ce, le soft de Chris est parfait ! ... Mais nous sommes sous Xp ... et oui ! et pour faire travailler un Callgate avec XP, il faut placer le registre FS a 30h. Sous XP, FS est tjs a 38h en Ring3 et tjs a 30h en Ring0. Une fois passé en ring0, tu dois placer au plus vite FS a 30h ... sinon, juste, tu n'as pas le temps d'y rester beaucoup en ring0. Moi, je fais un "mov bx,30h" juste avant le Call Far .. et juste a l'entrée du code ring0, je fais un "mov fs,bx" ... et bingo ... je suis resté des heures en ring0, dans des boucles énormes ! aucun soucis ! De toute facon, "votre" CLI ne sert absolument a rien ! Le soucis, c'est FS, pas CLI ou pas CLI !
Une fois FS placé a 30h, et une fois dans ma boucle (de 1hrs au moins), j'ai tout fais moi en parallèle. J'ai surffé sur le net, j'ai écouté du mp3 .. tout et ce que l'on veut, ca bug pas, rien, nickel ! ... mais pour faire tout ca en plus du ring0 (via callgate) qui tourne, faut justement pas placer de cli, sinon on sais rien faire en // . Le réel soucis de la technique CallGate AVEC XP, n'est pas la ... vous n'y etes pas les gars (c amical no soucis,hi) .. le réel pd, c'est l'entrée dans le code ring0 via CallGate. Notre Far Call ne place pas l'Interrupt Flag a zéro (comme via un sysenter ... hook de la table de service, ou comme après une exeption suite a un "div, 0" ... hook du vecteur n°0 de l'IDT ... deux autres techniques)
Non, le Call Far laisse le IF a 1 lui !!!!! et Entre le Call Far et la première instruction du code ring0 ... au mieux nous aurons "mov fs,bx (bx=30h)" .. LA ca peut planter ! ... et ca plante ! une fois sur environ 1000 appels ! Plus jamais une fois que FS est a 30h, mais avant oui ! entre l'appel et la première instruction. C'est le seul problème qui ne rend pas le CallGate a 100% fiable sous XP .... 99,9 % !
Je cherche sur ce truc, mais c'est mal parti ! pas évident !
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003

Petite précision indispensable.
Oui, pacer Fs a 30h au plus vite dans le code Ring0.
ET le replacer a 38h des le retour en ring3, bien entendu !
Pas oublier ca !!!
moi, je fais ca:

Pushad
push FS

push offset ma_routine
mov ebx, 00000030h
mov eax, offset mon_truc
Call Far [eax]

pop FS <---- retour de FS a 38h
Popad
etc...
------- FIN ----------------
mon code ring0 :
label : X
mov FS,bx
Call [esp + 8] ---> ma routine ( mon code + ret )
RetF 4 (1 paramètre)

-----------------------------------------
pas oublier de positionner dans le descripteur pour
UN paramètre.
Voila, pas oublier de restaurer FS a 38h au retour !
Le seul soucis .. je me répète hi ... surviendra au "label :X"
sinon, si on passe le mov fs,bx ... c'est Noel !
Messages postés
21
Date d'inscription
dimanche 17 août 2003
Statut
Membre
Dernière intervention
27 mars 2004

Ah ben, mea culpa Brunews, désolé d'avoir mal compris, sans la moindre rancune évidemment. Toto8966, merci pour ces compliments, t'en fais peut-être un peu trop non :p ?
En tout cas j'espère que je les mérite.
Sérieux t'arrives à faire un call à l'intérieur de la fonction ring0 ? c'est super intéressant ça, moi j'ai jamais réussi, ça me faisait toujours sauter le système. T'arrives à appeler une API win32 ?
Messages postés
18
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
24 novembre 2003

Chris, Toto8966, c'est Robby .. Pierre le Fou quoi ! ok ?
Bon, sans FS a 30h, tu sais rien faire et ca plante directe !
Avec FS a 30h ... le soleil se lève !
Oui, je fais un call extérieur pour appeler le code ring0 que je veux réellement exécuter. Le petit code a l'arrivée n'est qu'un dispatcher universel ! Oui, tu peux appeler une api32 !
Mais seulement les api32 prévue pour etre appelées depuis ring0. Par exemple ... la fonction pour calculer l'adresse physique dans ton code ... avec 80000000h et A0000000h, tu vois ? Une fois passé en ring0, tu peus appeler la vrai fonction "MmGetPhysicalAddress" ... ou alors, je passe en ring0 via callGate, et la, j'appelle la réelle fonction KeAddSystemServiceTable. La table n°2 se construit et je peux alors passer en ring0 avec un appel du type Sysenter.
C'est très joli tout ca ... mais une méthode qui n'est pas fiable a 100% c'est pas pro ca ! hi et CalGate ne l'est pas.
Car si une interruption se présente avant que FS ne soit a 30h, ca bug directe ! Normal ... tu va tomber dans la routine système "IoInitializeIrp" sur un " mov, FS:[eax+165]" ..
et si Fs est toujours a 38h, la référence memoire est dans les choux, "Fault Page" et Boum !
CallGate en Boucle, plante une fois sur 500 si tu es en priorité normale, une fois sur 5000 si tu passes en real time !
Mais encore (c'est la dernière) une fois ... ca n'a rien avoir avec CLI ou pas CLI ... c'est juste le temps entre la call Far et le mov FS,30h ... ou IF=1. Si une interrupt se présente pendant se tres court instant, 1) on est deja en ring0 ...
2) FS n'est pas encore positionné a 30h .... boum!
voila a+