{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年 - 文章首次发表。