常见软件保护技术

1.  序列号保护机制

    俗称注册码。验证用户名和序列号之间的书写映射关系。有以下几种分类:

  1.     以用户名作为自变量,用过函数F变换后得到注册码。序列号= F(用户名)
  2.     通过注册码验证用户的正确性。 用户名 = F-1(序列号)
  3.     通过对等函数检查注册码。F1(用户名) = F2(序列号)
  4.     同时采用用户名和序列号作为自变量。特定值=F3(用户名, 序列号)

下面是一个通过对等函数检查注册码的列子:

我们反汇编下代码:

image

这里是得到用户名和密码。

然后:

image

这样就可以着重分析

CALL serial.0040137E                     ;  用户名转换

CALL serial.004013D8                     ;  转换后的用户名和密码作为参数进行比较

这两个函数了。

继续往下分析,看看 0040137E内部做了什么:

image

image

这里可以写出转换用户名的代码:

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                     ;  转换后的用户名和密码作为参数进行比较

image

反汇编的一下代码为:

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;        

         }

}

原文地址:https://www.cnblogs.com/sld666666/p/2035697.html