您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 嵌入式开发 > 正文
·速成电脑精英(包分配)白领高薪一族从这里开始



-Java套接字编程(下)
-MediaStudio Pro 6.5教程
-三款卸载软件最新试用
-基于Visual C++的Winsock API研究

创建安全 Windows CE 设备
2002-03-09· · ··Microsoft

1 2 3 4 5  下一页

简介

安全服务是现代操作系统的核心部分。网络基础结构、系统管理策略和最终用户的感受都取决于安全服务的管理功能、灵活性和实施。Microsoft? Windows? CE 3.0 通过提供安全服务的集成功能集,使企业在日益增长的网络世界中不断扩展,且无须牺牲安全性。安全服务包括以下功能:

  • 信任环境模型。

  • 安全性支持提供者接口 (SSPI)。

  • Windows NT? LAN Manager 支持。

  • 安全套接字层 (SSL) 支持。

  • 加密技术。

  • 支持 CryptoAPI 的智能卡基础结构。

  • 唯一的设备标识符。

  • 受保护的内核配置。

  • 拨号启动加载程序中的数字身份验证。
创建信任环境

Windows CE 设备发送、接收和处理需要保护(以避免潜在的不安全应用程序)的信息。那么,如何保护您的设备呢?您可以创建一个安全操作系统 (OS),防止加载未知模块、限制对系统 API 的访问、并禁止对系统注册表的某些部分执行写入操作。

要创建信任环境,必须实现下面两个函数:

  • OEMCertifyModuleInit

  • OEMCertifyModule

在内核加载应用程序之前,OEMCertifyModule 函数验证应用程序签名,以避免非法应用程序进入您的系统。这可以确保仅当应用程序包含有效的数字签名时,才能够被基于 Windows CE 的平台加载。OEMCertifyModule 函数返回以下三个选项之一:

  1. 完全信任,可以执行任何操作。

  2. 有限信任,调用某些函数时受限制。

  3. 不信任,因此不允许运行。

下表对这两个函数加以说明。

函数 说明 返回值
OEMCertifyModuleInit 启用 OS 加载程序来通知 OEM 有一个新的模块正在加载。允许 OEM 决定是否验证该模块以确保安全。 TRUE 或 FALSE
OEMCertifyModule 允许 OS 加载程序将模块代码(例如,DLL、EXE 和 OCX)传递给 OEM,以验证该模块是否可以在系统中安全地运行。 OEM_CERTIFY_TRUST
OEM_CERTIFY_RUN
OEM_CERTIFY_FALSE

下表说明 OEMCertifyModule 函数的返回值。

返回值 说明
OEM_CERTIFY_TRUST 信任应用程序,可以执行任何操作。
OEM_CERTIFY_RUN 信任应用程序,可以运行,但不能调用任何特权函数。
OEM_CERTIFY_FALSE 不信任,因此不允许运行。

OEMCertifyModule 函数可以对正在加载的模块进行任何类型的检查,例如,循环冗余检查或证书检查。当动态链接库 (DLL) 加载到某 EXE 程序的地址空间时,EXE 的信任级别将决定最终的访问级别。例如,如果 OEM_CERTIFY_RUN 信任级别的 EXE 试图加载具有较低信任级别 (OEM_CERTIFY_TRUST) 的 DLL 时,DLL 的最终信任级别是 OEM_CERTIFY_RUN。另一方面,如果 EXE 试图加载具有较高信任级别的 DLL 时,加载操作将失败。

下表显示 EXE 和 DLL 信任级别的不同组合方式。

EXE 信任 DLL 信任 最终 DLL 信任
OEM_CERTIFY_RUN OEM_CERTIFY_RUN OEM_CERTIFY_RUN
OEM_CERTIFY_RUN OEM_CERTIFY_TRUST OEM_CERTIFY_RUN
OEM_CERTIFY_TRUST OEM_CERTIFY_RUN 加载 DLL 失败
OEM_CERTIFY_TRUST OEM_CERTIFY_TRUST OEM_CERTIFY_TRUST

注意:   OEM 必须对所有第三方驱动程序进行数字签名,否则加载驱动程序时将失败。实现此安全模型时,所有驱动程序都必须受信任。

要实现信任模型,最简单的方法是使用 OEMCertifyModule 函数,为所有应用程序返回 OEM_CERTIFY_RUN。从而使映像的非 ROM MODULES 部分的应用程序可以运行,但是对特权函数的调用会受到限制。通过这种方法,您不必指定运行时哪个应用程序是否受信任。如果返回的是 OEM_CERTIFY_FALSE,那么 RAM 中的应用程序将不能运行。在任何情况下,位于映像的 ROM MODULES 部分中的操作系统文件总是以最高权限运行。

要创建数字签名,您可以使用 Signfile.exe,该程序包含在 Platform Builder 3.0 中。Signfile.exe 是用私人密钥为可执行文件签名的工具,使用 Secure Hash Algorithm (SHA) 计算加密散列。关于 Signfile.exe 代码的示例,请参见 Platform Builder 3.0 产品 CD 中的 Public\Common\Oak\Tool\Signfile。

要在加载时验证签名,您可以使用 Loadauth.lib 函数,该函数在 \Public\Common\Oak\Lib 中与处理器对应的 Platform Builder 目录中。关于使用 Loadauth.lib 函数的详细信息,请参见 Platform Builder 3.0 文档。

您也可以不使用 Platform Builder 工具,而编写自己的签名验证方案。

下面的代码是使用 Loadauth.lib 函数实现 OEMCertifyModuleInitOEMCertifyModule 函数的示例:

/* 签名公共密钥 BLOB */
const unsigned char g_bSignPublicKeyBlob[] = {
0x06,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x31,0x00,0x02,
0x00,0x00,0x01,0x00,0x01,0x00,0xb1,0x00,0x93,0x7c,0x18,0x63,0xce,0xf3,
0x23,0xe3,0x57,0x74,0x13,0x54,0x17,0x2c,0xdb,0xf6,0x56,0x77,0xb3,0x8d,
0x34,0x6c,0x41,0x3d,0x4e,0xbb,0xc1,0xaf,0x3d,0x17,0xb6,0x0e,0x70,0x72,
0x43,0x12,0x1d,0xb1,0x2a,0x57,0x05,0x27,0x58,0x63,0xef,0xb7,0x3b,0x71,
0xee,0xe4,0xcd,0x14,0xbe,0xf7,0x32,0xec,0xa2,0xae,0xbf,0x9a,0x6b,0x75
};
// RAM 可执行程序加载时签名检查
// 的声明
typedef BOOL (* OEMLoadInit_t)(LPWSTR lpszName);
typedef DWORD (* OEMLoadModule_t)(LPBYTE lpData, DWORD cbData);
extern OEMLoadInit_t pOEMLoadInit;
extern OEMLoadModule_t pOEMLoadModule;
extern BOOL InitPubKey(const BYTE *KeyBlob, DWORD cbKeyBlob);
// Loadauth 库例程
extern BOOL CertifyModuleInit(void);
extern BOOL CertifyModule(PBYTE pbBlock, DWORD cbBlock);
extern BOOL CertifyModuleFinal(PBYTE *ppbSignData,
                               PDWORD pcbSignData);
// 为每个 RAM 可执行模块调用一次
// 以初始化签名检查
static BOOL OEMCertifyInit(LPWSTR lpszName)
{
    return CertifyModuleInit();
}
// 在 OemLoadInit 之后调用一次或多次
static DWORD OEMCertifyModule(LPBYTE lpData, DWORD cbData)
{
    if (cbData)
    {
        // 处理模块字节
        return CertifyModule(lpData, cbData);
    }
    else
    {
        // 最终调用
        DWORD dwTrustLevel = OEM_CERTIFY_FALSE;
        LPBYTE pSignedData;
        DWORD cbSignedData;
        BOOL fRet = CertifyModuleFinal(&pSignedData,
                                       &cbSignedData);
        if (fRet)
        {
            // 该文件有有效签名
            // 我们希望以签名数
            // 据返回信任级别
            if (cbSignedData < sizeof(CHAR))
                dwTrustLevel = OEM_CERTIFY_RUN;
            else
            switch (*pSignedData)
            {
                case 'T' :
                    dwTrustLevel = OEM_CERTIFY_TRUST;
                    break;
                case 'R' :
                    dwTrustLevel = OEM_CERTIFY_RUN;
                    break;
                default:
                    dwTrustLevel = OEM_CERTIFY_FALSE;
                    break;
            }
        }
        #ifdef DEBUG
        if (!fRet)
        lpWriteDebugStringFunc(TEXT("OEMCertifyModule:signature
                                          check failed.\r\n"));
        #endif
        // 返回一个 OEM_CERTIFY 级别
        return dwTrustLevel;
    }
}
void OEMInit()
{
    ...
    ...
    //
    // 设置模型签名验证挂钩。
    //
    pOEMLoadInit = OEMCertifyInit;
    pOEMLoadModule = OEMCertifyModule;
    //
    // 初始化签名验证公共密钥。
    //
    InitPubKey(g_bSignPublicKeyBlob,sizeof(g_bSignPublicKeyBlob));
    
    // 
    // 其他 OEM 初始化步骤
    //
    ...
}

注意:   OEMCertifyModuleInitOEMCertifyModule 函数的名称是任意的;您可以使用任何名称。但重要的是,应初始化 OEMInit 函数中的两个内核指针:pOEMLoadInit 和 pOEMLoadModule,让它们分别指向这两个命名函数。

1 2 3 4 5  下一页

■ 相关内容
 WindowsCE.net 4.1仿真环境入门
 Win2000 Server安全脚本发布
 用Visual Studio .NET 中的Mobile Web Form创建移动网络应用程序
 Microsoft Windows CE .NET的新特色
 微软正式发布Win CE .NET
 微软将在1月推出Windows CE.Net操作系统
 XML 和 Windows CE 3.0
 Microsoft Windows CE 通信模型
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!