簡體   English   中英

我想在我的ANSI-C代碼中禁用Windows XP中的CTRL + ALT + DEL?

[英]I want to disable CTRL+ALT+DEL in Windows XP in my ANSI-C code?

我想在我的ANSI-C代碼中禁用Windows XP中的CTRL + ALT + DEL。 有可能嗎?

首先,捕獲Ctrl-Alt-Del(安全注意序列)並禁用它是兩回事。 盡管對許多人存在誤解,但仍有可能禁用SAS。

以下是3種方法:

  1. 設置HKCU / Software / Microsoft / Windows / CurrentVersion / Policies / System / DisableTaskMgr = 1

  2. 用您自己的msgina.dll替換或寫一個鍵盤驅動程序。

  3. 轉到“開始”菜單,選擇“運行”,然后鍵入“gpedit.msc”以運行組策略編輯器。 查看用戶配置| 管理模板| 系統,你會找到一個名為Ctrl + Alt + Del選項的部分 - “刪除任務管理器”

為了捕獲SAS,您可以編寫GINA存根,創建鍵盤驅動程序或替換TaskMgr.exe

這些要求主要針對嵌入式系統,您可以控制WinXP圖像的制作方式。

參考: MSDN Mag 2002年9月

是的。

但是,CTRL + ALT + DEL(稱為安全注意序列(SAS))無法通過通用的全局Windows Hook機制攔截。

無論情況如何,你必須攔截我所知道的SAS的選項只有一個:一個驅動程序。

但它不需要是一個完整的設備驅動程序,它可以是一個更簡單的過濾器驅動程序。 您將需要學習如何進行內核開發,這不是那么簡單,並且需要您做,例如,使用兩台機器進行內核調試。 如果您希望在具有較新Windows的其他計算機上使用您的驅動程序,則需要簽署驅動程序,因為Windows Vista x64和更新版本不會加載未簽名的驅動程序,只允許這些操作系統的x86版本執行此操作。 而你將有可能獲得一些有趣的BSOD。

鍵盤過濾器驅動程序的官方微軟樣本是kbfiltr樣本。

現在,有一種更簡單的方法來規避所有這些:使用一些與驅動程序通信的庫來完成所有這些骯臟的工作。 這就是我試圖做的事情。

我開發了一個庫,我稱之為攔截 ,它允許一個人在使用設備驅動程序的功能時攔截來自普通用戶模式程序的設備輸入。 它是一個小而簡單的C api,它與我已經正確簽名的驅動程序進行內部通信。

您必須使用安裝程序使用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;
}

將鈎子放入鍵盤系統是不可能的,盡管有些人在說。

鍵盤系統通過發出特定的硬件中斷來工作。 操作系統捕獲此中斷並適當地響應它。 這將是受鍵盤鈎子影響的事情。

序列CTRL-ALT-DEL從其他鍵發出單獨的硬件中斷。 這是最初完成的,因此即使其他鍵盤命令被凍結,也可以使用reboot命令。 (盡管MS-DOS中的終止駐留應用程序仍然可以捕獲並處理中斷。)

現在用於登錄的密鑰序列的原因是因為這種行為。 由於它發出單獨的硬件中斷,序列用於驗證某些其他應用程序沒有掛鈎。這是為了防止欺騙登錄提示。

我並不是說不可能捕獲此中斷並修改其行為。 我不知道事實並非如此。 但它並不像將鈎子放入鍵盤處理代碼那么簡單。

Winlogon只是在默認桌面上調用SetWindowsHookEx來捕獲CAD。 由於只有一個調用SetWindowsHookEx的線程可以注銷該鈎子,因此確保沒有其他進程可以竊取它。 此外,鍵盤掛鈎僅適用於進程桌面。 您可以嘗試切換到新桌面並點擊CAD。 您可以在此處找到一些內部信息。

為什么所有答案都說不可能? 這是非常有可能的,例如,如果病毒已禁用它,如何啟用它:

 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 hooks和windows API掛鈎。 這些都不容易編碼; 如果你想要API掛鈎,那么我建議這個庫 - 你可能能夠用經典的Windows鈎子做到這一點。 您需要編寫自己的msgina.dll來嚴格掛鈎此功能。 如果你不一定要切斷對這個命令的任何響應(你可能沒有),那么你很可能會使用更簡單的方法。

這是對OP想要做的回應,而不是問題本身......

實現目標的最簡單方法是編寫一個鍵盤過濾器驅動程序,它會丟棄所有輸入。 (這實際上是禁用我能想到的所有輸入的唯一正確方法,也是LogMeIn等產品使用的方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM