65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Detours 规避 Windows 组策略

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.53/5 (16投票s)

2004年3月29日

GPL3

4分钟阅读

viewsIcon

158345

downloadIcon

3686

本文将重点介绍如何使用 Detours 绕过组策略设置。当然,也会给出一些示例进行演示。示例将包括运行“命令解释器” - CMD.EXE,以及“注册表编辑器” - RegEdit.EXE ,即使它们被 ad

引言

这是我将在 CodeProject 上发布的一系列关于 Detours 的入门文章。

在整个系列中,我们将专注于如何利用 Detours 的强大功能来为我们所用,而不会深入探讨其技术的细节。

建议有洞察力的读者阅读 Galen Hunt 准备的优秀演示文稿,以及 Detours 包本身提供的文档。

在本文中,我们将了解 Detours 是什么以及它可以做什么。然后,我们将通过一组样本来概述这些内容。

背景

通常,一个遗留应用程序需要扩展,但源代码不易获得。或者,您可能发现使用 CToolBar::CreateEx()TBSTYLE_FLAT 标志而不是简单的 Create() 来使您的工具栏看起来更时髦会更好。

这些时候,费力地研究源代码会让人望而却步——毕竟,为什么为了让您的应用程序看起来更漂亮而费尽心思呢?

在这些情况下,基于 Detours 的解决方案非常方便。事实上,使用它之后,您会想知道从 '99 年开始您没有它是如何过的。

简而言之,Detours 真正做的是将对某个函数(或多个函数)的调用重定向到另一个(用户提供的)函数,但显然,它们的签名 *应该* 匹配。

Detours 概览

这是一个用于在 x86 机器上*拦截任意 Win32 二进制函数的*库。

使用 Detours

Detours 是一个 Microsoft Research 项目,至今仍是预发布版本。因此,您需要从 Microsoft Research 网站自行获取 Detours 包(约 627KB)。通常,我们只需要 detours.libdetours.h 文件来编译我提供的示例 这里

请注意,为了将 Detours 的部分(包括 detours.lib, detours.h)与本文结合使用,您**必须**首先阅读并同意 Detours 附带的最终用户许可协议 (EULA)。

使用 Detours 的项目的基本框架代码

初学者可能会觉得 Detours 有点令人生畏,因此,除了 Galen Hunt 在其出版物中的建议之外,我本人也提出另一条建议。

下面的框架是用于*静态 trampoline*的,当目标函数作为链接符号可用时,它们非常容易使用。在本文的范围内,我们将满足于通常可用于链接的 Win32 API。

但是,支持动态 trampoline 所需的修改非常少。那么,开始吧...

#include <windows.h>
#include "detours.h"

#pragma warning(disable:4100)   
 /* Trampolines don't use formal parameters.*/
#pragma comment(lib,"detours.lib")

/*
Define as many trampolines as required
DETOUR_TRAMPOLINE(ReturnType WINAPI Real_FunctionName(
 Formal Parameters Here..),Win32APIToBeDetoured);
Example:
*/

DETOUR_TRAMPOLINE(HANDLE WINAPI Real_CreateFile(LPCTSTR lpFileName,
  DWORD dwDesiredAccess,DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile),CreateFile);

/* Now define your own customized function to replace
   /modify/extend the original Win32API.
   However, note that the call signature of the detour and trampoline 
   functions MUST exactly match the that of the target function.
   Otherwise, obviously the registers AND the stack will just throw up ;)

ReturnType WINAPI DetourFunctionName(Formal Parameters Here..)
{
    //Custom body ...
}

Example:
*/

BOOL WINAPI DetourWriteFile(HANDLE hFile,LPCVOID lpBuffer,
  DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped)
{
    BOOL bRet=Real_WriteFile(hFile,lpBuffer,
      nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);

    if(*(const char*)lpBuffer)
    {
        DWORD dwBytesWrote;
        Real_WriteFile(hOutFile,(LPCTSTR)lpBuffer,lstrlen(
            (const char*)lpBuffer),&dwBytesWrote,NULL);
    }
    return bRet;
}

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
        /*
    Define the static trampolines for attaching
        DetourFunctionWithTrampoline((PBYTE)Real_FunctionName, 
         (PBYTE)DetourFunctionName);
        Example:
    */

        DetourFunctionWithTrampoline((PBYTE)Real_CreateFile, 
           (PBYTE)DetourCreateFile);
    }
    else if (ul_reason_for_call == DLL_PROCESS_DETACH) 
    {
        /*
    Remove the attached trampolines which were previously attached
        DetourRemove((PBYTE)Real_FunctionName, (PBYTE)DetourFunctionName);
        
    Example:
    */

        DetourRemove((PBYTE)Real_CreateFile, (PBYTE)DetourCreateFile);
    }
    return TRUE;
}

运用所学知识:让 Windows 程序不再听话

我曾多次收到人们的求助,他们因为*尝试*组策略而将自己锁在外面。

有时我能看出只是个孩子在试图绕过父母设定的限制,有时则是一个真诚的请求。

组策略主要通过无处不在的注册表进行维护。每个设置都有一个相应的注册表设置,该设置在执行期间由相关组件进行评估。

为演示目的,我们将考虑以下内容:

  • DisableCMD - HKCU\Software\Policies\Microsoft\Windows\System

    此设置决定当前用户是否可以运行命令提示符 - Cmd.exe,以及在该用户登录时是否可以执行批处理文件。

  • DisableTaskMgr - HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System

    值为 '1' 将阻止用户启动任务管理器 - Taskmgr.exe。

  • DisableRegistryTools - HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System

    值为 '1' 将禁用 Windows 注册表编辑器 Regedt32.exe 和 Regedit.exe。

我们的示例将允许我们绕过这些策略,即使它们已生效。

请您使用组策略编辑器来实施这些策略,并验证示例确实能够绕过安全设置。

我们做了什么?

简单来说,我们“重定向”了上述工具用来查询组策略是否允许它们运行的 RegQueryValueEx(准确地说是 RegQueryValueExW)函数,让它转而调用我们修改过的 'DetourRegQueryValueEx' 函数,该函数会检查是否正在检查上述注册表项。如果是,我们就让函数返回一个它本来会返回的值,就好像没有存在限制一样!这样就“愚弄”了相关的程序,让它们相信限制实际上并不存在(即使它们确实存在)。

好了,关于组策略就到这里...

历史

  • 20040414 - 格式更改
  • 20040329 - 初稿

发送您的反馈

请发送反馈,告知本文是否对您有所帮助。这将帮助我衡量此类材料的接受程度,并影响我将来提交有关 Detours 的文章。

我已在我网站 http://www.geocities.com/kbshankar2000/ArticleSchedule.html 上保留了一份我希望撰写的文章的简要计划。您可以审阅并建议您选择的优先顺序。

© . All rights reserved.