Handle`s table -> NameByHandle()

Handle`s table -> NameByHandle()

post id: 39

post length: 2990

post datetime: 2/28/2010 5:19:24 PM

post ip: 77.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

http://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.