Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #89, МАЙ 2006 г.

Расширь контекст

Алексей Соколов aka Aggressor

Хакер, номер #089, стр. 089-112-2


* Menu — дескриптор системного меню.

* IndexMenu — номер строки меню, в которую следует вставить пункт.

* IdCmdFirst,IdCmdLast — диапазон допустимых значений для идентификаторов вставляемых пунктов меню.

* uFlags — набор флагов.

Далее идет вызов метода TContextMenu.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HRESULT – этот метод предназначен для получения подсказки для конкретной команды меню. Параметры:

* idCmd – идентификатор пункта меню, соответствует IdCmdFirst.

* uType - запрашивает тип информации: GCS_VERB или GCS_HELPTEXT.

* pwReserved – забронирован.

* pszName – определяет буфер-строку.

* cchMax – определяет размер буфера.

Когда происходит нажатие нашего пункта, то вызывается ContextMenu.InvokeCommand, в котором мы опишем, что должно происходить. Параметром этого метода является лишь запись типа TCMInvokeCommandInfo. Вот поля записи:

* cbSize – определяет размер структуры (sizeof (TCMInvokeCommandInfo))

* hwnd – определяет окно, которое будет владельцем всех окон.

* fMask – определяет, заданы или нет параметры dwHotkey/hicon.

* lpVerb – определяет вызываемую команду.

* lpParameters – параметры (опция).

* lpDirectory – рабочая папка (опция).

* nShow – флаг передаваемый ShowWindow (SW_*).

* dwHotKey – горячая клавиша, ассоциированная с приложением после вызова (опция).

* hIcon – определяет иконку (опция).

* hMonitor – определяет монитор по умолчанию (опция).

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

1. HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}- регистрирует наш COM-сервер.

2. HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\ContMenu\CLSID, вместо CLSID – наш номер. Эта запись указывает на то, какие типы файлов будет вызывать наш обработчик (в данном случае * - для любого файла).

3. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved – это значение разрешает использовать нашу DLL и погружает ее в ОЗУ сразу же после первого вызова.

[шифруем]

Я не стал заморачиваться с изучением сложных криптоалгоритмов и решил, что отпимальнее всего будет просто заксорить файл. Алгоритм шифрующей процедуры в этом случае нарисовался такой: открываем файл, считываем один байт, ксорим его и записываем на то же место. В итоге мы получим файл той же длины, с тем же названием, но байты в нем будут совсем другими. Чтобы получить исходный файл, нам нужно просто проксорить его по новой. Да, кстати, так как мы будем все это делать для нетипизированных файлов, то для записи/чтения нужно использовать процедуры BlockRead и BlockWrite. Они объявляются так:

Назад на стр. 089-112-1  Содержание  Вперед на стр. 089-112-3