Windows Mobile应用程序是否需要代码签名?

时间:2011-06-10 09:42:11

标签: windows-mobile distribution code-signing

我想创建一个Windows移动应用程序并从我的网站分发它,但我不想购买代码签名证书。 我有HTC Diamond2智能手机(WM6.1),它允许我运行我的未签名的应用程序。虽然我的应用程序连接到网络并拨打电话,但它没有给我任何警告。此外,几年前我有一个Windows Mobile 4.0设备,它也不需要签名。所以我一直认为Windows Mobile不需要代码签名。但最近我读到它可能是必需的???

所以问题是:如果我从全球网站分发我的应用程序,有多少用户将无法使用它,因为它没有签名?我是说什么百分比?也许在不同国家有所不同?也许在大多数手机销售锁定的国家/地区都需要签名,而在通常销售手机解锁的国家/地区,则不需要签名?

请在这件事上赐教。

2 个答案:

答案 0 :(得分:0)

设备制造商在构建操作系统时可以指定不同级别的安全性。在最高级别,您需要签署您的应用程序。在最低级别,您可以将可执行文件复制到设备并运行它。有中间级别允许通过CAB文件安装的应用程序即使没有签名也能运行。通常,如果设备是从手机运营商处购买的,您可能需要签署应用程序(或破解设备)。如果从制造商处购买设备并且您添加了自己的SIM卡,则很有可能不需要签名。根据我的经验,更多的WM6设备具有比WM5设备更高的安全设置。

答案 1 :(得分:0)

您可以修改某些注册表项以使其可以在设备上运行任何可执行文件。在默认的Windows Mobile 6.0设备上,您会看到“是否要允许 _ .EXE运行?”弹出。如果单击“是”,程序将进行注册表修改并重新启动设备,则可以运行任何应用程序。

// Checks to see if the policies in the registry need to be adjusted to allow
// an unsigned program to run.  This also affects WCELOAD.EXE as well.
// This is needed to run some programs on Windows Mobile 6 from an unsigned application.
void UpdatePolicy()
{
    BOOL bPolicyNeedsUpdate = FALSE;
    DWORD dwExistingPolicy = 0;
    DWORD dwNewPolicy = 0;
    HKEY hKey = NULL;
    DWORD dwSize = sizeof(DWORD);

    RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Security\\Policies\\Policies"), 0, NULL, 0,
        KEY_ALL_ACCESS, NULL, &hKey, NULL);
    // See if the policy has already been adjusted.
    if (hKey != NULL)
    {
        DWORD dwType = 0;
        RegQueryValueEx(hKey, _T("0000101a"), NULL, &dwType, (LPBYTE)&dwExistingPolicy, &dwSize);
        if (dwExistingPolicy != 1)
            bPolicyNeedsUpdate = TRUE;
    }
    if (bPolicyNeedsUpdate)
    {
        // Adjust the policy
        dwNewPolicy = 1;
        RegSetValueEx(hKey, _T("0000101a"), NULL, REG_DWORD, (const BYTE*)&dwNewPolicy, dwSize);
        RegSetValueEx(hKey, _T("00001001"), NULL, REG_DWORD, (const BYTE*)&dwNewPolicy, dwSize);
        dwNewPolicy = 40;
        RegSetValueEx(hKey, _T("00001005"), NULL, REG_DWORD, (const BYTE*)&dwNewPolicy, dwSize);
        dwNewPolicy = 144;
        RegSetValueEx(hKey, _T("00001017"), NULL, REG_DWORD, (const BYTE*)&dwNewPolicy, dwSize);
        // Reboot so the changes take effect
        Reboot();
    }
    RegCloseKey(hKey);
}

void Reboot()
{
    SetSystemPowerState(NULL, POWER_STATE_RESET, 0);
}