6 Comments

  • 1. Baboon  |  juin 23rd, 2007 at 13:08

    Eheh
    Tres simpa :D
    J’avais failli explorer NtOpenProcess mais ayant effacés toutes mes VM sur un coup de tete ….
    Sinon eh bien bravo , article clair avec des zoulis n’exemple , que demander de plus ;)
    Et en plus un lendemain de fete de la musique ….
    Moi qui ce jour la me suis levé a 16h30 …
    Chapeau ;)

  • 2. overdose  |  juin 30th, 2007 at 11:03

    si j’ai bien comprit les pid/tips ont juste des aoffset dans une table de pointeur.

    Est ce que ca veut dire ke les pid et tId sont completement previsible ?

  • 3. admin  |  juin 30th, 2007 at 14:54

    En effet les PID/TID sont prévisibles. Ils seront crée s dans les entrées libres de la table, cependant pour connaitre ces entrées il faut regarder le champ FirstFree de la PspCidTable. Par exemple, quand on crée un process :

    nt!ExCreateHandle+0x12:
    805671ca 50              push    eax
    kd> p
    nt!ExCreateHandle+0x13:
    805671cb 56              push    esi
    kd> p
    nt!ExCreateHandle+0x14:
    805671cc e8e5feffff      call    nt!ExpAllocateHandleTableEntry (805670b6)
    
    PHANDLE_TABLE_ENTRY
    ExpAllocateHandleTableEntry (
        IN PHANDLE_TABLE HandleTable,
        OUT PEXHANDLE pHandle
        )
    
    kd> dt nt!_HANDLE_TABLE e1000198
       +0x000 TableCode        : 0xe1003000
       +0x004 QuotaProcess     : (null) 
       +0x008 UniqueProcessId  : (null) 
       +0x00c HandleTableLock  : [4] _EX_PUSH_LOCK
       +0x01c HandleTableList  : _LIST_ENTRY [ 0xe10001b4 - 0xe10001b4 ]
       +0x024 HandleContentionEvent : _EX_PUSH_LOCK
       +0x028 DebugInfo        : (null) 
       +0x02c ExtraInfoPages   : 0
       +0x030 FirstFree        : 0x414
       +0x034 LastFree         : 0x3e0
       +0x038 NextHandleNeedingPool : 0x800
       +0x03c HandleCount      : 260
       +0x040 Flags            : 1
       +0x040 StrictFIFO       : 0y1
    kd> dd fce89b98 l 1
    fce89b98  00000000
    kd> p
    nt!ExCreateHandle+0x19:
    805671d1 8bd8            mov     ebx,eax
    kd> dd fce89b98 l 1
    fce89b98  00000414 
    

    Le parametre pHandle pushé est un pointeur qui va recevoir la valeur du PID. Si on regarde son contenu après le call, on voit bien que c’est la valeur du champ FirstFree. Après l’appel, la valeur est mise a jour :

    kd> dt nt!_HANDLE_TABLE e1000198
       +0x000 TableCode        : 0xe1003000
       +0x004 QuotaProcess     : (null) 
       +0x008 UniqueProcessId  : (null) 
       +0x00c HandleTableLock  : [4] _EX_PUSH_LOCK
       +0x01c HandleTableList  : _LIST_ENTRY [ 0xe10001b4 - 0xe10001b4 ]
       +0x024 HandleContentionEvent : _EX_PUSH_LOCK
       +0x028 DebugInfo        : (null) 
       +0x02c ExtraInfoPages   : 0
       +0x030 FirstFree        : 0x408
       +0x034 LastFree         : 0x3e0
       +0x038 NextHandleNeedingPool : 0x800
       +0x03c HandleCount      : 261
       +0x040 Flags            : 1
       +0x040 StrictFIFO       : 0y1
    
  • 4. philou  |  juillet 10th, 2007 at 11:59

    Hum… je crois que je suis très loin du sujet du billet mais…. Korn, à la fête de la musique, tu viens de la ville où on fait du bon vin toi aussi :p ?

    (Non, non, je suis pas tombé ici par hasard XD)

  • 5. Ivanlef0u’s Blog &r&hellip  |  novembre 24th, 2007 at 16:24

    [...] temps. On va ruser comme des renards, sachant qu’un handle n’est qu’au final un indice dans une table, il suffit de crée un handle, de récup sa valeur puis de le ferme, en théorie le handle suivant [...]

  • 6. Geo  |  septembre 23rd, 2010 at 20:43

    Hello, Ivan.

    Je sais pas si tout ça c’est encore frais dans ta tête, mais que se passe-t-il lorsqu’un handle est ouvert par une DLL ? La table est gérée par la DLL elle-même – une fois mappée en mémoire – ou c’est le processus qui importe la DLL – IAT, LoadLibrary, … – qui s’occupe de tout ça ?

    Merci !

    Geo

Trackback this post