Posts tagged: WinAPI

Программная активация BHO

By , 28 ноября, 2014 00:18

В последних версиях Internet Explorer для полноценной установки BHO недостаточно зарегистрировать DLL и добавить его в список расширений в реестре: для начала работы требуется, чтобы юзер его активировал. Я нашел решение этой проблемы.
Допустим, у нас имеется расширение со следующим CLSID:

Далее нам потребуются два ключа — текстовый и бинарный. Текстовый ключ содержит строку «Only Internet Explorer code should write this user setting. See http://go.microsoft.com/fwlink/?LinkId=159651 for more details.», а бинарный содержит два идущих друг за другом DWORD со значениями 0×00000001 и 0×00000009 соответственно, после чего идет CLSID расширения. Таким образом, бинарный ключ занимает 24 байта (8 байт на два DWORD + 16 байт на CLSID):

Также для работы нам потребуется получить SID текущего пользователя в текстовом виде. Функция весьма проста, вот её код:

В вышеприведенной функции GetLogonSID и FreeLogonSID — функции-врапперы, предназначенные для получения SID по переданному токену. После получения необходимых данных можно начать формирование ключа. Объявим необходимые переменные:

Прежде всего, разумеется, нужно получить текстовое представление SID’а пользователя:

После этого заполняется 24-байтовый массив результата. Каждый байт — результат операции XOR над соответствующим байтом бинарного ключа, соответствующим байтом текстового SID и соответствующим байтом текстового ключа. Значение счетчика текстового ключа нужно сохранить:

После этого результат нужно поксорить с оставшейся частью текстового ключа. Если в цикле мы достигаем конца результата — начинаем ксорить снова с первого элемента. Эту работу выполняет следующий код:

Теперь ключ готов. Его необходимо записать, как параметр типа REG_BINARY, в ключ реестра HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Approved Extensions. Название параметра — это GUID расширения, а его значение — получившийся в результате ключ:

Функция SetKeyWritable выставляет разрешения на запись параметров данного ключа. Вот её код:

Вот и всё — эта техника позволяет обойти запрос разрешения на запуск BHO в Internet Explorer.

Замена WaitForInputIdle() для консольных процессов

By , 27 ноября, 2014 23:31

Известно, что после создания процесса в Windows с помощью CreateProcess поток не ожидает его инициализации, и управление возвращается сразу. Для того, чтобы дождаться инициализации, многие используют функцию WaitForInputIdle, но она не умеет работать с консольными процессами и процессами без очереди сообщений:

If this process is a console application or does not have a message queue, WaitForInputIdle returns immediately.

Я решил эту проблему с помощью Native API. В расширенной версии структуры PEB имеются два поля, Ldr и LoaderLock, заполняемые загрузчиком PE в процессе инициализации. Таким образом, для полноценной проверки нам достаточно определить адрес PEB в другом процессе с помощью Native API NtQueryInformationProcess, считать структуру PEB, используя ReadProcessMemory, и проверить оба поля на NULL. В случае, если какое-либо из полей равно нулю, загрузка PE ещё не завершена; иначе, процесс уже инициализирован и загрузчиком передано управление на точку входа.

Теперь можно написать функцию ожидания. Вот мой вариант (возвращает 0 в случае успешного ожидания и WAIT_TIMEOUT, если время ожидания истекло):

Работает стабильно. Один из комментаторов в MSDN указывает на возможные проблемы с WOW64, но я никаких проблем пока не обнаружил.

Panorama Theme by Themocracy