用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按扭的代码如下:
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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按钮,弹出下面窗口
![](http://images.cnblogs.com/cnblogs_com/huanggc/pbni/Add.JPG)
从以后代码的执行情况看,
TestA.DLL的功能被正确调用
下面,我们用pbkiller反编译这个应用生成后的pbd文件,查看w_main窗口的代码,我们可以清楚的看到TestA.dll这个库文件的函数定义,包括函数名称和参数列表。在取得这些信息之后,我们就可以写一个dll文件,来绕开CheckKey这个函数,让其总是返回TRUE,这样就使得注册验证失效了。
![](http://images.cnblogs.com/cnblogs_com/huanggc/pbni/pbkiller.JPG)
还是使用VC6 新建一个TestB的动态连接库的工程,在工程里面增加以下两个函数,其中CheckKey不做任何校验处理,直接返回TRUE,Add函数则调用原来TestA(改名为MyTestA.dll)库文件的函数。
dll,然后把原来pb程序目录下的testA.dll文件改名为MyTestA.dll,然后把TestB.dll文件拷到pb程序目录下,并更名为TestA.dll。
运行程序,点击CheckKey按钮后,弹出以下窗口
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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;
}
编译这个
![](http://images.cnblogs.com/cnblogs_com/huanggc/pbni/TestB_CheckKey_1.JPG)
![](http://images.cnblogs.com/cnblogs_com/huanggc/pbni/TestB_CheckKey_2.JPG)
点击Add按钮后,弹出以下窗口
CheckKey功能已经失效,Add功能与原来的效果一样。
但如果DLL文件中不公开CheckKey函数,而是在调用Add函数的时候,调用CheckKey,则就没办法绕开了.
![](http://images.cnblogs.com/cnblogs_com/huanggc/pbni/Add.JPG)
从上面的程序执行情况看,
![](http://images.cnblogs.com/cnblogs_com/huanggc/pbni/TestA_CheckKey_1.JPG)
首先,使用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按扭的代码如下:
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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按钮后,弹出以下窗口
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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,则就没办法绕开了.
从上面的程序执行情况看,
相关文章推荐
- 用PBNI实现软件注册授权控制(二)
- 用PBNI实现软件注册授权控制(一)
- 用PBNI实现软件注册授权控制(二)
- 如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作
- 如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作
- 如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作
- 软件注册的实现 delphi 源码
- 通过网页去实现远程控制软件的上线!博客,贴吧,云盘等等网页方式实现上线原理解析,绕过域名拦截
- 小白虎远程控制软件实现分组上线的设计!
- Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制
- python实现软件的注册功能(机器码+注册码机制)
- 认证鉴权与API权限控制在微服务架构中的设计与实现:授权码模式
- C#实现软件注册
- 远程控制软件VNC教程和对内网机器控制的实现
- 用加密狗控制软件的授权(C#)
- 在VC中怎样实现软件的注册机制
- 基于授权和角色的访问控制的设计和实现(二)
- 基于.net的五自由度机械手控制软件的设计与实现
- 侠诺千兆多WAN网吧路由器,实现带宽管理,流量控制,限制所需要的P2P软件