常见软件保护技术
1. 序列号保护机制
俗称注册码。验证用户名和序列号之间的书写映射关系。有以下几种分类:
- 以用户名作为自变量,用过函数F变换后得到注册码。序列号= F(用户名)
- 通过注册码验证用户的正确性。 用户名 = F-1(序列号)
- 通过对等函数检查注册码。F1(用户名) = F2(序列号)
- 同时采用用户名和序列号作为自变量。特定值=F3(用户名, 序列号)
下面是一个通过对等函数检查注册码的列子:
我们反汇编下代码:
这里是得到用户名和密码。
然后:
这样就可以着重分析
CALL serial.0040137E ; 用户名转换
和
CALL serial.004013D8 ; 转换后的用户名和密码作为参数进行比较
这两个函数了。
继续往下分析,看看 0040137E内部做了什么:
这里可以写出转换用户名的代码:
string translateUserName(string name)
{
name = name.to_upper;
int tmp(0);
for (int i =0; i < name .lenght(); ++i)
tmp += name.at(i);
return tmp^0x5678
}
分析完毕用户名的转换之后, 我们再来分析下:
CALL serial.004013D8 ; 转换后的用户名和密码作为参数进行比较
反汇编的一下代码为:
string translatePassword(string password)
{
int tmp(0);
for (int i = 0; i < password.lenght(); ++i)
{
char al(0x0A);
char ch = password[i];
if (0 == ch)
break;
ch –= 0x30;
tmp*= al;
tmp += ch;
}
}