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

MFC Discussion :

CreateFile: erreur "privileged instruction"


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut CreateFile: erreur "privileged instruction"
    Bonjour.

    J'ai créé une DLL dont une fonction utilise CreateFile. Celle-ci fonctionne correctement. A présent, je convertis ma fonction en assembleur (l'assembleur intégré à VC++). Lors de l'appel de CreateFile, je reçois systématiquement l'erreur "privileged instruction".

    Voici le code qui appelle CreateFile. Rien de bien particulier, mais qui sait... Je précise que Filename est de type char*.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	push NULL
    	push NULL
    	push OPEN_EXISTING
    	push NULL
    	push FILE_SHARE_READ
    	push GENERIC_READ
    	push FileName
    	call CreateFileA
    En revanche, plus intéressant, lorsque je lance un debug, voici où se situe l'erreur (exactement, c'est la dernière ligne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    __imp__CreateFileA@28:
    100351D0 76 B4                jbe         __NULL_IMPORT_DESCRIPTOR+172h (10035186)
    100351D2 E5 77                in          eax,77h
    Qu'est-ce que j'ai bien pu faire de travers ? Où alors, y a-t-il quelque chose que je devrais savoir et que j'ignore ?

    Merci d'avance pour vos réponses.

  2. #2
    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,

    l'erreur ce produit dans le programme ou dans la dll Kernel32 (qui exporte kernel32, mais le "in" me parait étrange) ?

    En tout cas si c'est dans le porgramme alors il y a un problème de compilation, l'instruction "in" étant réservée aux programmes en ring0 (kernel mode) mais pas aux programmes utilisateurs (user mode).

    Si c'était possible j'aimerais bien voir un peu plus de code désassemblé (notemment les push/call si c'est par là que le problème ce pose).

  3. #3
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    L'erreur se produit dans ma DLL.

    Voici le code désassemblé de mon appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1000144F 6A 00                push        0
    10001451 6A 00                push        0
    10001453 6A 03                push        3
    10001455 6A 00                push        0
    10001457 6A 01                push        1
    10001459 68 00 00 00 80       push        80000000h
    1000145E FF 75 08             push        dword ptr [ebp+8]
    10001461 E8 6A 3D 03 00       call        __imp__CreateFileA@28 (100351d0)
    Et le code désassemblé de l'endroit où se produit l'erreur (vue un peu plus large cette fois):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    __imp__CloseHandle@4:
    100351C4 F0 A6                lock cmps   byte ptr [esi],byte ptr [edi]
    100351C6 E5 77                in          eax,77h
    __imp__ReadFile@20:
    100351C8 4E                   dec         esi
    100351C9 AB                   stos        dword ptr [edi]
    100351CA E5 77                in          eax,77h
    __imp__GetFileSize@8:
    100351CC 64 16                push        ss
    100351CE E6 77                out         77h,al
    __imp__CreateFileA@28:
    100351D0 76 B4                jbe         __NULL_IMPORT_DESCRIPTOR+172h (10035186)
    100351D2 E5 77                in          eax,77h   <- L'erreur se produit ici
    __imp__GetCommandLineA@0:
    100351D4 58                   pop         eax
    100351D5 E3 E5                jecxz       __NULL_IMPORT_DESCRIPTOR+1A8h (100351bc)
    100351D7 77 42                ja          __imp__InterlockedIncrement@4+3 (1003521b)
    100351D9 D1 E5                shl         ebp,1
    100351DB 77 45                ja          __imp__GetModuleHandleA@4+2 (10035222)
    100351DD A7                   cmps        dword ptr [esi],dword ptr [edi]
    100351DE E5 77                in          eax,77h
    Ceci est bel et bien présent dans ma DLL.

  4. #4
    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
    Hmmm je crois que je comprend mieux, et il semblerait que ce soit normal. En fait tu ne devrais pas passer par un call direct à la fonction, mais par un Call sur jmp IAT, je m'explique:

    en fait il faudrait qu'il y ait un jmp qui pointe sur l'adresse 0x100351d0 et que le call se fasse sur ce jmp.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Call 10001000 //call sur le jmp 
     
    10001000 JMP  dword ptr [100351D0] // l'adresse du JMP (10001000) est un exemple
    C'est de cette facon que compile VC pour les call sur API. Le JMP est un saut sur le pointeur contenu en 100351D0. Ce poitneur contient l'adresse à laquelle se trouve createfile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    __imp__CreateFileA@28:
    100351D0 76 B4                jbe         __NULL_IMPORT_DESCRIPTOR+172h (10035186)
    100351D2 E5 77                in          eax,77h   <- L'erreur se produit ici
    en fait si je ne me trompe pas, ici tu te trouves dans L'IAT (Import adress table) et le call direct fais exécuter du code alors que ce sont des pointeurs sur les APIs.

    Possible que le JMP dword ptr [xxx] n'existe pas, il faudra peut être le mettre à la main...

    Si tu veux je pourrais toujours jeter un coup d'oeil sur ton prog pour ce qui est du debugging (quitte à le reverser).

    Malheureusement, je ne sais pas comment on fait pour appeler des apis en C++ avec l'asm en inline (je programme directement en asm avec MASM32 pour les routines critiques).

  5. #5
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Suite à ce message, j'ai trouvé la solution. Je viens d'essayer avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call dword ptr CreateFile
    Au lieu de:
    Cette fois celà fonctionne.

    Merci pour vos conseils.

    P.S: L'adresse de votre site web dans votre profil ne fonctionne pas.

  6. #6
    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
    De rien je n'ai pas fais grand chose, ni compris exactement qu'il s'agissait d'un problème de pointeur direct (je pensais plutôt à un jmp sur pointeur), Mais ravi de voir que ca c'est arrangé

    P.S: merci de m'avoir notifié pour l'adresse...une faute de frappe

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

Discussions similaires

  1. Erreur privileged instruction
    Par colorid dans le forum Langage
    Réponses: 5
    Dernier message: 20/03/2013, 18h17

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