有没有办法识别 Windows 命令提示符,而不管文件名或位置如何?

Is there a way to identify the Windows command prompt regardless of file name or location?

提问人:adveres 提问时间:10/28/2011 最后编辑:adveres 更新时间:3/9/2014 访问量:384

问:

我正在编写一个程序,以便在用户运行命令提示符时立即跟踪和终止(如果可能的话,还可以进行 regedit)。这是为了阻止用户运行我宁愿他们没有的命令。

我已经编写了代码,可以查看进程何时启动并使用 QueryFullProcessImageName 检查其名称。问题是,如果有人要重命名命令提示符,那么我无法再通过进程名称检测到它。我检测命令提示符的方式目前是“\cmd.exe”,但显然这不是很安全。

下面发布的是我所拥有的代码。为了简洁起见,我删除了所有错误检查。如果您需要更清晰的信息,请告诉我。谢谢!

TCHAR exeName[MAX_PATH];
DWORD exeNameSize = MAX_PATH;

//the pid comes into the function as a parameter
HANDLE handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid);

if (handle) 
{
    if (QueryFullProcessImageName(handle, 0, exeName, &exeNameSize))
    {
        tstring name = exeName;

        /*
          badProcs would contain the path identifiers such as
          "\\cmd.exe" or "\\regedit.exe".  This detection is
          what I want to make better.
        */

        for(int i=0; i < badProcs.size(); i++)
        {
            if(tstring::npos != name.find(badProcs.at(i)))
            {
                if(TerminateProcess(handle,0))
                    OutputDebugString(_T("Process should be dead\n\n"));
            }
        }
    }
    CloseHandle(handle);
}

一些附加信息:我写这篇文章的原因是为了控制其他桌面上发生的事情。我想让用户在启动不同的桌面(通过任何专有程序)时,我可以控制他们是否有权访问对系统造成最大安全漏洞的项目。鉴于我只想控制其他桌面上的操作,我不想更改设置,因为担心损坏目标桌面外部的数据。腐败难道不值得担心吗?

我只对控制专有桌面感兴趣,而不是对用户在自己的空间中所做的事情感兴趣。从本质上讲,单独的桌面是用于公司工作的,我希望能够限制人们可以对公司信息等执行的操作。

C++ Windows 进程 命令提示符

评论

4赞 Chriszuma 10/28/2011
为什么不能删除用户运行这些可执行文件的权限?
0赞 tenfour 10/28/2011
运行应用的方法比命令提示符多。请不要试图拦截 NtCreateProcess ...
0赞 adveres 10/28/2011
即使我这样做了,如果他们通过 USB 或其他东西复制到另一个 cmd.exe 中怎么办。该文件不会更改任何权限。
1赞 David Heffernan 10/28/2011
哦,哇,我在哪里可以得到这个奇妙的程序的副本?
1赞 Harry Johnston 10/28/2011
您无需编写自己的代码。搜索“软件限制策略”或 (在 Windows 7 上) AppLocker,以获取有关使用内置解决方案的信息。要记住的重要一点是,您需要将可执行文件列入白名单,而不是将可执行文件列入黑名单:创建策略,描述允许用户运行哪些可执行文件,而不是描述哪些可执行文件。

答:

10赞 Seva Alekseyev 10/28/2011 #1

不要。Windows 有内部方法。阅读策略编辑器和/或文件访问控制。

如果您是管理员,而“用户”不是,则策略(或简单的 ACL)将完成这项工作;如果“用户”也是管理员,他们将能够相当容易地击败您的程序。

评论

0赞 adveres 10/28/2011
根据此堆栈回复,如果用户具有非 NTFS 分区,我无法确定 ACL 是否有效。此外,我只对控制不同桌面中发生的事情感兴趣,不想使用用户的常规权限或文件。这有意义吗?
1赞 Robin 10/28/2011
@adveres:你不能确定有人只是使用TaskManager终止你的应用程序 - 当然,除非你使用ACL来阻止他们使用TaskManager。我同意 Seva 和 John 的观点:只是不要走那条路,这是邪恶的(而且不会在此基础上起作用)。
1赞 Seva Alekseyev 10/28/2011
那么用户是不是管理员?如果不是,他们将从哪里获取非 NTFS 分区?
0赞 Harry Johnston 10/28/2011
更具体地说,内置解决方案是软件限制策略或 (在 Windows 7 中) AppLocker。
1赞 Justine Krejcha 3/9/2014 #2

阻止命令提示符和注册表编辑器的最佳方法是通过 Windows 注册表。即使将可执行文件复制到其他位置,这些操作也有效。

如果设置了注册表项,则无法运行注册表编辑器和命令提示符:

HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\DisableRegistryTools

或整机

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\System\DisableRegistryTools

将其设置为 1 将禁用 regedit,设置为 0 将启用它。

HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\DisableCMD

(本地机器变体在这里也有效)。

将此设置为 1 将禁用命令提示符批处理文件,将其设置为 2 将仅禁用命令行,设置为 0 将启用它。