Я хочу отключить CTRL + ALT + DEL в Windows XP в моем коде ANSI-C? - PullRequest
9 голосов
/ 12 марта 2010

Я хочу отключить CTRL + ALT + DEL в Windows XP в моем коде ANSI-C. Возможно ли это сделать?

Ответы [ 6 ]

15 голосов
/ 12 марта 2010

Прежде всего, перехват Ctrl-Alt-Del (Secure Attention Sequence) и отключение его - это две разные вещи. Несмотря на заблуждения многих, можно отключить SAS.

Вот 3 способа сделать это:

  1. Установить HKCU / Программное обеспечение / Microsoft / Windows / CurrentVersion / Политики / Система / DisableTaskMgr = 1

  2. Замените msgina.dll своим собственным или напишите драйвер клавиатуры.

  3. Перейдите в меню «Пуск», выберите «Выполнить» и введите «gpedit.msc», чтобы запустить редактор групповой политики. Посмотрите в пользовательской конфигурации | Административные шаблоны | Система, и вы найдете раздел под названием Ctrl + Alt + Del Options - «Удалить диспетчер задач»

Чтобы перехватить SAS, вы можете написать заглушку GINA, создать драйвер клавиатуры или заменить TaskMgr.exe

Эти требования возникают в основном для встраиваемых систем, и вы можете контролировать, как создается образ WinXP.

Ссылка: MSDN Mag Sept 2002

4 голосов
/ 05 января 2012

Да, это так.

CTRL + ALT + DEL, известная как Secure Attention Sequence (SAS) , не может быть перехвачен через общий механизм Global Windows Hook.

Возможность перехвата SAS, о которой я знаю, независимо от ситуации, это всего лишь один: драйвер.

Но это не обязательно должен быть полноценный драйвер устройства, он может быть более простым, известным как драйвер фильтра. Вам нужно научиться делать разработку ядра, которая не так тривиальна и потребует от вас, например, отладки ядра на двух машинах. Если вы планируете использовать драйвер на других компьютерах с более новой версией Windows, вам нужно будет подписать драйвер, поскольку Windows Vista x64 и новее не будет загружать не подписанные драйверы, это разрешено делать только в версии x86 этих операционных систем. И вы рискуете получить немного забавного BSOD.

Официальным примером Microsoft для драйвера фильтра клавиатуры является kbfiltr образец.

Теперь есть гораздо более простой способ обойти все это: использовать некоторую библиотеку, которая взаимодействует с драйвером, чтобы выполнить всю эту грязную работу. И это то, что я пытался сделать.

Я разработал библиотеку, которую я называю Перехват , которая позволяет, ну ... перехватывать ввод устройства из обычной программы пользовательского режима при использовании полномочий драйвера устройства. Это небольшой и простой C api, который внутренне взаимодействует с драйверами, которые я правильно подписал.

Вы должны использовать installer для установки драйверов в вашей системе перед использованием API.

На моем веб-сайте уже есть образец для перехвата SAS, и вы также можете проверить его здесь , на github. Я оставлю это здесь для справки:

#include <iostream>

#include <utils.h>
#include <interception.h>

using namespace std;

namespace scancode {
    enum {
        esc  = 0x01,
        ctrl = 0x1D,
        alt  = 0x38,
        del  = 0x53,
    };
}

InterceptionKeyStroke ctrl_down = {scancode::ctrl, INTERCEPTION_KEY_DOWN                      , 0};
InterceptionKeyStroke alt_down  = {scancode::alt , INTERCEPTION_KEY_DOWN                      , 0};
InterceptionKeyStroke del_down  = {scancode::del , INTERCEPTION_KEY_DOWN | INTERCEPTION_KEY_E0, 0};
InterceptionKeyStroke ctrl_up   = {scancode::ctrl, INTERCEPTION_KEY_UP                        , 0};
InterceptionKeyStroke alt_up    = {scancode::alt , INTERCEPTION_KEY_UP                        , 0};
InterceptionKeyStroke del_up    = {scancode::del , INTERCEPTION_KEY_UP | INTERCEPTION_KEY_E0  , 0};

bool operator==(const InterceptionKeyStroke &first,
                const InterceptionKeyStroke &second) {
    return first.code == second.code && first.state == second.state;
}

bool shall_produce_keystroke(const InterceptionKeyStroke &kstroke) {
    static int ctrl_is_down = 0, alt_is_down = 0, del_is_down = 0;

    if (ctrl_is_down + alt_is_down + del_is_down < 2) {
        if (kstroke == ctrl_down) { ctrl_is_down = 1; }
        if (kstroke == ctrl_up  ) { ctrl_is_down = 0; }
        if (kstroke == alt_down ) { alt_is_down = 1;  }
        if (kstroke == alt_up   ) { alt_is_down = 0;  }
        if (kstroke == del_down ) { del_is_down = 1;  }
        if (kstroke == del_up   ) { del_is_down = 0;  }
        return true;
    }

    if (ctrl_is_down == 0 && (kstroke == ctrl_down || kstroke == ctrl_up)) {
        return false;
    }

    if (alt_is_down == 0 && (kstroke == alt_down || kstroke == alt_up)) {
        return false;
    }

    if (del_is_down == 0 && (kstroke == del_down || kstroke == del_up)) {
        return false;
    }

    if (kstroke == ctrl_up) {
        ctrl_is_down = 0;
    } else if (kstroke == alt_up) {
        alt_is_down = 0;
    } else if (kstroke == del_up) {
        del_is_down = 0;
    }

    return true;
}

int main() {
    InterceptionContext context;
    InterceptionDevice device;
    InterceptionKeyStroke kstroke;

    raise_process_priority();

    context = interception_create_context();

    interception_set_filter(context, interception_is_keyboard,
                            INTERCEPTION_FILTER_KEY_ALL);

    while (interception_receive(context, device = interception_wait(context),
                                (InterceptionStroke *)&kstroke, 1) > 0) {
        if (!shall_produce_keystroke(kstroke)) {
            cout << "ctrl-alt-del pressed" << endl;
            continue;
        }

        interception_send(context, device, (InterceptionStroke *)&kstroke, 1);

        if (kstroke.code == scancode::esc)
            break;
    }

    interception_destroy_context(context);

    return 0;
}
2 голосов
/ 14 марта 2010

Winlogon просто вызывает SetWindowsHookEx на рабочем столе по умолчанию для захвата САПР. Поскольку только поток с именем SetWindowsHookEx может отменить регистрацию хука, он уверен, что никакой другой процесс не сможет его украсть Кроме того, клавиатура хук работает только на рабочем столе процесса. Вы можете попробовать перейти на новый рабочий стол и нажать CAD. Некоторая внутренняя информация вы найдете здесь .

2 голосов
/ 12 марта 2010

Вставка хуков в систему клавиатуры не поможет, несмотря на то, что некоторые здесь говорят.

Система клавиатуры работает путем выдачи определенного аппаратного прерывания. ОС перехватывает это прерывание и реагирует на него соответствующим образом. На это могут повлиять зацепы клавиатуры.

Последовательность CTRL-ALT-DEL выдает отдельное аппаратное прерывание от других ключей. Первоначально это было сделано для того, чтобы команда перезагрузки была доступна даже тогда, когда другие команды клавиатуры были заморожены. (Несмотря на то, что резидентное приложение прерывания в MS-DOS все еще может перехватывать и обрабатывать прерывание.)

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

Я не говорю, что невозможно перехватить это прерывание и изменить его поведение. Я не знаю, что это не так. Но это будет не так просто, как положить хуки в код обработки клавиатуры.

1 голос
/ 19 июня 2010

Это ответ на то, что хочет сделать ОП, а не сам вопрос ...

Самый простой способ достичь вашей цели - написать драйвер фильтра клавиатуры, который отбрасывает весь ввод. (Это действительно единственный правильный способ отключения всех вводимых данных, который я могу придумать, и этот метод используется такими продуктами, как LogMeIn)

1 голос
/ 12 марта 2010

Почему все ответы говорят, что это невозможно? Это очень возможно, например, вот как включить его, если вирус отключил его:

Click Start
Click Run
Enter gpedit.msc in the Open box and click OK
In the Group Policy settings window

Select User Configuration
Select Administrative Templates
Select System
Select Ctrl+Alt+Delete options
Select Enable Task Manager

Как сделать так, чтобы это отключили, и как это сделать из кода, я дам вам понять (подсказка: вы, вероятно, захотите отредактировать некоторые ключи реестра ), поскольку этот вопрос довольно сомнительный.

Вы также можете установить различные зацепы клавиатуры, которые изменяют функциональность ctrl + alt + delete.

Вы можете прочитать об API реестра здесь .

Если вы не хотите, чтобы НИЧЕГО не происходило, когда вы нажимаете Ctrl Alt Delete, посмотрите на хуки Windows и Windows API. Это не легко кодировать; если вы хотите перехватить API, тогда я предлагаю эту библиотеку - вы можете сделать это с помощью классических оконных перехватчиков. Вам нужно написать собственный msgina.dll, чтобы жестко перехватить эту функцию. Если вам абсолютно не нужно обрезать какой-либо ответ на эту команду (а вы, вероятно, этого не делаете), то вы, скорее всего, можете избежать неприятностей с помощью более простых методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...