Нативная хромятина

Aug 30, 2010 00:43


Уже довольно длительное время являюсь пользователем Google Chrome и вроде всем этот браузер неплох, но вот сегодня случилось так, что я открыл для себя очень интересную вещь об этом замечательном браузере. Не буду вдаваться в предысторию, а перейду сразу к телу. Сегодня узнал, что хром оказывает инлайнит следующие функции из ntdll.dll:

chrome.exe-->ntdll.dll-->NtOpenProcessToken, Type: Inline - RelativeCall 0x7C90D5F6
chrome.exe-->ntdll.dll-->NtOpenThreadTokenEx, Type: Inline - RelativeCall 0x7C90D666
chrome.exe-->ntdll.dll-->NtQueryFullAttributesFile, Type: Inline - RelativeCall 0x7C90D796

Обратившись к справке, вот что удалось мне выяснить:
NtOpenProcessToken( IN HANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, OUT PHANDLE TokenHandle );
где:
ProcessHandle - HANDLE to Process Object.
DesiredAccess - Access mask for opened Token Object.
TokenHandle - Result of call - HANDLE to Token Object associated with process specified by ProcessHandle parameter.

NtOpenThreadToken( IN HANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN BOOLEAN OpenAsSelf, OUT PHANDLE TokenHandle );
где:
ThreadHandle - HANDLE to thread object.
DesiredAccess - Access mask for opened Token Object.
OpenAsSelf - ???
TokenHandle - Result of call - HANDLE to Token Object associated with ThreadHandle thread.

С первыми двумя хуками вроде бы все понятно, хром берет токен своего процеса родителя и потом запускает внутри родителя дочерние потоки. Хотя лично мне не особо понятно зачем такой дикий изврат с перехватами нативных функций. Если конечно подумать, то может быть это каким-то боком связанно с песочничей хрома, т.е. каждая вкладка хрома, как бы это по проще выразится, создает свое виртуальное пространство внутри которого все происходит и если случается сбой, то дальше этой закладки дело не уходит и посему можно закрыв проблемную закладку продолжить работу браузера без потери данных. Таким образом хром не виснит как фаерфокс сразу целиком, а благодаря такой модели если и виснит, то только один поток. Но если чесно решение довольно спорное, поскольку поигравшись с хромом мне удалось свалить систему в синяк. Ну даже если и так, оставляем NtOpenProcessToken и NtOpenThreadTokenEx в покое, то вот зачем хучить NtQueryFullAttributesFile мне чесно говоря не особо понятно, обратившись к документации по NtQueryFullAttributesFile, я вычитал следующее (стоит оговорится что перевод вольный, возможно перевел не совсем точно):

Функция NtQueryFullAttributesFile используется для получения информации о файлах находящихся на подключенных низкоскоростных устройствах. См. также описание функции NtQueryAttributesFile. Использование NtQueryAttributesFile это самый простой и лучший способ узнать, существует ли файл. NtOpenFile нелучший вариант, поскольку это изменяет время последнего доступа к открытому файлу.

Если кому-то интересно, то вот описание NtQueryFullAttributesFile:

NtQueryFullAttributesFile( IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PVOID Attributes );
где:
ObjectAttributes - Path and name of File Object to query.
Attributes - Pointer to FILE_NETWORK_OPEN_INFORMATION structure.

Обратившись еще раз к документации, за разъяснением по поводу FILE_NETWORK_OPEN_INFORMATION, вот что мы имеем:

typedef struct _FILE_NETWORK_OPEN_INFORMATION {

LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER AllocationSize;
LARGE_INTEGER EndOfFile;
ULONG FileAttributes;
ULONG Unknown;

} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;

где:
CreationTime - Indicates time of file creation.
LastAccessTime - Time of last open file.
LastWriteTime - Time of last write operation.
ChangeTime - Time of any last change.
AllocationSize - Number of bytes that file use on storage, equal or greater to EndOfFile.
EndOfFile - Length of file, in bytes.
FileAttributes - File attributes.
Unknown - ???

Меня это немного ввело в тупик, если кто-то мне раскажет зачем браузеру хучить эту функцию, то буду очень признателен. Данный опус не претендует на гениальность, а является очередной газификацией луж.

P.S. так же, как мне кажется, остается открытым вопрос о пряморукости программистов из гугл, которые придумали такой интересный метод с инлайном нативных функций.

google

Previous post Next post
Up