返回首页

{A}
{S0}
简介
当开发和营销移动社区的软件,使用最常见的注册模式的RPN(逆波兰式)或动态注册。只是如何实施这有时混乱,所以我想简单。简而言之,反向波兰表示法使用您提供给经销商一个字符串,形式公式。当客户购买你的应用程序,它们提供设备的C /酒后驾车的应用程序将要安装的分销商。在C /酒后驾车是一个唯一的设备标识符,和平台之间的不同。掌上电脑:业主的第一个和最后一个名称或一些变化。Symbian操作系统:350443-61-001241-9:在下面的格式,包括连字符的IMEI。Palm OS的Palm用户名。
在这篇文章中,我们将只讨论这个注册模式的Pocket PC应用程序。关于模型
您提供给经销商的RPN字符串,看起来像这样:

"i 0 == m_nVariant * key + c 5 * +"

m_nVariant是一个数字,您使用,使结果不同于别人的,谁是使用相同的公式。在示例中,我们将使用111作为一个变种:{C}
允许在RPN字符串只有三个变量:关键,我和C。没有变量的RPN字符串的长度。
动态注册代码生成是使用32位有符号整数,而最终的结果是转换为16位无符号整数。掩盖了所有问题,但最低的16位转换为32位有符号整数的结果是一个16位无符号整数。例如,如果最后的结果是-3(0xFFFFFFFD),然后最后还是最低阶的16位将0xFFFD六角这是无符号十进制65533。被认为是一个无符号8位整型变量c。最小的注册代码为0,最大可能的注册码是2 ^ 16 - 1 = 65535。如果一个注册代码少于五位数,0前面加上使其五位数。因此,763变成00763。因为只有整数动态注册代码生成,763 / 10 = 76,而不是76.3。因此,小数不会出现在一个动态的注册代码。
此外,处理的RPN字符串的程序将处理的字符数限制。如果一个手持设备ID超过10个字符,只有第一个五年和最后五个字符被用来生成解锁代码。
唐Laverdure是13个字母(包括空格),所以第一个和最后5:quot;唐Lrdurequot。
非累积的行动进行评估由左到右,所以7 3 - 4 =(-4)。
目前,16位字符,如日本,中国,希腊,希伯来文字符是不支持在这个过程中变量c是一个8位无符号整数处理。
我们相互转换的C /三星堆字符的ASCII值。例如,"Pquot;
W = 87 decimal

i = 105 decimal

l = 108 decimal

l = 108 decimal

[space] = 32 decimal

P = 80 decimal

我们应用的RPN字符串在C /酒后驾车的每个字符的ASCII值。在公式中,'我'是在0℃/三星堆开始的字符的位置,和"C"是在C /三星堆字符的ASCII值。
"Pquot;
87 + 105 + 108 + 108 + 32 + 80 = 520; 520 * 2 = 1040;

1040 + 111 = 1151

quot RPN字符串;我0 == 111 *键C 3 *"将增加在C /三星堆的所有字符的ASCII值。乘以3,加111。
所以,为quot; Pquot;
520*3=1560; 1560 + 111 = 1671

的RPN字符串的quot;我0 == 987 *键C quot;将增加在C /三星堆的所有字符的ASCII值,加987。
所以为quot; Pquot;
520 + 987 = 1507

的RPN字符串可以比这个要复杂得多。几乎所有的运营商被允许:逻辑运算符,如放大器;放大器;!,| |,,==,GT;<(左移),GT,GT(右移),〜(反转),AMP,如LT位运算符(AND),|(或)如算术运算符 - ,*,/,%(模)使用代码
首先,我们需要获得从Pocket PC的C /酒后驾车。雇主名称存储在注册表项HKEY_CURRENT_USER \ ControlPanel控制\所有者:
//Many Registry classes can be found elsewhere on 

//the code project



CString OwnerName; // This will hold the C/DUI



DWORD dwR2;

unsigned char Owner[255];

if (!reg.Open(HKEY_CURRENT_USER, 

        _T("ControlPanel\\Owner"),false))

   {

      AfxMessageBox(_T("Can't find Owner, ") 

           _T("error detected, Attempting to correct."));

      // Error handling for no

      // registry key present goes here

   }



if(reg.GetLength(_T("Owner"),dwR2))

   {

      reg.Read(_T("Owner"),Owner,dwR2);

      OwnerName.Format(_T("%s"),&Owner);

   }



//

一旦我们的C /酒后驾车,通常在您的项目初始化,我们将检查对RPN看到如果已注册的应用程序。
当用户输入从经销商获得的RPN,把它写入注册表或INI文件,以便它可以检索每个应用程序启动的时间。
CString m_strMyKey;

m_strMyKey=pApp->GetProfileString(_T("Initialize"), 

                                     _T("Key"));



CString RPNString;

// Run the owner's name through the RPN

// evaluation and assign the 5 digit result.

RPNString.Format(_T("%-.5d"), 

                (int)EvaluateRPN(OwnerName,111));

if(RPNString.Find(m_strMyKey)==0)

// Compare the C/DUI RPN to the RPN in the registry

{

   Registered=TRUE;

}

else

{

   AfxMessageBox(_T("Unregistered"));

   Registered=FALSE;

}

做过这样的评价:
double CMyApplication::EvaluateRPN(CString strRPN, double m_nVariant) 

{

    // RPN = "i 0 == m_nVariant * key + c 5 * +" 

    CString m_strRPN;

    double m_nStringValue=0;

    int StringPos=0;



    if(strRPN.GetLength()>10)

    {

        m_strRPN=strRPN.Left(5) + strRPN.Right(5);

    }

    else m_strRPN=strRPN;



    do

    {

        m_nStringValue += (double)m_strRPN.GetAt(StringPos);

        StringPos++;

    }while(StringPos <= m_strRPN.GetLength());





    m_nStringValue=m_nStringValue*5; // c5*



    m_nStringValue+=m_nVariant;



    return m_nStringValue;

}

// This code evaluates the string using

// the sample formula, more complex formulas

// will require more complex evaluation code.
兴趣点
动态注册保护你,作者,因为动态注册代码,用户必须输入解锁您的应用程序取决于他们的手持设备上的C /酒后驾车是什么。由于不同的用户选择不同的C / DUIs一些手持设备,一个动态的注册代码,解除您的应用程序上的一个手持设备可能将无法在其他手持设备。相同的动态注册码将在两个不同的手持设备的唯一方法是,如果这两个手持设备相同的C /酒后驾车。正如你可以看到,这有助于防止盗版,因为只有这样,一个海盗可以复制您的软件,从他的朋友会,以确保他的手持设备上的C /酒后驾车是相同的C /酒后驾车,他的朋友。海盗改变他的C /酒后驾车,他希望每次运行不同的应用程序变得更加繁琐和不切实际。
打击黑客是一个对某些人来说的专职工作,并像他们说,"锁只保留"老实人"outquot;,所以这很容易实现代码将quot;保持诚实的人买你的applicationsquot;无你不必花费更多的时间比写,确保您的应用程序。历史2月28日,2006年 - 文章首次发表。

回答

评论会员: 时间:2
j