您的位置:首页 > 其它

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

2010-12-23 18:52 309 查看
自从PB的程序可以被pbkiller和shudepb反编译以来,程序的安全性,软件的注册授权控制就存在很大的风险,这些核心代码被轻易的暴露出来,从而导致程序很容易被破解,损害软件开发者的利益。因此有人把这部分核心代码,采用VC或Dephi进行重写,并编译为dll的方式给pb的程序调用,以免注册部分的代码被反编译,以防止软件被破解,而不是采用PBNI的方式,其实这样做也是不安全的。下面将通过实例,演示采用dll来进行软件注册控制的不安全性。
首先,使用vc6开发一个TestA的动态连接库工程,这个库文件包含两个函数,CheckKey和Add, 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"

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




Code
IF CheckKey("12345678") Then
MessageBox("提示1","注册码12345678正确!")
ELSE
MessageBox("提示1","注册码12345678错误!")
END IF

IF CheckKey("abcdefg") Then
MessageBox("提示2","注册码abcdefg正确!")
ELSE
MessageBox("提示2","注册码abcdefg错误!")
END IF

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)库文件的函数。

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




Code
typedef int (WINAPI* PFN_Add)(int a, int b);

BOOL WINAPI CheckKey(LPCSTR key)
{
//什么都不做,直接返回TRUE
return TRUE;
}

int WINAPI Add(int a ,int b)
{
int result=0;
HMODULE hMoudle=LoadLibrary("MyTestA.dll");
if(hMoudle)
{
PFN_Add fnAdd=(PFN_Add)GetProcAddress(hMoudle, "Add");
if(fnAdd)
{
result =fnAdd(a,b); //直接调用原来TestA Dll文件的Add函数
}
FreeLibrary(hMoudle);
}

return result;
}

编译这个





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

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



从上面的程序执行情况看,



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: