用PBNI实现软件注册授权控制(一)
自从PB的程序可以被pbkiller和shudepb反编译以来,程序的安全性,软件的注册授权控制就存在很大的风险,这些核心代码被轻易的暴露出来,从而导致程序很容易被破解,损害软件开发者的利益。因此有人把这部分核心代码,采用VC或Dephi进行重写,并编译为dll的方式给pb的程序调用,以免注册部分的代码被反编译,以防止软件被破解,而不是采用PBNI的方式,其实这样做也是不安全的。下面将通过实例,演示采用dll来进行软件注册控制的不安全性。
首先,使用vc6开发一个TestA的动态连接库工程,这个库文件包含两个函数,CheckKey和Add, CheckKey用于判断输入的字符串,是否等于12345678,相等则返回TRUE,否则返回False, Add函数用于返回两个数相加的结果。代码很简单,如下:
{
if(strcmp(key,"12345678")==0)
return TRUE;
else
return FALSE;
}
int WINAPI Add(int a, int b)
{
return a+b;
}
编译生成TestA.dll文件。然后用PB9新建一个应用程序,并把TestA.dll文件拷贝到这个程序目录下面。
增加一个w_main窗口,在窗口的Local External Function中定义以下两个API函数
Function int Add(int a ,int b ) Library "TestA.dll"
在窗口中增加两个按扭,分别为CheckKey和Add,其中CheckKey按扭的代码如下:
Add按钮的代码如下:
运行程序,点击CheckKey按钮,弹出下面两个窗口
下面,我们用pbkiller反编译这个应用生成后的pbd文件,查看w_main窗口的代码,我们可以清楚的看到TestA.dll这个库文件的函数定义,包括函数名称和参数列表。在取得这些信息之后,我们就可以写一个dll文件,来绕开CheckKey这个函数,让其总是返回TRUE,这样就使得注册验证失效了。
还是使用VC6 新建一个TestB的动态连接库的工程,在工程里面增加以下两个函数,其中CheckKey不做任何校验处理,直接返回TRUE,Add函数则调用原来TestA(改名为MyTestA.dll)库文件的函数。
编译这个dll,然后把原来pb程序目录下的testA.dll文件改名为MyTestA.dll,然后把TestB.dll文件拷到pb程序目录下,并更名为TestA.dll。
运行程序,点击CheckKey按钮后,弹出以下窗口
从上面的程序执行情况看,CheckKey功能已经失效,Add功能与原来的效果一样。
但如果DLL文件中不公开CheckKey函数,而是在调用Add函数的时候,调用CheckKey,则就没办法绕开了.