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 32-bits / 64-bits Assembleur Discussion :

[Win32] Instructions cli et sti


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut [Win32] Instructions cli et sti
    Bonjour a tous j'aurais voulu savoir précisément à quoi servent ces instructions (cli et sti) ?

  2. #2
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    Bonjour,

    STI (Set Interrupt) sert à armer le drapeau d'interruption. CLI (Clear Interrupt) est l'instruction contraire, qui désarme le drapeau d'interruption. Permet principalement d'activer/désactiver les interruptions hardware.

    Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...


  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Est-ce que tu pourais être plus précis stp, ou me renvoyer vers un tutorial ?
    A quoi correspondent ces interruptions et qund osnt-elles utilisées ?
    Par exemple, j'ai un code source de driver qui fait un beep carte mère, et lorsqu'il envoie des données sur les ports de la carte avec des IN et OUT, il met des cli et sti... pourquoi ?
    Au fait, j'ai entendu parle de la fonction HalMakeBeep pour créer un beep carte mère. Peut-on l'appeler du user-land ou faut-il faire un driver ?

  4. #4
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    lorsqu'il envoie des données sur les ports de la carte avec des IN et OUT, il met des cli et sti... pourquoi ?
    Il met des CLI et STI pour empêcher les interruptions matérielles (comme l'appui sur une touche du clavier), probablement dans ce cas pour que le processeur ne soit pas dérangé soit par l'utilisateur, soit par des timers déclenchant des interruptions à intervalles réguliers.

    Pour savoir qu'est-ce qu'une interruption, outre l'entrée Interruption de la FAQ, tu as un tutoriel en assembleur très bien fait qui parle également des interruptions. Enfin, tu peux regarder le manuel Intel aux entrées CLI et STI.

    Pour HalMakeBeep, qui est importée de la bibliothèque HAL.DLL (il faut posséder HAL.LIB pour l'utiliser), la dll se charge visiblement des appels au système, tu peux donc l'appeler de n'importe quel niveau de sécurité. Elle prend comme seul paramètre la fréquence du son.

    Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...


  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Pourquoi dois-je utiliser hal.lib ? Je ne peux pas aller chercher les fonctions dans hal.dll avec GetProcAdress() ?
    J'ai trouvé hal.lib mais elle est dans le DDK, est-ce que cela signifie qu'un driver est nécessaire ?
    et puis je n'ai trouve aucun .h, comment utiliser le .lib ?

  6. #6
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    Hal.lib est utile pour importer HalMakeBeep en assembleur; je pense que nous ne sommes pas sur la même fréquence.

    Je ne peux pas aller chercher les fonctions dans hal.dll avec GetProcAdress() ?
    Tu peux faire ça, en C... auquel cas, ce message n'a rien à faire dans le forum assembleur.

    Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...


  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    ok dsl c'est parce qu'on est parti sur autre chose et ue je ne voulais pas créer de nouveau thread ^^
    Bon pour finir la-dessus, c'est normal qu'il n'y ait pas de .h ?
    En C : je fais un pointeur sur le bon type de fonction et j'appelle GetProcAdress()
    En ASM : il me faut un .inc non ? il est introuvable...

    Je me trompe ?

    PS : est-ce que le fait que hal.lib ne soit pas fourni avec VC++ mais avec le DDK n'indiquerait pas qu'il faille etre en ring0 ?

    PS2 : en C, comment je fais pour trouver le prototype de la fonction alors qu'il n'y a pas de .h ?

  8. #8
    Membre habitué
    Avatar de Stormy_Ordos
    Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 91
    Points : 166
    Points
    166
    Par défaut
    En ASM : il me faut un .inc non
    Exactement. Ca liste les prototypes de la même manière qu'un .h.

    il est introuvable...
    Effectivement c'est gênant . Mais si tu arrives à trouver les prototypes des fonctions de Hal.dll que tu veux utiliser, tu peux quand même utiliser ces fonctions avec le seul Hal.lib, à condition que tu déclares ces prototypes au début de ton programme et que tu lies Hal.lib à ton prog à l'assemblage.

    en C, comment je fais pour trouver le prototype de la fonction alors qu'il n'y a pas de .h ?
    Si tu ne possèdes pas de .h, impossible de le deviner évidemment. Maintenant, la même chose s'applique ici : si tu possèdes une doc, ou un site internet où les fonctions sont décrites en détail, c'est tout ce dont tu as besoin.


    est-ce que le fait que hal.lib ne soit pas fourni avec VC++ mais avec le DDK n'indiquerait pas qu'il faille etre en ring0 ?
    A ce niveau-là je ne pense pas que ça indique quoi que ce soit, maintenant il est possible que la DLL(liée au LIB) implémente un driver qui se charge des instructions en ring0(ça arrive souvent, justement à cause des nouveaux OS comme XP). Si c'est le cas, tu ne devrais pas avoir de problèmes pour appeler une fonction de cette bibli. De toutes façons, si la dll accède au matériel sans demander l'autorisation à personne, tu le sauras tout de suite

    Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...


  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Ok j'ai fait quelques recherches et j'ai trouvé le prototype de HalMakeBeep() dans ntddk.h
    Premier problème : impossible d'inclure ce fichier dans VC++, il me dit que le compilo est incompatible. Je procède donc ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "windows.h"
     
    typedef BOOLEAN (WINAPI *pHalMakeBeep)(IN ULONG freq);
     
    int main()
    {
    	HMODULE hmod = LoadLibrary("hal.dll");
    	int error = GetLastError();
    	FreeLibrary(hmod);
    	return 0;
    }
    hmod vaut alors NULL et j'obtiens l'erreur 998, ERROR_NOACCESS, "Invalid access to memory location".
    Je suppose donc qu'un programme user-land classique ne peut pas accéder à cette DLL....

    Je vois deux solutions :
    - faire un driver noyau (ASM ou C, peu importe), ou toute autre chose permettant de passer en ring0
    - s'injecter dans lsass.exe pour obtenir les privilèges SYSTEM et voir s'ils sont suffisants...


    Qu'en pensez-vous ?

  10. #10
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    HalMakeBeep() utilise des instructions privilégiées (CLI, IN, OUT, etc.) et est mappée par le système d'exploitation - plus exactement pas le kernel lui-même - et sert d'interface entre le kernel et le matériel. (HAL => Hardware Abstraction Layer : Couche d'abstraction matériel)

    En gros, il est impossible de l'utiliser en ring 3 (user mode), d'autant plus que l'ImageBase de HAL est située hors des limites de chargement de l'user-land.

    Par contre on peut tout à fait l'utiliser depuis un driver tournant en ring 0 (kernel mode). Il suffit de lier sur la bibliothèque HAL puisque quoi qu'il arrive, une version de HAL est présente en mémoire, il n'y a donc pas besoin de charger explicitement ce module.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Je comprends pas bien ce que tu entends par "mappé par le système d'exploitation" ? (surtout par mappé en fait :p)
    Sinon si je link avec hal.lib, a quoi sert la DLL puisque le code de hal.lib sera recopié dans mon executable a la compilation ?

  12. #12
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Citation Envoyé par TheShade Voir le message
    Je comprends pas bien ce que tu entends par "mappé par le système d'exploitation" ? (surtout par mappé en fait :p)
    Petite erreur de ma part, je voulais dire que le module (et non la fonction) était mappé par le système. (to map => transférer en mémoire).

    Sinon si je link avec hal.lib, a quoi sert la DLL puisque le code de hal.lib sera recopié dans mon executable a la compilation ?
    C'est une édition de lien dynamique, le code reste dans la DLL et le module appelant (dans notre cas, le driver) ne fait qu'appeler la fonction de la DLL. Le code de cette dernière n'étant présent que (et uniquement) dans la DLL, pas dans le module appelant.

    C'est la même chose que quand on lie sur une DLL système user-land (type kernel32). Le code reste dans la DLL, le programme appelant une fonction de kernel32 ne fait que faire un appel (CALL) vers le code de la DLL.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    alors le fichier .lib contient quoi ? (puisque le code est dans la DLL...)

  14. #14
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par TheShade Voir le message
    alors le fichier .lib contient quoi ? (puisque le code est dans la DLL...)
    Dans le cas qui nous intéresse (bibliothèque statique [*.lib] permettant de lier sur une bibliothèque dynamique [*.dll]), celle-ci contient uniquement :

    - Une entête : qui donne divers renseignements comme la date de création du fichier *.lib, le nombre de fonctions, la taille du fichier .lib, etc.

    - Un tableau donnant les fonctions exportées par la DLL.

    - Un tableau donnant, pour chaque fonction, certaines informations (à quel module appartient la fonction, le nom de la fonction est-il décoré, numéro d'ordinal de la fonction, type du processeur cible, etc.)

    Les fonctions exportées le sont sous la forme de décoration C (C name mangling ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _MakeHalBeep@4
    __imp__MakeHalBeep@4
    ...
    _xxxx@ : la fonction est de type stdcall.

    MakeHalBeep : nom de la fonction

    @4 : La fonction prend x/4 paramètre(s) en entrée ou x est le nombre suivant le '@'.

    Dans l'exemple, il y a un seul paramètre ayant une taille 4 octet (ça ne permet pas de dégager le type, cela peut être un int, un unsigned int, etc., mais ça n'est pas le rôle de l'éditeur de lien de vérifier le type.)

    [N.B : le 4 dans X/4 est une constante : @8 donne deux paramètres en entrée.]

    __imp__ : la fonction peut être importée par un autre module, elle est donc exportée par la bibliothèque dynamique (*.DLL).

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    J'ai posté une nouvelle discussion sur le forum WIN32 parce qu'on a complètement dévié du sujet initial

    Merci de bien vouloir y passer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/06/2007, 17h25
  2. [win32]C avec C++/CLI
    Par gdpasmini dans le forum C++/CLI
    Réponses: 8
    Dernier message: 13/06/2006, 22h18
  3. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58

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