Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Как запретить Ctrl-Alt-Del или Alt-Tab в Windows XP.

Компилятор: Visual C++ 6.0

Автор: Paul DiLascia

Скачать исходник к статье - 56 Кб

   Наверное, нет такого программиста, который не догадывается для чего необходимо отключать так называемую "комбинацию из трёх пальцев". В первую очередь это необходимо, чтобы пользователь не смог заметить приложение удалённого управления его компьютером (в простонародье называемым Троянским конём). Однако, есть и масса других случаев, когда необходимо запретить Ctrl+Alt+Del. Так же, справедливости ради, стоит заметить, что очень часто вызов менеджера задач, это единственный способ снять зависшее приложение.

   В таких операционных системах как Windows 95, Windows 98 и Windows Me можно запретить Ctrl+Alt+Del (а так же любые другие комбинации клавиш для переключения задач), введя операционную систему в заблуждение, заставив её думать, что запущен скринсейвер, следующей командой:

BOOL bOldState;
 SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &bOldState, 0);
 

   Однако, такая команда не сработает в Windows NT®, Windows 2000 и Windows XP. Эти версии операционных систем используют Winlogon и GINA (сокращение от Graphical Identification and Authentication). Winlogon это часть Windows, которая обеспечивает интерактивный вход в систему, а GINA, это DLL, которую использует Winlogon, для проведения авторизации. DLL GINA экспортирует некоторые функции, такие как WlxInitialize для инициализации самой себя и WlxActivateUserShell для запуска пользовательского шелла. Для проведения обычной авторизации по имени и паролю в Windows используется msgina.dll, однако, любой разработчик (т.е. Вы) спокойно может заменить msgina.dll своей собственной GINA. Например, это может потребоваться для включения авторизации по смарткартам, retinal-scan, DNA-check, или Divine Awareness  и т.д.

Посмотрите таблицу со списком функций GINA. Одна из них WlxLoggedOnSAS, которая вызывается Winlogon-ом когда он получает "secure attention sequence," больше известную как Ctrl+Alt+Del. По умолчанию GINA отображает диалог входа в систему и Вы начинаете авторизоваться.... Один из способов запретить Ctrl+Alt+Del, это написать новую MyGina.dll с заглушками, которые будут вызывать старую msgina.dll и перехватить нужным образом WlxLoggedOnSAS. Второй способ, это написание драйвера клавиатуры.

   Оба выше перечисленных способа требуют приложить давольно много усилий. Есть конечно и более простые способы. Например, чтобы запретить Ctrl+Alt+Del достаточно установить политики. Для этого идём в меню "Пуск", выбираем Выполнить...(Run), и запускаем Редактор Политики Групп ("gpedit.msc"). Смотрим в User Configuration | Administrative Templates | System и там уже можно найти секцию с именем Ctrl+Alt+Del Options:

"Remove Task Manager" это тот самый ключ, который запрещает Ctrl+Alt+Del. Программно можно просто добавить в реестр ключ:

HKCU\
  Software\
   Microsoft\
    Windows\
     CurrentVersion\
      Policies\
       System\DisableTaskMgr = dword:1
 

Теперь, если пользователь нажмёт Ctrl+Alt+Del, то получит сообщение:

 

   Итак, это первая половина ответа в опросе запрета Ctrl+Alt+Del в Windows XP. Я предполагаю, что Вы уже отключили Ctrl+Alt+Del для входа в систему установив "Use the Welcome screen" в Control Panel | User Accounts:

иначе Вы бы не спрашивали про Менеджер задач. Если же Вы не используете экран Welcome, то установка DisableTaskMgr запрещает кнопку Менеджера задач в диалоге входа/выхода из системы.

   Ключ DisableTaskMgr является недокументированным, и я обнаружил его через GPEDIT. GPEDIT очень полезная утилитка, которая позволяет контролировать многие аспекты Windows, от прав доступа до классического вида Microsoft® Internet Explorer; от отображения панели Places в диалогах до разрешения вызова Менеджера задач при помощи Ctrl+Alt+Del. При помощи этой утилиты можно изменить сотни настроек пользовательского интерфейса, заставив системного администратор пускать слюни :)

   Каков механизм поиска в реестре определённой политики? Есть два способа. Первый, это "в лоб": экспортируя ключи реестра в файл .reg, а затем изменяя политики и сравнивая различия. Все политики находятся в одном из четырёх ключей:

// относятся к данному пользователю
 HKEY_CURRENT_USER\Software\Policies
 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies
 
 // относятся к локальной машине
 HKEY_LOCAL_MACHINE\Software\Policies
 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies
 

   Второй способ заключается в исследовании административных шаблонов (файлы .adm), которые описаны в политиках. Ниже представлен отрывок из \windows\system32\GroupPolicy\Adm\system.adm, который описывает DisableTaskMgr:

CATEGORY !!CADOptions
     #if version >= 4
         EXPLAIN !!CADOptions_Help
     #endif
     KEYNAME "Software\Microsoft\Windows\CurrentVersion\Policies\System"
 
     POLICY !!DisableTaskMgr
         #if version >= 4
             SUPPORTED !!SUPPORTED_Win2k
         #endif
 
         EXPLAIN !!DisableTaskMgr_Help
         VALUENAME "DisableTaskMgr"
     END POLICY
 
     ;
     ; More Ctrl+Alt+Del policies here...
     ;
 
 END CATEGORY ; Ctrl+Alt+Del options
 
 •••
 
 DisableTaskMgr_Help="Prevents users from starting Task Manager
 (Taskmgr.exe).\n\nIf this setting is enabled and users try to start
 Task Manager, a message appears explaining that a policy prevents the
 action.\n\nTask Manager lets users start and stop programs; monitor the
 performance of their computers; view and monitor all programs running
 on their computers, including system services; find the executable
 names of programs; and change the priority of the process in which
 programs run."
 
 DisableTaskMgr="Remove Task Manager"
 

   Для указания ключа в реестре и его значения используются две основные команды KEYNAME и VALUENAME. Вы можете создать свой собственный административный шаблон и политики для своего приложения, но редактировать его нужно редактором, поддерживающим Unicode. Мой любимы Epsilon 11.0, но Notepad и WordPad тоже подойдут. Административные шаблоны позволяют сисадмину конфигурировать системы в масштабах предприятия (вот где сила!). Более подробно см. "Administrative Template File Format" в Platform SDK.

   Перед тем как двинуться дальше, позвольте заметить, что DisableTaskMgr позволяет запретить Ctrl+Alt+Del, но не перехватить её. Для перехвата Ctrl+Alt+Del, необходима любая из трёх вещей: написать собственную заглушку для GINA, написать драйвер клавиатуры, или заменить TaskMgr.exe собственной программой.

   Теперь давайте посмотрим, что можно сделать с комбинацией Alt+Tab и другими клавишами переключения задач. Например, в Windows 3.1, можно было обработать WM_SYSKEYDOWN. В Windows 95 и Windows 98 срабатывает тот же обманный метод SPI_SETSCREENSAVERRUNNING, который я упоминал в самом начале статьи. Но опять же, в Windows NT 4.0 (SP3 и позже), Windows 2000, и Windows XP эти штучки не пройдут. Прийдётся писать низкоуровневую ловушку для клавиатуры. Уж извиняйте. Впринципе это не так сложно. В примере с демонстрацией DLL (TaskKeyHook.dll), которую я написал и, которая делает всю необходимую работу. TaskKeyHook экспортирует две функции, DisableTaskKeys и AreTaskKeysDisabled. Первая устанавливает ловушку WH_KEYBOARD_LL; а вторая сообщает - установлена ли ловушка. Сама по себе процедура ловушки перехватывает Alt+Tab, Ctrl+Esc, Alt+Esc, а так же виндузовык клавиши (VK_LWIN и VK_RWIN, о которых я расскажу ниже). Как только срабатывает одна из этих комбинаций клавиш, то управление передаётся сразу же в вызывающую программу, и не происходит вызова CallNextHookEx.

LRESULT CALLBACK MyTaskKeyHookLL(...)
 {
    if (/* нужная комбинация клавиш *)
       return 1;
    return CallNextHookEx(...);
 }
 

   Код TaskKeyHook не сложен. Единственная хитрость заключается в использовании #pragma data_seg для имени сегмента данных, который содержит глобальные данные, и #pragma comment (linker...), чтобы указать линковщику сделать этот сегмент доступным (расшаренным).


Рисунок 7 TrapKeys

   Так же я написал небольшую программу TrapKeys (см. Рисунок 7 и пример программы), которая совмещает всё вместе: DisableTaskMgr, клавиатурную ловушку, и запрещение панели задач. Если уж Вам понадобится запретить переключение задач, то возможно потребуется и запрещение самой панели задач:

HWND hwnd = FindWindow("Shell_traywnd", NULL);
 EnableWindow(hwnd, FALSE); // запрещаем его
 

   Здесь присутствует небольшая причуда. Если Вы запретите панель задач, а затем нажмёте клавишу Windows (которая находится на клавиатуре между Ctrl и Alt), то откроется меню Пуск. Упс! Очевидно, панель задач перед нажатием VK_LWIN не проверяет - доступна она или нет. Если окно заблокировано (после вызова EnableWindow(FALSE)), то оно не должно обрабатывать пользовательский ввод. Похоже, что обработка VK_LWIN происходит каким-то другим способом, поэтому мне пришлось добавить обработку таких клавиш в TaskKeyHook. Теперь, если нажать клавишу меню Пуск, то ничего не произойдёт.

   Чтобы облегчить жизнь, я включил все запрещающие функции в класс CTaskKeyMgr. Все функции статические. Вы можете спокойно использовать этот класс в своих приложениях для блокирования переключения задач, а так же для блокирования самой панели задач. Например, чтобы заблокировать переключение задач или саму панель задач, но не Ctrl+Alt+Del, достаточно вызвать следующий метод:

CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS |
                      CTaskKeyMgr::TASKBAR, TRUE);
 

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

При публикации материала ссылка на сайт обязательна!

 



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS