Documents & code‎ > ‎

Handle`s table -> NameByHandle()

Handle`s table -> NameByHandle()   
post id39 
post length2990 
post datetime2/28/2010 5:19:24 PM 
post ip77.51.94.169 

 



[RE] Handle`s table -> NameByHandle() 


[RE] ещё один вариант разыменования описателя объекта, полученного по схеме: 

[ntdll::ZwQuerySystemInformation [16] -> SYSTEM_HANDLE_INFORMATION -> ntdll::ZwDuplicateObject] 

Т.к. получение [ONI] через [ntdll::ZwQueryObject] проблемматично, учитывая общеизвестный завис 
на пайпах и файлах открытых монопольно по синхронизации, а так же то, что разработчики на VB 
- самые ленивые разработчики в мире, такие варианты как: 

[FS] DeviceIoControl(0x83350000) -> с заполнением структуры [ONI] 

и 

[Driver::Kernel-Mode] ObReferenceObjectByHandle -> OBJECT_HEADER -> NameOffset 

urlhttp://www.wasm.ru/article.php?article=drvw2k14

urlhttp://forum.shelek.ru/index.php/topic,827.0.html} 

отпадают. 

Более того, как показывает практика, нет особой необходимости писать драйвер и из режима ядра 
пытаться вытянуть то, что можно получить и в [User-mode]. 
Хотя тема достаточно стара, и возможно появились и более простые варианты, ниже следует 
пример
 разименования хендла файла через [ntdll::ZwQueryInformationFile -> FNI], ибо 
ZwQueryInformationFile корректно обтейнит пайпы. Для обхода ИНЫХ ограничений по доступу 
просто пытаемся объект отобразить на память через [CreateFileMapping], 
пропуская те, что не удалось. 




    Public Function GET_NAME_BY_HANDLE(ByVal IHandle As [Int32], ByVal SHI.GrantedAccess As Integer) AsString 
        Dim Ret As String = "" 
        '|--------------------- 
        '| 1 |  Mapping [IT]  | 
        '|--------------------- 
        Dim IMAP As IntPtr = IFile.CreateFileMapping(IHandle _ 
                                , IntPtr.Zero, IFile.PAGE_READWRITE _ 
                                , 0, 100, Environment.UserName.ToString) 
        If IMAP.ToInt32 > 0 Then 
            ''|----------------------- 
            ''| 2 |  получаем [FNI]  | 
            ''|-----------------------     
            Dim FNI As IntPtr = Marshal.AllocHGlobal(512) _ 
            If IHandles.ZwQueryInformationFile(IHandle, Marshal.AllocHGlobal(8), FNI, 512, 9) = 0 Then 
                With Encoding.ASCII 
                     
                    Ret = Marshal.PtrToStringBSTR( _ 
                            New IntPtr(FNI.ToInt32 + 4)) _ 
                            .Split(.GetChars(New Byte() {0} _ 
                            , 0, 1))(0) 
                End With 
            End If 
            Marshal.FreeHGlobal(FNI) 
        End If 
        CloseHandle(IMAP) 
        '-------------------------------------------- 
        '|  INFO:                                   | 
        '|  При необходимости, можно использовать   | 
        '|  и [GrantedAccess] в качестве условия    | 
        '|  для mapping`а                           | 
        '|  ...                                     | 
        '-------------------------------------------- 
        Return Ret 
    End Function 




THE END.
Comments