用PBNI实现软件注册授权控制(一)

      自从PB的程序可以被pbkillershudepb反编译以来,程序的安全性,软件的注册授权控制就存在很大的风险,这些核心代码被轻易的暴露出来,从而导致程序很容易被破解,损害软件开发者的利益。因此有人把这部分核心代码,采用VC或Dephi进行重写,并编译为dll的方式给pb的程序调用,以免注册部分的代码被反编译,以防止软件被破解,而不是采用PBNI的方式,其实这样做也是不安全的。下面将通过实例,演示采用dll来进行软件注册控制的不安全性。
      
首先,使用vc6开发一个TestA的动态连接库工程,这个库文件包含两个函数,CheckKeyAdd, CheckKey用于判断输入的字符串,是否等于12345678,相等则返回TRUE,否则返回False, Add函数用于返回两个数相加的结果。代码很简单,如下: 

BOOL WINAPI CheckKey(LPCSTR key)
{
    
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 boolean CheckKey(string key) Library "TestA.dll"
Function 
int Add(int a ,int b ) Library "TestA.dll"

      
     在窗口中增加两个按扭,分别为CheckKeyAdd,其中CheckKey按扭的代码如下:   

Code

      Add按钮的代码如下:

MessageBox('Add计算',"100+30="+string(Add(100,30))) 

运行程序,点击CheckKey按钮,弹出下面两个窗口

   

 点击Add按钮,弹出下面窗口 

 

        从以后代码的执行情况看,TestA.DLL的功能被正确调用

 

下面,我们用pbkiller反编译这个应用生成后的pbd文件,查看w_main窗口的代码,我们可以清楚的看到TestA.dll这个库文件的函数定义,包括函数名称和参数列表。在取得这些信息之后,我们就可以写一个dll文件,来绕开CheckKey这个函数,让其总是返回TRUE,这样就使得注册验证失效了。

 

 

还是使用VC6 新建一个TestB的动态连接库的工程,在工程里面增加以下两个函数,其中CheckKey不做任何校验处理,直接返回TRUE,Add函数则调用原来TestA(改名为MyTestA.dll)库文件的函数。


Code

编译这个dll,然后把原来pb程序目录下的testA.dll文件改名为MyTestA.dll,然后把TestB.dll文件拷到pb程序目录下,并更名为TestA.dll。
      运行程序,点击
CheckKey按钮后,弹出以下窗口

 
            点击
Add按钮后,弹出以下窗口

 

 



从上面的程序执行情况看,CheckKey功能已经失效,Add功能与原来的效果一样。
     但如果DLL文件中不公开CheckKey函数,而是在调用Add函数的时候,调用CheckKey,则就没办法绕开了.
      

posted @ 2009-07-25 06:23  黄国酬  阅读(3641)  评论(2编辑  收藏  举报