file - Directory Listing i Windows Kernel

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal finde ud af filnavnet til den specifikke mappe.


Du vil læse indholdet ved at udføre ZwCreateFile () med det filnavn.


For at gøre dette, prøv at få filnavne i mappen ved at gøre ZwQueryDirectoryFile ().


Men selvom der er mange filer i mappen, er det kun FILE\_BOTH\_DIR\_INFORMATION struktur med filnavn '.' Og størrelse 2 i buffer returneres.


Returværdien af ​​ZwQueryDirectoryFile () var godt udført med STATUS\_SUCCESS.


Nedenfor er kildekoden.




UNICODE\_STRING DirectoryName;
OBJECT\_ATTRIBUTES ObjectAttributes;
HANDLE DirectoryHandle;
IO\_STATUS\_BLOCK IoStatusBlock;
PFILE\_BOTH\_DIR\_INFORMATION DirInformation;

RtlInitUnicodeString(&DirectoryName, L"\SystemRoot");
InitializeObjectAttributes(&ObjectAttributes, &DirectoryName, 

OBJ\_CASE\_INSENSITIVE, 0, 0);

    Status = ZwCreateFile(
&DirectoryHandle, 
FILE\_LIST\_DIRECTORY | SYNCHRONIZE, 
&ObjectAttributes, 
&IoStatusBlock, 
0, 0, 
FILE\_SHARE\_VALID\_FLAGS, 
FILE\_OPEN, 
FILE\_SYNCHRONOUS\_IO\_NONALERT | FILE\_DIRECTORY\_FILE, 
0, 0);

if (NT\_SUCCESS(Status))
{
    DBG("ZwCreateFile() Success");
}
else
{
    DBG("ZwCreateFile() Fail \%08x", Status);
    return;
}

DirInformation = ExAllocatePool(NonPagedPool, sizeof(FILE\_BOTH\_DIR\_INFORMATION) * 512);

Status = NtQueryDirectoryFile(
DirectoryHandle, 
0, 0, 0, 
&IoStatusBlock, 
DirInformation, 
sizeof(FILE\_BOTH\_DIR\_INFORMATION) * 512, 
FileBothDirectoryInformation, 
TRUE, 0, 0);

if (NT\_SUCCESS(Status))
{
    DBG("NtQueryDirectoryFile() Success");
}
else
{
    DBG("NtQueryDirectoryFile() Fail \%08x", Status);
    ZwClose(DirectoryHandle);
    return;
}

while (1)
{
    UNICODE\_STRING EntryName;
    EntryName.MaximumLength = EntryName.Length = (USHORT)DirInformation->FileNameLength;
    EntryName.Buffer = &DirInformation->FileName[0];

    DBG("TEST : \%wZ", &EntryName);

    if (DirInformation->NextEntryOffset == 0)
    {
        break;
    }
    else
    {
        DirInformation = (PFILE\_BOTH\_DIR\_INFORMATION)(((PUCHAR)DirInformation) + DirInformation->NextEntryOffset);
    }
}








Nedenfor er resultatet af WinDbg.




Indtast billedbeskrivelse her [2]


Selvfølgelig er der mange filer i '\ SystemRoot' ('\ ?? \ C: \ Windows').


Jeg ved ikke, hvorfor det sker.


Vær venlig at hjælpe mig.

Bedste reference