Отключение любой возможности выхода из программного обеспечения?

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

Сначала я думал о способе отключения ctrl-alt-del, alt+F4< /kbd>, alt+tab и другие комбинации клавиш, но, очевидно, следовать этому подходу не так просто, особенно в версиях после Windows XP.

Что вы думаете о жизнеспособном подходе к решению моей проблемы?


person Louis    schedule 18.10.2011    source источник
comment
Возможно, было бы неплохо написать небольшой TSR, который проверяет каждую нажатую клавишу. Вы просто разрываете цепочку прерываний, если обнаружите комбинации, подобные тем, которые вы упомянули. Хотя это довольно низкоуровневая вещь.   -  person BlackBear    schedule 18.10.2011
comment
То, что вы описываете, невозможно в рамках приложения пользовательского режима. Если вы хотите написать драйвер ядра, который сделал бы это возможным, поздравляю, вы фактически только что создали руткит...   -  person Benj    schedule 18.10.2011
comment
@BlackBear DOS TSR??? Ух ты!!! Возможно, у меня все еще есть моя копия Sidekick!   -  person xanatos    schedule 18.10.2011
comment
@Benj Это не будет руткитом. Определение Wiki: A rootkit is software that enables continued privileged access to a computer while actively hiding its presence from administrators by subverting standard operating system functionality or other applications.. Я бы сказал a better keyboard driver :-)   -  person xanatos    schedule 18.10.2011
comment
Правда, не совсем руткит, но уж точно с некоторыми характеристиками...   -  person Benj    schedule 18.10.2011
comment
@Louis То, о чем вы говорите, обычно называется режимом киоска. возможно, есть руководства/программы для этого.   -  person xanatos    schedule 18.10.2011
comment
Невозможно сделать, как описано. Что бы вы ни пытались, я всегда могу выдернуть шнур питания.   -  person Widor    schedule 18.10.2011
comment
И вы можете начать с stackoverflow. ком/вопросы/4617303/   -  person xanatos    schedule 18.10.2011
comment
@xanatos, даже режим киоска MS IE не поддерживает отключение Ctrl-alt-del support.microsoft.com /кб/154780   -  person Benj    schedule 18.10.2011
comment
@Benj Эта страница относится к Windows 95 !! Хочешь мою копию Sidekick? И это был очень простой режим киоска. Специальные клавиши не отключались (даже ALT-TAB)   -  person xanatos    schedule 18.10.2011
comment
@xantos Похоже, что (после win95 ;-)) настоящий режим киоска требует использования драйвера ядра ... хотя похоже, что такие драйверы уже существуют ...   -  person Benj    schedule 18.10.2011
comment
Спасибо всем за ваш вклад. @Widor дергает за шнур питания — это нормально, так как компьютер перезагрузится и будет защищен паролем.   -  person Louis    schedule 18.10.2011
comment
@xanatos: ваша помощь очень ценится. Я последую вашей идее и почитаю про Киоск. Большое спасибо.   -  person Louis    schedule 18.10.2011
comment
Вы всегда можете приклеить несколько клавиш на клавиатуру. Возможно, для этого достаточно обеих клавиш Alt.   -  person rodrigo    schedule 18.10.2011


Ответы (3)


Вы, конечно, должны предпринять все обычные шаги, чтобы ваше приложение отказывалось закрываться само по себе (возможно, если не указан пароль), поэтому мы говорим только о части «Я не хочу позволять никому принудительно закрывать его» .

Одним из решений было бы сделать ваше приложение оболочкой Windows.

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

И окончательное решение, которое является грязным, официально не поддерживаемым взломом, о котором вы не слышали от меня, заключается в следующем:

public static class Utility
{
    [DllImport("ntdll.dll", SetLastError = true)]
    private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3);

    public static void BsodIfProcessEnds()
    {
        Process.EnterDebugMode();
        RtlSetProcessIsCritical(1, 0, 0);
    }

    public static void NoFireworksIfProcessEnds()
    {
        RtlSetProcessIsCritical(0, 0, 0);
    }
}

Предупреждение: BsodIfProcessEnds делает именно то, что написано на банке.

person Jon    schedule 18.10.2011
comment
Хе-хе, мне нравится идея, что студенту, сдающему экзамен, немедленно выдается BSOD, если он попытается закрыть тест, милая... ;-) - person Benj; 18.10.2011
comment
Большое спасибо, Джон. Второй вариант на самом деле невозможен, так как мне нужно убедить университет изменить настройки своих компьютеров. Я проверю идею оболочки Windows и ваш код. Но сначала я попытаюсь понять код :) Большое спасибо. - person Louis; 18.10.2011
comment
@Louis: RtlSetProcessIsCritical - это недокументированный вызов функции, который Windows использует для пометки некоторых собственных процессов как критических (и BSOD, если один из них умирает, чего никогда не должно быть). - person Jon; 18.10.2011
comment
+1 за самое дьявольское решение проблемы, которое я когда-либо видел. - person Carey Gregory; 19.10.2011

Дайте пользователям только ограниченную учетную запись пользователя на машине и не давайте им разрешения на уничтожение вашего приложения.

Сделайте то же самое для других ваших ограничений, и вам даже не нужно писать приложение.

Если вы хотите, чтобы пользователи работали как администраторы, то, о чем вы просите, невозможно.

person tenfour    schedule 18.10.2011
comment
Спасибо за ваше предложение, но это не совсем возможно для меня, так как компьютеры университетские. Убедить отдел изменить настройки своих компьютеров не так-то просто :) - person Louis; 18.10.2011

Вы можете создать два приложения. Один из них постоянно проверяет, запущено ли ваше приложение. Если оно не запущено, запустите его, это может быть служба (сложнее обнаружить для простых пользователей).

Вы также можете повеселиться с разрешением NTFS. Например, создайте верхний каталог, в котором у пользователя вообще нет разрешений (даже не для просмотра его содержимого), а затем создайте под ним папку, в которой у пользователя есть права на чтение. Если пользователь не знает хорошего гуса, найти ваше приложение становится немного сложнее.

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

person user613326    schedule 21.09.2013