2017-10-02 15 views
0

J'essaie d'ouvrir un handle vers le pilote de périphérique d'objet TCP.Lecture depuis un objet de périphérique TCP

Ceci est mon code:

NTSTATUS OpenTcpDeviceObject(PHANDLE tcpFile, ACCESS_MASK DesiredAccess) { 
    UNICODE_STRING fileName; 
    OBJECT_ATTRIBUTES objectAttributes; 
    IO_STATUS_BLOCK IOBlock; 

    RtlInitUnicodeString(&fileName, TEXT("\\Device\\Tcp")); 

    InitializeObjectAttributes(
     &objectAttributes, &fileName, OBJ_CASE_INSENSITIVE, NULL, NULL); 

    NTSTATUS Status = NtOpenFile(
     tcpFile, DesiredAccess | SYNCHRONIZE, &objectAttributes, &IOBlock, 
     FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT); 

    if (!NT_SUCCESS(Status)) 
     *tcpFile = INVALID_HANDLE_VALUE; 
    return Status; 
} 

Cependant retourne Statut -1073741790, la question est de savoir pourquoi ce ne fonctionne pas? Je cours ceci d'usermode, sur un compte de non-administrateur. D'après ce que je comprends, cette opération ne nécessite pas de privilèges d'administration tant que le ACCESS_MASK est réglé sur FILE_READ_DATA.

NOTE

Le Status qui est retourné points ERROR_ACCESS_DENIED (5) comme une erreur Dos. Mais comment peut-on refuser l'accès si je demande seulement des autorisations de lecture? Cependant, quand je lance GetAdaptersAddresses qui accède à l'objet périphérique Tcp, cela me permet d'accéder aux adresses de multidiffusion/monodiffusion sans privilèges!

Alors, quel est le problème?

+0

@HarryJohnston Que voulez-vous dire? 'SYNCHRONIZE' est généralement inclus avec' FILE_READ_DATA' - pourquoi serait-ce le problème? –

+0

Il n'y a pas de règle AFAIK qui dit que vous devez recevoir 'SYNCHRONIZE' si vous avez reçu' FILE_READ_DATA' de sorte que * pourrait * avoir été le problème. Il s'avère que ce n'était pas le cas, mais ça aurait pu l'être. :-) –

Répondre

1

le \ Device \ Tcp avoir à côté DACL

T FL AcessMsK Sid 
A 00 001200A0 S-1-1-0 'Everyone' 
A 00 001F01FF S-1-5-18 'SYSTEM' 
A 00 001F01FF S-1-5-32-544 'Administrators' 
A 00 001200A0 S-1-5-12 'RESTRICTED' 

si vous ne SYSTEM ou Administrators ans suffit FILE_READ_ATTRIBUTES|FILE_EXECUTE|SYNCHRONIZE|READ_CONTROL ou cette combinaison déclarés comme FILE_GENERIC_EXECUTE dans wdm.h. de sorte que vous avez pas FILE_READ_DATA accès et doit c00000022 obtenu lorsque vous demandez FILE_READ_DATA

à propos GetAdaptersAddresses - ce dispositif tcp pas ouvert avec FILE_READ_DATA. il demande seulement FILE_READ_ATTRIBUTES|SYNCHRONIZE. vous ne serez jamais appelé ZwReadFile sur le périphérique tcp. nous avons eu des infos à partir de ZwDeviceIoControlFile. l'accès requis est codé dans chaque code IOCTL et la plupart IOCTL codes déclarés comme FILE_ANY_ACCESS - ce qui signifie que le handle de fichier avec un accès est ok. par exemple IOCTL_TCP_QUERY_INFORMATION_EX défini comme CTL_CODE(FILE_DEVICE_NETWORK, METHOD_NEITHER, FILE_ANY_ACCESS) - vous n'avez donc pas besoin de lire l'accès aux données dans le fichier. ouvrir le fichier avec SYNCHRONIZE accès seulement - ce sera suffisant.

et que la note GetAdaptersAddresses utilisation \ Device \ Nsi sur les dernières versions de Windows